mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-23 03:02:36 +01:00
Simplify the creation of .eh_frame/.debug_frame sections.
llvm-svn: 252305
This commit is contained in:
parent
654fc11285
commit
43062a30b0
@ -47,10 +47,6 @@ protected:
|
||||
unsigned FDECFIEncoding;
|
||||
unsigned TTypeEncoding;
|
||||
|
||||
/// Section flags for eh_frame
|
||||
unsigned EHSectionType;
|
||||
unsigned EHSectionFlags;
|
||||
|
||||
/// Compact unwind encoding indicating that we should emit only an EH frame.
|
||||
unsigned CompactUnwindDwarfEHFrameOnly;
|
||||
|
||||
@ -336,8 +332,6 @@ public:
|
||||
MCSection *getSXDataSection() const { return SXDataSection; }
|
||||
|
||||
MCSection *getEHFrameSection() {
|
||||
if (!EHFrameSection)
|
||||
InitEHFrameSection();
|
||||
return EHFrameSection;
|
||||
}
|
||||
|
||||
@ -357,9 +351,6 @@ private:
|
||||
void initELFMCObjectFileInfo(Triple T);
|
||||
void initCOFFMCObjectFileInfo(Triple T);
|
||||
|
||||
/// Initialize EHFrameSection on demand.
|
||||
void InitEHFrameSection();
|
||||
|
||||
public:
|
||||
const Triple &getTargetTriple() const { return TT; }
|
||||
};
|
||||
|
@ -49,6 +49,12 @@ void MCObjectFileInfo::initMachOMCObjectFileInfo(Triple T) {
|
||||
// MachO
|
||||
SupportsWeakOmittedEHFrame = false;
|
||||
|
||||
EHFrameSection = Ctx->getMachOSection(
|
||||
"__TEXT", "__eh_frame",
|
||||
MachO::S_COALESCED | MachO::S_ATTR_NO_TOC |
|
||||
MachO::S_ATTR_STRIP_STATIC_SYMS | MachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
if (T.isOSDarwin() && T.getArch() == Triple::aarch64)
|
||||
SupportsCompactUnwindWithoutEHFrame = true;
|
||||
|
||||
@ -416,12 +422,13 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) {
|
||||
break;
|
||||
}
|
||||
|
||||
EHSectionType = T.getArch() == Triple::x86_64 ? ELF::SHT_X86_64_UNWIND
|
||||
: ELF::SHT_PROGBITS;
|
||||
unsigned EHSectionType = T.getArch() == Triple::x86_64
|
||||
? ELF::SHT_X86_64_UNWIND
|
||||
: ELF::SHT_PROGBITS;
|
||||
|
||||
// Solaris requires different flags for .eh_frame to seemingly every other
|
||||
// platform.
|
||||
EHSectionFlags = ELF::SHF_ALLOC;
|
||||
unsigned EHSectionFlags = ELF::SHF_ALLOC;
|
||||
if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
|
||||
EHSectionFlags |= ELF::SHF_WRITE;
|
||||
|
||||
@ -546,9 +553,17 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) {
|
||||
|
||||
FaultMapSection =
|
||||
Ctx->getELFSection(".llvm_faultmaps", ELF::SHT_PROGBITS, ELF::SHF_ALLOC);
|
||||
|
||||
EHFrameSection =
|
||||
Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::initCOFFMCObjectFileInfo(Triple T) {
|
||||
EHFrameSection = Ctx->getCOFFSection(
|
||||
".eh_frame", COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ | COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
bool IsWoA = T.getArch() == Triple::arm || T.getArch() == Triple::thumb;
|
||||
|
||||
CommDirectiveSupportsAlignment = true;
|
||||
@ -822,24 +837,3 @@ MCSection *MCObjectFileInfo::getDwarfTypesSection(uint64_t Hash) const {
|
||||
return Ctx->getELFSection(".debug_types", ELF::SHT_PROGBITS, ELF::SHF_GROUP,
|
||||
0, utostr(Hash));
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::InitEHFrameSection() {
|
||||
if (Env == IsMachO)
|
||||
EHFrameSection =
|
||||
Ctx->getMachOSection("__TEXT", "__eh_frame",
|
||||
MachO::S_COALESCED |
|
||||
MachO::S_ATTR_NO_TOC |
|
||||
MachO::S_ATTR_STRIP_STATIC_SYMS |
|
||||
MachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
else if (Env == IsELF)
|
||||
EHFrameSection =
|
||||
Ctx->getELFSection(".eh_frame", EHSectionType, EHSectionFlags);
|
||||
else
|
||||
EHFrameSection =
|
||||
Ctx->getCOFFSection(".eh_frame",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user