[lld] r244911 - Take name, type and flags in consideration when concatenating sections.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Thu Aug 13 10:04:51 PDT 2015


Author: rafael
Date: Thu Aug 13 12:04:50 2015
New Revision: 244911

URL: http://llvm.org/viewvc/llvm-project?rev=244911&view=rev
Log:
Take name, type and flags in consideration when concatenating sections.

This is mandated by the ELF spec.

Modified:
    lld/trunk/ELF/Writer.cpp
    lld/trunk/test/elf2/string-table.s

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=244911&r1=244910&r2=244911&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Thu Aug 13 12:04:50 2015
@@ -63,6 +63,7 @@ private:
 template <class ELFT> class Writer {
 public:
   typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
+  typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
   Writer(SymbolTable *T) : Symtab(T) {}
   void run();
 
@@ -140,13 +141,44 @@ template <class ELFT> void OutputSection
   *SHdr = Header;
 }
 
+namespace {
+template <bool Is64Bits> struct SectionKey {
+  typedef typename std::conditional<Is64Bits, uint64_t, uint32_t>::type uintX_t;
+  StringRef Name;
+  uint32_t sh_type;
+  uintX_t sh_flags;
+};
+}
+namespace llvm {
+template <bool Is64Bits> struct DenseMapInfo<SectionKey<Is64Bits>> {
+  static SectionKey<Is64Bits> getEmptyKey() {
+    return SectionKey<Is64Bits>{DenseMapInfo<StringRef>::getEmptyKey(), 0, 0};
+  }
+  static SectionKey<Is64Bits> getTombstoneKey() {
+    return SectionKey<Is64Bits>{DenseMapInfo<StringRef>::getTombstoneKey(), 0,
+                                0};
+  }
+  static unsigned getHashValue(const SectionKey<Is64Bits> &Val) {
+    return hash_combine(Val.Name, Val.sh_type, Val.sh_flags);
+  }
+  static bool isEqual(const SectionKey<Is64Bits> &LHS,
+                      const SectionKey<Is64Bits> &RHS) {
+    return DenseMapInfo<StringRef>::isEqual(LHS.Name, RHS.Name) &&
+           LHS.sh_type == RHS.sh_type && LHS.sh_flags == RHS.sh_flags;
+  }
+};
+}
+
 // Create output section objects and add them to OutputSections.
 template <class ELFT> void Writer<ELFT>::createSections() {
-  SmallDenseMap<StringRef, OutputSection<ELFT> *> Map;
+  SmallDenseMap<SectionKey<ELFT::Is64Bits>, OutputSection<ELFT> *> Map;
   for (std::unique_ptr<ObjectFileBase> &FileB : Symtab->ObjectFiles) {
     auto &File = cast<ObjectFile<ELFT>>(*FileB);
     for (SectionChunk<ELFT> *C : File.getChunks()) {
-      OutputSection<ELFT> *&Sec = Map[C->getSectionName()];
+      const Elf_Shdr *H = C->getSectionHdr();
+      SectionKey<ELFT::Is64Bits> Key{C->getSectionName(), H->sh_type,
+                                     H->sh_flags};
+      OutputSection<ELFT> *&Sec = Map[Key];
       if (!Sec) {
         Sec = new (CAlloc.Allocate()) OutputSection<ELFT>(C->getSectionName());
         OutputSections.push_back(Sec);

Modified: lld/trunk/test/elf2/string-table.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/string-table.s?rev=244911&r1=244910&r2=244911&view=diff
==============================================================================
--- lld/trunk/test/elf2/string-table.s (original)
+++ lld/trunk/test/elf2/string-table.s Thu Aug 13 12:04:50 2015
@@ -6,28 +6,47 @@
 .global _start
 _start:
 
-.section foobar
+.section        foobar,"", at progbits,unique,1
+.section        foobar,"T", at progbits,unique,2
+.section        foobar,"", at nobits,unique,3
+.section        foobar,"", at nobits,unique,4
+
 .section bar, "a"
 
 // Both sections are in the output and that the alloc section is first:
 // CHECK:      Name: bar
-// CHECK-NEXT:   Type: SHT_PROGBITS
-// CHECK-NEXT:   Flags [
-// CHECK-NEXT:     SHF_ALLOC
-// CHECK-NEXT:   ]
-// CHECK-NEXT:   Address: 0x1000
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT:  SHF_ALLOC
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x1000
 
 // CHECK:      Name: foobar
-// CHECK-NEXT:   Type: SHT_PROGBITS
-// CHECK-NEXT:   Flags [
-// CHECK-NEXT:   ]
-// CHECK-NEXT:   Address: 0x0
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x0
+
+// CHECK:      Name: foobar
+// CHECK-NEXT: Type: SHT_PROGBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT:   SHF_TLS
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x0
+
+// CHECK:      Name: foobar
+// CHECK-NEXT: Type: SHT_NOBITS
+// CHECK-NEXT: Flags [
+// CHECK-NEXT: ]
+// CHECK-NEXT: Address: 0x0
+
+// CHECK-NOT:  Name: foobar
 
 // Test that the sting "bar" is merged into "foobar"
 
 // CHECK:      Section {
-// CHECK:        Index: 6
-// CHECK-NEXT:   Name: .strtab
+// CHECK:        Index:
+// CHECK:        Name: .strtab
 // CHECK-NEXT:   Type: SHT_STRTAB (0x3)
 // CHECK-NEXT:   Flags [ (0x0)
 // CHECK-NEXT:   ]




More information about the llvm-commits mailing list