Omit unused section symbols from the symbol table.
authorRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Jun 2015 15:33:30 +0000 (15:33 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Thu, 4 Jun 2015 15:33:30 +0000 (15:33 +0000)
Section symbols exist as an optimization: instead of having multiple relocations
point to different symbols, many of them can point to a single section symbol.

When that optimization is unused, a section symbol is also unused and adds no
extra information to the object file.

This saves a bit of space on the object files and makes the output of
llvm-objdump -t easier to read and consequently some tests get quite a bit
simpler.

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

16 files changed:
lib/MC/ELFObjectWriter.cpp
test/MC/ARM/arm-elf-symver.s
test/MC/ELF/alias.s
test/MC/ELF/basic-elf-32.s
test/MC/ELF/basic-elf-64.s
test/MC/ELF/comdat-dup-group-name.s
test/MC/ELF/comdat.s
test/MC/ELF/empty.s
test/MC/ELF/many-sections-2.s
test/MC/ELF/many-sections.s
test/MC/ELF/noexec.s
test/MC/ELF/reloc-same-name-section.s
test/MC/ELF/section-sym.s
test/MC/ELF/symver.s
test/MC/ELF/undef.s
test/MC/ELF/weakref.s

index f8cf7d2ea5d3ce2b4c4dcda06231454ad2cb0ccc..b4e410622e09ebfdbc0b5fc8484647113ceb9eb5 100644 (file)
@@ -688,6 +688,8 @@ void ELFObjectWriter::RecordRelocation(MCAssembler &Asm,
     auto *ELFSec = cast_or_null<MCSectionELF>(SecA);
     const auto *SectionSymbol =
         ELFSec ? cast<MCSymbolELF>(ELFSec->getBeginSymbol()) : nullptr;
+    if (SectionSymbol)
+      SectionSymbol->setUsedInReloc();
     ELFRelocationEntry Rec(FixupOffset, SectionSymbol, Type, Addend);
     Relocations[&FixupSection].push_back(Rec);
     return;
@@ -733,12 +735,12 @@ bool ELFObjectWriter::isInSymtab(const MCAsmLayout &Layout,
   if (Symbol.isUndefined() && !Symbol.isBindingSet())
     return false;
 
-  if (Symbol.getType() == ELF::STT_SECTION)
-    return true;
-
   if (Symbol.isTemporary())
     return false;
 
+  if (Symbol.getType() == ELF::STT_SECTION)
+    return false;
+
   return true;
 }
 
index 691c604c7f85bf69743b760bdbc5951a3d5f1e47..ce9c4fe5f00e1527650355180344a4a01af1b9c6 100644 (file)
@@ -87,24 +87,6 @@ global1:
 @ CHECK-NEXT:     Section: .text
 @ CHECK-NEXT:   }
 @ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: (0)
-@ CHECK-NEXT:     Value: 0x0
-@ CHECK-NEXT:     Size: 0
-@ CHECK-NEXT:     Binding: Local (0x0)
-@ CHECK-NEXT:     Type: Section (0x3)
-@ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: .data
-@ CHECK-NEXT:   }
-@ CHECK-NEXT:   Symbol {
-@ CHECK-NEXT:     Name: (0)
-@ CHECK-NEXT:     Value: 0x0
-@ CHECK-NEXT:     Size: 0
-@ CHECK-NEXT:     Binding: Local (0x0)
-@ CHECK-NEXT:     Type: Section (0x3)
-@ CHECK-NEXT:     Other: 0
-@ CHECK-NEXT:     Section: .bss
-@ CHECK-NEXT:   }
-@ CHECK-NEXT:   Symbol {
 @ CHECK-NEXT:     Name: bar2@zed
 @ CHECK-NEXT:     Value: 0x0
 @ CHECK-NEXT:     Size: 0
index 8bbeb36ccb4b1c6e3e35a3b5225e42b086bc1dfc..df39fd4be147d24000d231252b776943459693fe 100644 (file)
@@ -111,14 +111,6 @@ leaq .Llocal1(%rip), %rdi
 // CHECK-NOT: Symbol {
 // CHECK:        }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NOT: Symbol {
-// CHECK:        }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NOT: Symbol {
-// CHECK:        }
-// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: bar2
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
index 16266af7f44529f2cc322fd371eb18f51e187999..1036b04a747bcbe1a6e66d9eb4e71ab51933368b 100644 (file)
@@ -54,20 +54,6 @@ main:                                   # @main
 // CHECK: ]
 
 // CHECK: Symbols [
-// CHECK:   Symbol {
-// CHECK:     Binding: Local
-// CHECK:     Type: Section
-// CHECK:   }
-
-// CHECK:   Symbol {
-// CHECK:     Binding: Local
-// CHECK:     Type: Section
-// CHECK:   }
-
-// CHECK:   Symbol {
-// CHECK:     Binding: Local
-// CHECK:     Type: Section
-// CHECK:   }
 
 // CHECK:   Symbol {
 // CHECK:     Name: main
index d99125e06a91b47ab201d97c26a2be3c687a7e34..b93f9aebd3a092c2db95678764fdf5cbbf4378c0 100644 (file)
@@ -57,16 +57,6 @@ main:                                   # @main
 // CHECK:     Binding: Local
 // CHECK:     Type: Section
 
-// CHECK:   Symbol {
-// CHECK:     Binding: Local
-// CHECK:     Type: Section
-// CHECK:   }
-
-// CHECK:   Symbol {
-// CHECK:     Binding: Local
-// CHECK:     Type: Section
-// CHECK:   }
-
 // CHECK:   Symbol {
 // CHECK:     Name: main
 // CHECK:     Binding: Global
index 6644e2b7675f6bff356afe77fa37a0a7006b11a7..e52f3dcc04d1cfd844b110b33acd40a8dd597bf3 100644 (file)
 // CHECK-NOT: }
 // CHECK: Section: .group (0x7)
 
-// CHECK: Section: .foo (0x6)
-// CHECK: Section: .foo (0x8)
-
-
        .section        .foo,"axG",@progbits,f1,comdat
         nop
 
index e71dea089c4d48813edf105154baf95dc87d8b40..18da17e6118cd4f9beee54eea32d7a2a4a99e764 100644 (file)
@@ -46,7 +46,7 @@
 // CHECK-NEXT:     Offset:
 // CHECK-NEXT:     Size: 12
 // CHECK-NEXT:     Link:
-// CHECK-NEXT:     Info: 10
+// CHECK-NEXT:     Info: 3
 // CHECK-NEXT:     AddressAlignment: 4
 // CHECK-NEXT:     EntrySize: 4
 // CHECK-NEXT:     SectionData (
index 6ddbd8c942a25390d1693b13dea4f4c8342e5c07..7b686fef3a2347c0165814ff9a311ed3d1e4b06e 100644 (file)
@@ -78,9 +78,9 @@
 // CHECK-NEXT:     ]
 // CHECK-NEXT:     Address: 0x0
 // CHECK-NEXT:     Offset:
-// CHECK-NEXT:     Size: 96
+// CHECK-NEXT:     Size: 24
 // CHECK-NEXT:     Link:
-// CHECK-NEXT:     Info: 4
+// CHECK-NEXT:     Info: 1
 // CHECK-NEXT:     AddressAlignment: 8
 // CHECK-NEXT:     EntrySize: 24
 // CHECK-NEXT:   }
index 5698fe6ce39fb7a98c7fe062243885f2f793cfc0..0077552ef313064decd89ff9b7d2acb79b8602bf 100644 (file)
@@ -130,3 +130,4 @@ gen_sections4 m
 
 a:
 b = a + 1
+.long dm
index 43463ba666e8d5f43c027759716a7ba8c25b4e8e..2db6abb9321bf30127da7d3894513e514a8eb656 100644 (file)
@@ -106,3 +106,4 @@ gen_sections8 l
         .section foo
         .section bar
         .section zed
+.long zed
index d3d5cd491123e131be818054ee28faa207df56e5..e8f460e65fa0adb9699c362c2a8d93a2342f6f49 100644 (file)
@@ -1,4 +1,4 @@
-// RUN: llvm-mc -no-exec-stack -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s -t | FileCheck  %s
+// RUN: llvm-mc -no-exec-stack -filetype=obj -triple x86_64-pc-linux-gnu %s -o - | llvm-readobj -s | FileCheck  %s
 
 // CHECK:        Section {
 // CHECK:          Index:
 // CHECK-NEXT:     AddressAlignment: 1
 // CHECK-NEXT:     EntrySize: 0
 // CHECK-NEXT:   }
-
-// CHECK:        Symbol {
-// CHECK:          Name: (0)
-// CHECK:          Value: 0x0
-// CHECK:          Size: 0
-// CHECK:          Binding: Local
-// CHECK:          Type: Section
-// CHECK:          Other: 0
-// CHECK:          Section: .note.GNU-stack
-// CHECK-NEXT:   }
index e63ea548e5aa8e71dfd35d79816c667b276aab92..57463c65f8909a642b1a6d652a3ed78a5083b3f1 100644 (file)
@@ -7,13 +7,13 @@
 // CHECK-NEXT:     Relocation {
 // CHECK-NEXT:       Offset:
 // CHECK-NEXT:       Type:
-// CHECK-NEXT:       Symbol:  .foo (7)
+// CHECK-NEXT:       Symbol:  .foo (4)
 // CHECK-NEXT:       Addend:
 // CHECK-NEXT:     }
 // CHECK-NEXT:     Relocation {
 // CHECK-NEXT:       Offset:
 // CHECK-NEXT:       Type:
-// CHECK-NEXT:       Symbol:  .foo (8)
+// CHECK-NEXT:       Symbol:  .foo (5)
 // CHECK-NEXT:       Addend:
 // CHECK-NEXT:     }
 // CHECK-NEXT:   }
index 389ffd728ec249f7295c51a3fb2428fde98c2053..4a9484d9b77922d8c91b602c7a969d1b34757ffd 100644 (file)
 // CHECK-NEXT:   EntrySize:       0
 // CHECK-NEXT: }
 
-// The relocation points to symbol 6
+// The relocation points to symbol 3
 // CHECK:      Relocations [
 // CHECK-NEXT:   Section ({{.*}}) .relabar {
 // CHECK-NEXT:     Relocation {
 // CHECK-NEXT:       Offset:  0x0
 // CHECK-NEXT:       Type:    R_X86_64_32 (10)
-// CHECK-NEXT:       Symbol:  foo (6)
+// CHECK-NEXT:       Symbol:  foo (3)
 // CHECK-NEXT:       Addend:  0x0
 // CHECK-NEXT:     }
 // CHECK-NEXT:   }
 // CHECK-NEXT: ]
+
+// Symbol 3 is section 6
+// CHECK: Symbols [
+// CHECK-NEXT:  Symbol {
+// CHECK-NEXT:    Name:  (0)
+// CHECK-NEXT:    Value: 0x0
+// CHECK-NEXT:    Size: 0
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: None (0x0)
+// CHECK-NEXT:    Other: 0
+// CHECK-NEXT:    Section: Undefined (0x0)
+// CHECK-NEXT:  }
+// CHECK-NEXT:  Symbol {
+// CHECK-NEXT:    Name: f1 (57)
+// CHECK-NEXT:    Value: 0x0
+// CHECK-NEXT:    Size: 0
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: None (0x0)
+// CHECK-NEXT:    Other: 0
+// CHECK-NEXT:    Section: .group (0x5)
+// CHECK-NEXT:  }
+// CHECK-NEXT:  Symbol {
+// CHECK-NEXT:    Name: f2 (54)
+// CHECK-NEXT:    Value: 0x0
+// CHECK-NEXT:    Size: 0
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: None (0x0)
+// CHECK-NEXT:    Other: 0
+// CHECK-NEXT:    Section: .group (0x7)
+// CHECK-NEXT:  }
+// CHECK-NEXT:  Symbol {
+// CHECK-NEXT:    Name:  (0)
+// CHECK-NEXT:    Value: 0x0
+// CHECK-NEXT:    Size: 0
+// CHECK-NEXT:    Binding: Local (0x0)
+// CHECK-NEXT:    Type: Section (0x3)
+// CHECK-NEXT:    Other: 0
+// CHECK-NEXT:    Section: foo (0x6)
+// CHECK-NEXT:  }
+// CHECK-NEXT: ]
index ece651e49fde71704e4a1dc4c18cf55710241193..0f434dd859d3813a33e34ed939d61af5e9e02171 100644 (file)
@@ -86,24 +86,6 @@ global1:
 // CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .data
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .bss
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: bar2@zed
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
index dcb1660bbad3e3b8640312ff4130a9f57098d8f7..9577ea22875b166cc5c99bb66c8e0498ed5f8a14 100644 (file)
@@ -42,42 +42,6 @@ test2_b = undef + 1
 // CHECK-NEXT:     Section: .rodata.str1.1
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .text
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .data
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .bss
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .rodata.str1.1
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: .Lsym1
 // CHECK-NEXT:     Value: 0x0
 // CHECK-NEXT:     Size: 0
index 76e420a73e7f1db8a91f2b29df40d175724e720a..d342c61f745abbee2652709219b03c421fef7396 100644 (file)
@@ -125,24 +125,6 @@ bar15:
 // CHECK-NEXT:     Section: .text
 // CHECK-NEXT:   }
 // CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .data
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
-// CHECK-NEXT:     Name: (0)
-// CHECK-NEXT:     Value: 0x0
-// CHECK-NEXT:     Size: 0
-// CHECK-NEXT:     Binding: Local
-// CHECK-NEXT:     Type: Section
-// CHECK-NEXT:     Other: 0
-// CHECK-NEXT:     Section: .bss
-// CHECK-NEXT:   }
-// CHECK-NEXT:   Symbol {
 // CHECK-NEXT:     Name: bar10
 // CHECK-NEXT:     Value: 0x28
 // CHECK-NEXT:     Size: 0