diff options
author | David Chisnall <csdavec@swan.ac.uk> | 2012-02-17 16:32:07 +0000 |
---|---|---|
committer | David Chisnall <csdavec@swan.ac.uk> | 2012-02-17 16:32:07 +0000 |
commit | 38e25ab513e8f0957306b42d64c5e764f746f99a (patch) | |
tree | a6921db25c14f1d20c6ac09805404a8dc4baad63 /llvm/lib/MC/MCObjectFileInfo.cpp | |
parent | 368d460d3571c557b573270549afc09645c1b7a9 (diff) | |
download | bcm5719-llvm-38e25ab513e8f0957306b42d64c5e764f746f99a.tar.gz bcm5719-llvm-38e25ab513e8f0957306b42d64c5e764f746f99a.zip |
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).
llvm-svn: 150814
Diffstat (limited to 'llvm/lib/MC/MCObjectFileInfo.cpp')
-rw-r--r-- | llvm/lib/MC/MCObjectFileInfo.cpp | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/llvm/lib/MC/MCObjectFileInfo.cpp b/llvm/lib/MC/MCObjectFileInfo.cpp index 1b8653531e8..3c3b50c1349 100644 --- a/llvm/lib/MC/MCObjectFileInfo.cpp +++ b/llvm/lib/MC/MCObjectFileInfo.cpp @@ -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()); -} |