OSDN Git Service

Store the sh_link of ARM_EXIDX directly in MCSectionELF.
authorRafael Espindola <rafael.espindola@gmail.com>
Mon, 6 Apr 2015 04:25:18 +0000 (04:25 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Mon, 6 Apr 2015 04:25:18 +0000 (04:25 +0000)
This avoids some pretty horrible and broken name based section handling.

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

include/llvm/MC/MCContext.h
lib/MC/ELFObjectWriter.cpp
lib/MC/MCContext.cpp
lib/Target/ARM/MCTargetDesc/ARMELFStreamer.cpp
test/MC/ARM/eh-link.s [new file with mode: 0644]

index d6d6c25..8ac2047 100644 (file)
@@ -334,6 +334,12 @@ namespace llvm {
                                       StringRef Group, unsigned UniqueID,
                                       const char *BeginSymName);
 
+    const MCSectionELF *getELFSection(StringRef Section, unsigned Type,
+                                      unsigned Flags, unsigned EntrySize,
+                                      const MCSymbol *Group, unsigned UniqueID,
+                                      const char *BeginSymName,
+                                      const MCSectionELF *Associated);
+
     const MCSectionELF *createELFRelSection(StringRef Name, unsigned Type,
                                             unsigned Flags, unsigned EntrySize,
                                             const MCSymbol *Group,
index 807a2ce..2004b1b 100644 (file)
@@ -1546,19 +1546,8 @@ void ELFObjectWriter::writeSection(MCAssembler &Asm,
   }
 
   if (TargetObjectWriter->getEMachine() == ELF::EM_ARM &&
-      Section.getType() == ELF::SHT_ARM_EXIDX) {
-    StringRef SecName(Section.getSectionName());
-    if (SecName == ".ARM.exidx") {
-      sh_link = SectionIndexMap.lookup(Asm.getContext().getELFSection(
-          ".text", ELF::SHT_PROGBITS, ELF::SHF_EXECINSTR | ELF::SHF_ALLOC));
-    } else if (SecName.startswith(".ARM.exidx")) {
-      StringRef GroupName =
-          Section.getGroup() ? Section.getGroup()->getName() : "";
-      sh_link = SectionIndexMap.lookup(Asm.getContext().getELFSection(
-          SecName.substr(sizeof(".ARM.exidx") - 1), ELF::SHT_PROGBITS,
-          ELF::SHF_EXECINSTR | ELF::SHF_ALLOC, 0, GroupName));
-    }
-  }
+      Section.getType() == ELF::SHT_ARM_EXIDX)
+    sh_link = SectionIndexMap.lookup(Section.getAssociatedSection());
 
   WriteSecHdrEntry(ShStrTabBuilder.getOffset(Section.getSectionName()),
                    Section.getType(),
index 211f164..5f8e3c1 100644 (file)
@@ -295,11 +295,22 @@ const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
                                              StringRef Group, unsigned UniqueID,
                                              const char *BeginSymName) {
   MCSymbol *GroupSym = nullptr;
-  if (!Group.empty()) {
+  if (!Group.empty())
     GroupSym = GetOrCreateSymbol(Group);
-    Group = GroupSym->getName();
-  }
 
+  return getELFSection(Section, Type, Flags, EntrySize, GroupSym, UniqueID,
+                       BeginSymName, nullptr);
+}
+
+const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
+                                             unsigned Flags, unsigned EntrySize,
+                                             const MCSymbol *GroupSym,
+                                             unsigned UniqueID,
+                                             const char *BeginSymName,
+                                             const MCSectionELF *Associated) {
+  StringRef Group = "";
+  if (GroupSym)
+    Group = GroupSym->getName();
   // Do the lookup, if we have a hit, return it.
   auto IterBool = ELFUniquingMap.insert(
       std::make_pair(ELFSectionKey{Section, Group, UniqueID}, nullptr));
@@ -321,7 +332,7 @@ const MCSectionELF *MCContext::getELFSection(StringRef Section, unsigned Type,
 
   MCSectionELF *Result =
       new (*this) MCSectionELF(CachedName, Type, Flags, Kind, EntrySize,
-                               GroupSym, UniqueID, Begin, nullptr);
+                               GroupSym, UniqueID, Begin, Associated);
   Entry.second = Result;
   return Result;
 }
index 9648ffa..b116cb8 100644 (file)
@@ -1083,14 +1083,13 @@ inline void ARMELFStreamer::SwitchToEHSection(const char *Prefix,
   }
 
   // Get .ARM.extab or .ARM.exidx section
-  const MCSectionELF *EHSection = nullptr;
-  if (const MCSymbol *Group = FnSection.getGroup()) {
-    EHSection =
-        getContext().getELFSection(EHSecName, Type, Flags | ELF::SHF_GROUP,
-                                   FnSection.getEntrySize(), Group->getName());
-  } else {
-    EHSection = getContext().getELFSection(EHSecName, Type, Flags);
-  }
+  const MCSymbol *Group = FnSection.getGroup();
+  if (Group)
+    Flags |= ELF::SHF_GROUP;
+  const MCSectionELF *EHSection =
+      getContext().getELFSection(EHSecName, Type, Flags, 0, Group,
+                                 FnSection.getUniqueID(), nullptr, &FnSection);
+
   assert(EHSection && "Failed to get the required EH section");
 
   // Switch to .ARM.extab or .ARM.exidx section
diff --git a/test/MC/ARM/eh-link.s b/test/MC/ARM/eh-link.s
new file mode 100644 (file)
index 0000000..b7bed61
--- /dev/null
@@ -0,0 +1,90 @@
+@ RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o - \
+@ RUN:   | llvm-readobj -s  | FileCheck %s
+
+@ Test that the ARM_EXIDX sections point (Link) to the corresponding text
+@ sections.
+
+@ FIXME: The section numbers are not important. If llvm-readobj printed the
+@ name first we could use a FileCheck variable.
+
+@ CHECK:      Section {
+@ CHECK:        Index: 6
+@ CHECK-NEXT:   Name: .text
+@ CHECK-NEXT:   Type: SHT_PROGBITS
+@ CHECK-NEXT:   Flags [
+@ CHECK-NEXT:     SHF_ALLOC
+@ CHECK-NEXT:     SHF_EXECINSTR
+@ CHECK-NEXT:     SHF_GROUP
+@ CHECK-NEXT:   ]
+@ CHECK-NEXT:   Address: 0x0
+@ CHECK-NEXT:   Offset: 0x54
+@ CHECK-NEXT:   Size: 4
+@ CHECK-NEXT:   Link: 0
+@ CHECK-NEXT:   Info: 0
+@ CHECK-NEXT:   AddressAlignment: 1
+@ CHECK-NEXT:   EntrySize: 0
+@ CHECK-NEXT: }
+@ CHECK-NEXT: Section {
+@ CHECK-NEXT:   Index: 7
+@ CHECK-NEXT:   Name: .ARM.exidx
+@ CHECK-NEXT:   Type: SHT_ARM_EXIDX
+@ CHECK-NEXT:   Flags [
+@ CHECK-NEXT:     SHF_ALLOC
+@ CHECK-NEXT:     SHF_GROUP
+@ CHECK-NEXT:     SHF_LINK_ORDER
+@ CHECK-NEXT:   ]
+@ CHECK-NEXT:   Address: 0x0
+@ CHECK-NEXT:   Offset: 0x58
+@ CHECK-NEXT:   Size: 8
+@ CHECK-NEXT:   Link: 6
+@ CHECK-NEXT:   Info: 0
+@ CHECK-NEXT:   AddressAlignment: 4
+@ CHECK-NEXT:   EntrySize: 0
+@ CHECK-NEXT: }
+
+@ CHECK:      Section {
+@ CHECK:        Index: 9
+@ CHECK-NEXT:   Name: .text
+@ CHECK-NEXT:   Type: SHT_PROGBITS
+@ CHECK-NEXT:   Flags [
+@ CHECK-NEXT:     SHF_ALLOC
+@ CHECK-NEXT:     SHF_EXECINSTR
+@ CHECK-NEXT:     SHF_GROUP
+@ CHECK-NEXT:   ]
+@ CHECK-NEXT:   Address: 0x0
+@ CHECK-NEXT:   Offset: 0x60
+@ CHECK-NEXT:   Size: 4
+@ CHECK-NEXT:   Link: 0
+@ CHECK-NEXT:   Info: 0
+@ CHECK-NEXT:   AddressAlignment: 1
+@ CHECK-NEXT:   EntrySize: 0
+@ CHECK-NEXT: }
+@ CHECK-NEXT: Section {
+@ CHECK-NEXT:   Index: 10
+@ CHECK-NEXT:   Name: .ARM.exidx
+@ CHECK-NEXT:   Type: SHT_ARM_EXIDX
+@ CHECK-NEXT:   Flags [
+@ CHECK-NEXT:     SHF_ALLOC
+@ CHECK-NEXT:     SHF_GROUP
+@ CHECK-NEXT:     SHF_LINK_ORDER
+@ CHECK-NEXT:   ]
+@ CHECK-NEXT:   Address: 0x0
+@ CHECK-NEXT:   Offset: 0x64
+@ CHECK-NEXT:   Size: 8
+@ CHECK-NEXT:   Link: 9
+@ CHECK-NEXT:   Info: 0
+@ CHECK-NEXT:   AddressAlignment: 4
+@ CHECK-NEXT:   EntrySize: 0
+@ CHECK-NEXT: }
+
+       .section        .text,"axG",%progbits,f,comdat
+f:
+       .fnstart
+       mov     pc, lr
+       .fnend
+
+       .section        .text,"axG",%progbits,g,comdat
+g:
+       .fnstart
+       mov     pc, lr
+       .fnend