Revert "Simplify the creation of .eh_frame/.debug_frame sections."
authorRafael Espindola <rafael.espindola@gmail.com>
Fri, 6 Nov 2015 14:51:09 +0000 (14:51 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Fri, 6 Nov 2015 14:51:09 +0000 (14:51 +0000)
This reverts commit r252305.

Investigating a test failure.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@252306 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCObjectFileInfo.h
lib/MC/MCObjectFileInfo.cpp

index 6e325cc21f23d2c739725c215d1860dabc169287..ec8627ca7c124c9f6b0d57267ce3f96ba8362ff7 100644 (file)
@@ -47,6 +47,10 @@ 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;
 
@@ -332,6 +336,8 @@ public:
   MCSection *getSXDataSection() const { return SXDataSection; }
 
   MCSection *getEHFrameSection() {
+    if (!EHFrameSection)
+      InitEHFrameSection();
     return EHFrameSection;
   }
 
@@ -351,6 +357,9 @@ private:
   void initELFMCObjectFileInfo(Triple T);
   void initCOFFMCObjectFileInfo(Triple T);
 
+  /// Initialize EHFrameSection on demand.
+  void InitEHFrameSection();
+
 public:
   const Triple &getTargetTriple() const { return TT; }
 };
index 253564e6d4979391813bc850ee7356912367cbab..8849f5d4d122776bfce1aef8ab72a4bbe80aab8c 100644 (file)
@@ -49,12 +49,6 @@ 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;
 
@@ -422,13 +416,12 @@ void MCObjectFileInfo::initELFMCObjectFileInfo(Triple T) {
     break;
   }
 
-  unsigned EHSectionType = T.getArch() == Triple::x86_64
-                               ? ELF::SHT_X86_64_UNWIND
-                               : ELF::SHT_PROGBITS;
+  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.
-  unsigned EHSectionFlags = ELF::SHF_ALLOC;
+  EHSectionFlags = ELF::SHF_ALLOC;
   if (T.isOSSolaris() && T.getArch() != Triple::x86_64)
     EHSectionFlags |= ELF::SHF_WRITE;
 
@@ -553,17 +546,9 @@ 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;
@@ -837,3 +822,24 @@ 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());
+}