mirror of
https://github.com/RPCS3/llvm.git
synced 2026-07-19 15:13:49 -04:00
[MC] Move EH DWARF encodings from MC to CodeGen, NFC
Summary: The TType encoding, LSDA encoding, and personality encoding are all passed explicitly by CodeGen to the assembler through .cfi_* directives, so only the AsmPrinter needs to know about them. The FDE CFI encoding however, controls the encoding of the label implicitly created by the .cfi_startproc directive. That directive seems to be special in that it doesn't take an encoding, so the assembler just has to know how to encode one DSO-local label reference from .eh_frame to .text. As a result, it looks like MC will continue to have to know when the large code model is in use. Perhaps we could invent a '.cfi_startproc [large]' flag so that this knowledge doesn't need to pollute the assembler. Reviewers: davide, lliu0, JDevlieghere Subscribers: hiraditya, fedor.sergeev, llvm-commits Differential Revision: https://reviews.llvm.org/D50533 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@339397 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
+5
-157
@@ -63,11 +63,7 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(const Triple &T) {
|
||||
if (T.isWatchABI())
|
||||
OmitDwarfIfHaveCompactUnwind = true;
|
||||
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel
|
||||
| dwarf::DW_EH_PE_sdata4;
|
||||
LSDAEncoding = FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
FDECFIEncoding = dwarf::DW_EH_PE_pcrel;
|
||||
|
||||
// .comm doesn't support alignment before Leopard.
|
||||
if (T.isMacOSX() && T.isMacOSXVersionLT(10, 5))
|
||||
@@ -311,161 +307,14 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(const Triple &T, bool Large) {
|
||||
case Triple::bpfeb:
|
||||
FDECFIEncoding = dwarf::DW_EH_PE_sdata8;
|
||||
break;
|
||||
case Triple::hexagon:
|
||||
FDECFIEncoding =
|
||||
PositionIndependent ? dwarf::DW_EH_PE_pcrel : dwarf::DW_EH_PE_absptr;
|
||||
default:
|
||||
FDECFIEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
break;
|
||||
}
|
||||
|
||||
switch (T.getArch()) {
|
||||
case Triple::arm:
|
||||
case Triple::armeb:
|
||||
case Triple::thumb:
|
||||
case Triple::thumbeb:
|
||||
if (Ctx->getAsmInfo()->getExceptionHandlingType() == ExceptionHandling::ARM)
|
||||
break;
|
||||
// Fallthrough if not using EHABI
|
||||
LLVM_FALLTHROUGH;
|
||||
case Triple::ppc:
|
||||
case Triple::x86:
|
||||
PersonalityEncoding = PositionIndependent
|
||||
? dwarf::DW_EH_PE_indirect |
|
||||
dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4
|
||||
: dwarf::DW_EH_PE_absptr;
|
||||
LSDAEncoding = PositionIndependent
|
||||
? dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4
|
||||
: dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = PositionIndependent
|
||||
? dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4
|
||||
: dwarf::DW_EH_PE_absptr;
|
||||
break;
|
||||
case Triple::x86_64:
|
||||
if (PositionIndependent) {
|
||||
PersonalityEncoding =
|
||||
dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel |
|
||||
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
(Large ? dwarf::DW_EH_PE_sdata8 : dwarf::DW_EH_PE_sdata4);
|
||||
} else {
|
||||
PersonalityEncoding =
|
||||
Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
|
||||
LSDAEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
|
||||
TTypeEncoding = Large ? dwarf::DW_EH_PE_absptr : dwarf::DW_EH_PE_udata4;
|
||||
}
|
||||
break;
|
||||
case Triple::hexagon:
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_absptr;
|
||||
FDECFIEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
if (PositionIndependent) {
|
||||
PersonalityEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
|
||||
LSDAEncoding |= dwarf::DW_EH_PE_pcrel;
|
||||
FDECFIEncoding |= dwarf::DW_EH_PE_pcrel;
|
||||
TTypeEncoding |= dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel;
|
||||
}
|
||||
break;
|
||||
case Triple::aarch64:
|
||||
case Triple::aarch64_be:
|
||||
// The small model guarantees static code/data size < 4GB, but not where it
|
||||
// will be in memory. Most of these could end up >2GB away so even a signed
|
||||
// pc-relative 32-bit address is insufficient, theoretically.
|
||||
if (PositionIndependent) {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata8;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata8;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata8;
|
||||
} else {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
}
|
||||
break;
|
||||
case Triple::lanai:
|
||||
LSDAEncoding = dwarf::DW_EH_PE_absptr;
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
break;
|
||||
case Triple::mips:
|
||||
case Triple::mipsel:
|
||||
case Triple::mips64:
|
||||
case Triple::mips64el:
|
||||
// MIPS uses indirect pointer to refer personality functions and types, so
|
||||
// that the eh_frame section can be read-only. DW.ref.personality will be
|
||||
// generated for relocation.
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect;
|
||||
// FIXME: The N64 ABI probably ought to use DW_EH_PE_sdata8 but we can't
|
||||
// identify N64 from just a triple.
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
// We don't support PC-relative LSDA references in GAS so we use the default
|
||||
// DW_EH_PE_absptr for those.
|
||||
|
||||
// FreeBSD must be explicit about the data size and using pcrel since it's
|
||||
// assembler/linker won't do the automatic conversion that the Linux tools
|
||||
// do.
|
||||
if (T.isOSFreeBSD()) {
|
||||
PersonalityEncoding |= dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
}
|
||||
break;
|
||||
case Triple::ppc64:
|
||||
case Triple::ppc64le:
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_udata8;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_udata8;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_udata8;
|
||||
break;
|
||||
case Triple::sparcel:
|
||||
case Triple::sparc:
|
||||
if (PositionIndependent) {
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
} else {
|
||||
LSDAEncoding = dwarf::DW_EH_PE_absptr;
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
}
|
||||
break;
|
||||
case Triple::sparcv9:
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
if (PositionIndependent) {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
} else {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
}
|
||||
break;
|
||||
case Triple::systemz:
|
||||
// All currently-defined code models guarantee that 4-byte PC-relative
|
||||
// values will be in range.
|
||||
if (PositionIndependent) {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_pcrel | dwarf::DW_EH_PE_sdata4;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_indirect | dwarf::DW_EH_PE_pcrel |
|
||||
dwarf::DW_EH_PE_sdata4;
|
||||
} else {
|
||||
PersonalityEncoding = dwarf::DW_EH_PE_absptr;
|
||||
LSDAEncoding = dwarf::DW_EH_PE_absptr;
|
||||
TTypeEncoding = dwarf::DW_EH_PE_absptr;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
unsigned EHSectionType = T.getArch() == Triple::x86_64
|
||||
? ELF::SHT_X86_64_UNWIND
|
||||
: ELF::SHT_PROGBITS;
|
||||
@@ -908,8 +757,7 @@ void MCObjectFileInfo::InitMCObjectFileInfo(const Triple &TheTriple, bool PIC,
|
||||
SupportsCompactUnwindWithoutEHFrame = false;
|
||||
OmitDwarfIfHaveCompactUnwind = false;
|
||||
|
||||
PersonalityEncoding = LSDAEncoding = FDECFIEncoding = TTypeEncoding =
|
||||
dwarf::DW_EH_PE_absptr;
|
||||
FDECFIEncoding = dwarf::DW_EH_PE_absptr;
|
||||
|
||||
CompactUnwindDwarfEHFrameOnly = 0;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user