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:
David Chisnall 2012-02-17 16:32:07 +00:00
parent 50f603fff6
commit 637b25a6a0
2 changed files with 26 additions and 27 deletions

View File

@ -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

View File

@ -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());
}