From 8bb51ef6d2a396715f1dbc6edc1599892779e4d6 Mon Sep 17 00:00:00 2001 From: David Chisnall Date: Fri, 17 Feb 2012 16:51:02 +0000 Subject: [PATCH] Revert r150814. It turns out that there is a good reason for this after all... git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@150818 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCObjectFileInfo.h | 5 ++++ lib/MC/MCObjectFileInfo.cpp | 48 ++++++++++++++---------------- 2 files changed, 27 insertions(+), 26 deletions(-) diff --git a/include/llvm/MC/MCObjectFileInfo.h b/include/llvm/MC/MCObjectFileInfo.h index 7525f003fb0..e58e7d68f7f 100644 --- a/include/llvm/MC/MCObjectFileInfo.h +++ b/include/llvm/MC/MCObjectFileInfo.h @@ -284,6 +284,8 @@ public: const MCSection *getXDataSection() const { return XDataSection; } const MCSection *getEHFrameSection() { + if (!EHFrameSection) + InitEHFrameSection(); return EHFrameSection; } @@ -298,6 +300,9 @@ private: void InitELFMCObjectFileInfo(Triple T); void InitCOFFMCObjectFileInfo(Triple T); + /// InitEHFrameSection - Initialize EHFrameSection on demand. + /// + void InitEHFrameSection(); }; } // end namespace llvm diff --git a/lib/MC/MCObjectFileInfo.cpp b/lib/MC/MCObjectFileInfo.cpp index 3c3b50c1349..1b8653531e8 100644 --- a/lib/MC/MCObjectFileInfo.cpp +++ b/lib/MC/MCObjectFileInfo.cpp @@ -142,14 +142,6 @@ 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()); @@ -347,17 +339,6 @@ 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 @@ -434,13 +415,6 @@ 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 @@ -573,3 +547,25 @@ 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()); +}