mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-04 18:06:49 +00:00
Don't lazily allocate eh_frame. We're not lazily allocating things like the LSDA, which are only used when the eh frame is used, so this lazy allocation doesn't really make sense.
Fix the type of eh_frame on Solaris so that Sun ld doesn't fail to combine them (thus making it impossible for the unwind library to find them and breaking exceptions). git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150814 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
50f603fff6
commit
637b25a6a0
@ -284,8 +284,6 @@ public:
|
||||
const MCSection *getXDataSection() const { return XDataSection; }
|
||||
|
||||
const MCSection *getEHFrameSection() {
|
||||
if (!EHFrameSection)
|
||||
InitEHFrameSection();
|
||||
return EHFrameSection;
|
||||
}
|
||||
|
||||
@ -300,9 +298,6 @@ private:
|
||||
void InitELFMCObjectFileInfo(Triple T);
|
||||
void InitCOFFMCObjectFileInfo(Triple T);
|
||||
|
||||
/// InitEHFrameSection - Initialize EHFrameSection on demand.
|
||||
///
|
||||
void InitEHFrameSection();
|
||||
};
|
||||
|
||||
} // end namespace llvm
|
||||
|
@ -142,6 +142,14 @@ void MCObjectFileInfo::InitMachOMCObjectFileInfo(Triple T) {
|
||||
}
|
||||
|
||||
// Exception Handling.
|
||||
EHFrameSection =
|
||||
Ctx->getMachOSection("__TEXT", "__eh_frame",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_NO_TOC |
|
||||
MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
|
||||
MCSectionMachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
|
||||
LSDASection = Ctx->getMachOSection("__TEXT", "__gcc_except_tab", 0,
|
||||
SectionKind::getReadOnlyWithRel());
|
||||
|
||||
@ -339,6 +347,17 @@ void MCObjectFileInfo::InitELFMCObjectFileInfo(Triple T) {
|
||||
|
||||
// Exception Handling Sections.
|
||||
|
||||
// Solaris requires different flags for .eh_frame to seemingly every other
|
||||
// platform.
|
||||
unsigned EHSectionFlags = ELF::SHF_ALLOC;
|
||||
if (T.getOS() == Triple::Solaris)
|
||||
EHSectionFlags |= ELF::SHF_WRITE;
|
||||
|
||||
EHFrameSection =
|
||||
Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS,
|
||||
EHSectionFlags,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on ELF, even though
|
||||
// it contains relocatable pointers. In PIC mode, this is probably a big
|
||||
// runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
@ -415,6 +434,13 @@ void MCObjectFileInfo::InitCOFFMCObjectFileInfo(Triple T) {
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
EHFrameSection =
|
||||
Ctx->getCOFFSection(".eh_frame",
|
||||
COFF::IMAGE_SCN_CNT_INITIALIZED_DATA |
|
||||
COFF::IMAGE_SCN_MEM_READ |
|
||||
COFF::IMAGE_SCN_MEM_WRITE,
|
||||
SectionKind::getDataRel());
|
||||
|
||||
// FIXME: We're emitting LSDA info into a readonly section on COFF, even
|
||||
// though it contains relocatable pointers. In PIC mode, this is probably a
|
||||
// big runtime hit for C++ apps. Either the contents of the LSDA need to be
|
||||
@ -547,25 +573,3 @@ void MCObjectFileInfo::InitMCObjectFileInfo(StringRef TT, Reloc::Model relocm,
|
||||
}
|
||||
}
|
||||
|
||||
void MCObjectFileInfo::InitEHFrameSection() {
|
||||
if (Env == IsMachO)
|
||||
EHFrameSection =
|
||||
Ctx->getMachOSection("__TEXT", "__eh_frame",
|
||||
MCSectionMachO::S_COALESCED |
|
||||
MCSectionMachO::S_ATTR_NO_TOC |
|
||||
MCSectionMachO::S_ATTR_STRIP_STATIC_SYMS |
|
||||
MCSectionMachO::S_ATTR_LIVE_SUPPORT,
|
||||
SectionKind::getReadOnly());
|
||||
else if (Env == IsELF)
|
||||
EHFrameSection =
|
||||
Ctx->getELFSection(".eh_frame", ELF::SHT_PROGBITS,
|
||||
ELF::SHF_ALLOC,
|
||||
SectionKind::getDataRel());
|
||||
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