Don't special case undefined symbol when deciding the symbol order.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 May 2015 21:59:34 +0000 (21:59 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 28 May 2015 21:59:34 +0000 (21:59 +0000)
ELF has no restrictions on where undefined symbols go relative to other defined
symbols. In fact, gas just sorts them together. Do the same.

This was there since r111174 probably just because the MachO writer has it.

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

lib/MC/ELFObjectWriter.cpp
test/MC/ARM/arm-elf-symver.s
test/MC/ARM/elf-movt.s
test/MC/ELF/alias.s
test/MC/ELF/strtab-suffix-opt.s
test/MC/ELF/symver.s

index 39efaf16cf16589526693d57b104b5ba1bc080b0..9bfe679b4497dd54d991dce9d0be2bca5382aede 100644 (file)
@@ -805,7 +805,6 @@ void ELFObjectWriter::computeSymbolTable(
 
   std::vector<ELFSymbolData> LocalSymbolData;
   std::vector<ELFSymbolData> ExternalSymbolData;
-  std::vector<ELFSymbolData> UndefinedSymbolData;
 
   // Add the data for the symbols.
   bool HasLargeSectionIndex = false;
@@ -902,7 +901,7 @@ void ELFObjectWriter::computeSymbolTable(
       MSD.Name = StrTabBuilder.add(Name);
 
     if (MSD.SectionIndex == ELF::SHN_UNDEF)
-      UndefinedSymbolData.push_back(MSD);
+      ExternalSymbolData.push_back(MSD);
     else if (Local)
       LocalSymbolData.push_back(MSD);
     else
@@ -930,7 +929,6 @@ void ELFObjectWriter::computeSymbolTable(
   // Symbols are required to be in lexicographic order.
   array_pod_sort(LocalSymbolData.begin(), LocalSymbolData.end());
   array_pod_sort(ExternalSymbolData.begin(), ExternalSymbolData.end());
-  array_pod_sort(UndefinedSymbolData.begin(), UndefinedSymbolData.end());
 
   // Set the symbol indices. Local symbols must come before all other
   // symbols with non-local bindings.
@@ -954,12 +952,6 @@ void ELFObjectWriter::computeSymbolTable(
     writeSymbol(Writer, StringIndex, MSD, Layout);
     assert(MCELF::GetBinding(MSD.Symbol->getData()) != ELF::STB_LOCAL);
   }
-  for (ELFSymbolData &MSD : UndefinedSymbolData) {
-    unsigned StringIndex = StrTabBuilder.getOffset(MSD.Name);
-    MSD.Symbol->setIndex(Index++);
-    writeSymbol(Writer, StringIndex, MSD, Layout);
-    assert(MCELF::GetBinding(MSD.Symbol->getData()) != ELF::STB_LOCAL);
-  }
 
   uint64_t SecEnd = OS.tell();
   SectionOffsets[SymtabSection] = std::make_pair(SecStart, SecEnd);
index 4303540e82aab585c85f8958001d8b02640624da..b39197080bd250a271c94161fa5eb5062d6c0c29 100644 (file)
@@ -105,39 +105,39 @@ global1:
 @ CHECK-NEXT:     Section: .bss
 @ CHECK-NEXT:   }
 @ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: g1@@zed
-@ CHECK-NEXT:     Value: 0x14
+@ CHECK-NEXT:     Name: bar2@zed
+@ CHECK-NEXT:     Value: 0x0
 @ CHECK-NEXT:     Size: 0
 @ CHECK-NEXT:     Binding: Global (0x1)
 @ CHECK-NEXT:     Type: None (0x0)
 @ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: .text
+@ CHECK-NEXT:     Section: Undefined (0x0)
 @ CHECK-NEXT:   }
 @ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: global1
-@ CHECK-NEXT:     Value: 0x14
+@ CHECK-NEXT:     Name: bar6@zed
+@ CHECK-NEXT:     Value: 0x0
 @ CHECK-NEXT:     Size: 0
 @ CHECK-NEXT:     Binding: Global (0x1)
 @ CHECK-NEXT:     Type: None (0x0)
 @ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: .text
+@ CHECK-NEXT:     Section: Undefined (0x0)
 @ CHECK-NEXT:   }
 @ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: bar2@zed
-@ CHECK-NEXT:     Value: 0x0
+@ CHECK-NEXT:     Name: g1@@zed
+@ CHECK-NEXT:     Value: 0x14
 @ CHECK-NEXT:     Size: 0
 @ CHECK-NEXT:     Binding: Global (0x1)
 @ CHECK-NEXT:     Type: None (0x0)
 @ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: Undefined (0x0)
+@ CHECK-NEXT:     Section: .text
 @ CHECK-NEXT:   }
 @ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: bar6@zed
-@ CHECK-NEXT:     Value: 0x0
+@ CHECK-NEXT:     Name: global1
+@ CHECK-NEXT:     Value: 0x14
 @ CHECK-NEXT:     Size: 0
 @ CHECK-NEXT:     Binding: Global (0x1)
 @ CHECK-NEXT:     Type: None (0x0)
 @ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: Undefined (0x0)
+@ CHECK-NEXT:     Section: .text
 @ CHECK-NEXT:   }
 @ CHECK-NEXT: ]
index 0fd77754795be1dacbd8d28a14917e51cb76b362..4fcd63c4a9dc6ac9c02efb7abd31ecceb8fa018f 100644 (file)
@@ -53,6 +53,6 @@ barf:                                   @ @barf
 @ OBJ-NEXT:       0x4 R_ARM_MOVT_PREL
 @ OBJ-NEXT:   ]
 @ OBJ-NEXT:     SectionData (
-@ OBJ-NEXT:       0000: 00000000 2D060000 04000000 2E060000  |....-...........|
+@ OBJ-NEXT:       0000: 00000000 2D050000 04000000 2E050000  |....-...........|
 @ OBJ-NEXT:     )
 @ OBJ-NEXT:   }
index 0ab6dd4b5b8e968d6c61d1a2cb11ebd896c32fbc..92621bc660aa4a4b0f5f149f3a536aec289f5e93 100644 (file)
@@ -119,21 +119,21 @@ leaq .Llocal1(%rip), %rdi
 // CHECK-NOT: Symbol {
 // CHECK:        }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: bar3
+// CHECK-NEXT:     Name: bar2
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .text
+// CHECK-NEXT:     Section: Undefined (0x0)
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: bar2
+// CHECK-NEXT:     Name: bar3
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: Undefined (0x0)
+// CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT: ]
index 0524656446037478578157c10b8fdaf69edb1ee8..96d15005c618570d5b3fd69f8c373fa4cacb48a0 100644 (file)
@@ -16,6 +16,6 @@ foobar:
 .Ltmp3:
        .size   foobar, .Ltmp3-foobar
 
-// CHECK:     Name: foobar (16)
 // CHECK:     Name: bar (19)
 // CHECK:     Name: foo (23)
+// CHECK:     Name: foobar (16)
index 80d71fd0e06924a4a37367443f136230dd58648e..178c0ff3cb75fbd65775bbb8193b370451a574a9 100644 (file)
@@ -104,39 +104,39 @@ global1:
 // CHECK-NEXT:     Section: .bss
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: g1@@zed
-// CHECK-NEXT:     Value: 0x14
+// CHECK-NEXT:     Name: bar2@zed
+// CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .text
+// CHECK-NEXT:     Section: Undefined
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: global1
-// CHECK-NEXT:     Value: 0x14
+// CHECK-NEXT:     Name: bar6@zed
+// CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .text
+// CHECK-NEXT:     Section: Undefined
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: bar2@zed
-// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Name: g1@@zed
+// CHECK-NEXT:     Value: 0x14
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: bar6@zed
-// CHECK-NEXT:     Value: 0x0
+// CHECK-NEXT:     Name: global1
+// CHECK-NEXT:     Value: 0x14
 // CHECK-NEXT:     Size: 0
 // CHECK-NEXT:     Binding: Global
 // CHECK-NEXT:     Type: None
 // CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: Undefined
+// CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT: ]