[lld] r246593 - Don't leave unused strings in the string table.

Rafael Espindola via llvm-commits llvm-commits at lists.llvm.org
Tue Sep 1 14:47:22 PDT 2015


Author: rafael
Date: Tue Sep  1 16:47:21 2015
New Revision: 246593

URL: http://llvm.org/viewvc/llvm-project?rev=246593&view=rev
Log:
Don't leave unused strings in the string table.

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

Modified: lld/trunk/ELF/SymbolTable.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.cpp?rev=246593&r1=246592&r2=246593&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.cpp (original)
+++ lld/trunk/ELF/SymbolTable.cpp Tue Sep  1 16:47:21 2015
@@ -86,7 +86,6 @@ void SymbolTable::reportRemainingUndefin
 template <class ELFT> void SymbolTable::resolve(SymbolBody *New) {
   // Find an existing Symbol or create and insert a new one.
   StringRef Name = New->getName();
-  Builder.add(Name);
   Symbol *&Sym = Symtab[Name];
   if (!Sym) {
     Sym = new (Alloc) Symbol(New);

Modified: lld/trunk/ELF/SymbolTable.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/SymbolTable.h?rev=246593&r1=246592&r2=246593&view=diff
==============================================================================
--- lld/trunk/ELF/SymbolTable.h (original)
+++ lld/trunk/ELF/SymbolTable.h Tue Sep  1 16:47:21 2015
@@ -13,7 +13,6 @@
 #include "InputFiles.h"
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/DenseMapInfo.h"
-#include "llvm/MC/StringTableBuilder.h"
 
 namespace lld {
 namespace elf2 {
@@ -41,8 +40,6 @@ public:
   // The writer needs to infer the machine type from the object files.
   std::vector<std::unique_ptr<ObjectFileBase>> ObjectFiles;
 
-  llvm::StringTableBuilder &getStringBuilder() { return Builder; };
-
   const llvm::DenseMap<StringRef, Symbol *> &getSymbols() const {
     return Symtab;
   }
@@ -55,7 +52,6 @@ private:
 
   llvm::DenseMap<StringRef, Symbol *> Symtab;
   llvm::BumpPtrAllocator Alloc;
-  llvm::StringTableBuilder Builder;
 };
 
 } // namespace elf2

Modified: lld/trunk/ELF/Writer.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/Writer.cpp?rev=246593&r1=246592&r2=246593&view=diff
==============================================================================
--- lld/trunk/ELF/Writer.cpp (original)
+++ lld/trunk/ELF/Writer.cpp Tue Sep  1 16:47:21 2015
@@ -17,6 +17,7 @@
 
 #include "llvm/ADT/DenseMap.h"
 #include "llvm/ADT/STLExtras.h"
+#include "llvm/MC/StringTableBuilder.h"
 #include "llvm/Support/FileOutputBuffer.h"
 #include "llvm/Support/raw_ostream.h"
 
@@ -97,13 +98,11 @@ private:
 namespace {
 template <bool Is64Bits>
 class StringTableSection final : public OutputSectionBase<Is64Bits> {
-  llvm::StringTableBuilder &StrTabBuilder;
-
 public:
+  llvm::StringTableBuilder StrTabBuilder;
+
   typedef typename OutputSectionBase<Is64Bits>::uintX_t uintX_t;
-  StringTableSection(llvm::StringTableBuilder &StrTabBuilder)
-      : OutputSectionBase<Is64Bits>(".strtab", SHT_STRTAB, 0),
-        StrTabBuilder(StrTabBuilder) {
+  StringTableSection() : OutputSectionBase<Is64Bits>(".strtab", SHT_STRTAB, 0) {
     this->Header.sh_addralign = 1;
   }
 
@@ -122,9 +121,9 @@ class SymbolTableSection final : public
 public:
   typedef typename ELFFile<ELFT>::Elf_Sym Elf_Sym;
   typedef typename OutputSectionBase<ELFT::Is64Bits>::uintX_t uintX_t;
-  SymbolTableSection(SymbolTable &Table)
+  SymbolTableSection(SymbolTable &Table, llvm::StringTableBuilder &Builder)
       : OutputSectionBase<ELFT::Is64Bits>(".symtab", SHT_SYMTAB, 0),
-        Table(Table) {
+        Table(Table), Builder(Builder) {
     typedef OutputSectionBase<ELFT::Is64Bits> Base;
     typename Base::HeaderT &Header = this->Header;
 
@@ -150,6 +149,7 @@ public:
 
 private:
   SymbolTable &Table;
+  llvm::StringTableBuilder &Builder;
 };
 
 // The writer writes a SymbolTable result to a file.
@@ -158,8 +158,7 @@ public:
   typedef typename llvm::object::ELFFile<ELFT>::uintX_t uintX_t;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Shdr Elf_Shdr;
   typedef typename llvm::object::ELFFile<ELFT>::Elf_Sym Elf_Sym;
-  Writer(SymbolTable *T)
-      : SymTable(*T), StringTable(T->getStringBuilder()) {}
+  Writer(SymbolTable *T) : SymTable(*T, StringTable.StrTabBuilder) {}
   void run();
 
 private:
@@ -177,11 +176,11 @@ private:
   uintX_t SizeOfHeaders;
   uintX_t SectionHeaderOff;
 
-  SymbolTableSection<ELFT> SymTable;
-
   unsigned StringTableIndex;
   StringTableSection<ELFT::Is64Bits> StringTable;
 
+  SymbolTableSection<ELFT> SymTable;
+
   unsigned NumSections;
 
   void addOutputSection(OutputSectionBase<ELFT::Is64Bits> *Sec) {
@@ -299,7 +298,6 @@ template <class ELFT> void SymbolTableSe
   uint8_t *BufStart = Buf;
 
   Buf += sizeof(Elf_Sym);
-  llvm::StringTableBuilder &Builder = Table.getStringBuilder();
   for (auto &P : Table.getSymbols()) {
     StringRef Name = P.first;
     Symbol *Sym = P.second;
@@ -449,15 +447,19 @@ template <class ELFT> void Writer<ELFT>:
   OutputSection<ELFT> *BSSSec = SymTable.BSSSec;
   // FIXME: Try to avoid the extra walk over all global symbols.
   unsigned &NumVisible = SymTable.NumVisible;
+  llvm::StringTableBuilder &Builder = StringTable.StrTabBuilder;
   std::vector<DefinedCommon<ELFT> *> CommonSymbols;
   for (auto &P : Symtab.getSymbols()) {
+    StringRef Name = P.first;
     SymbolBody *Body = P.second->Body;
     if (auto *C = dyn_cast<DefinedCommon<ELFT>>(Body))
       CommonSymbols.push_back(C);
     auto *E = cast<ELFSymbolBody<ELFT>>(Body);
     uint8_t V = E->Sym.getVisibility();
-    if (V == STV_DEFAULT || V == STV_PROTECTED)
-      NumVisible++;
+    if (V != STV_DEFAULT && V != STV_PROTECTED)
+      continue;
+    NumVisible++;
+    Builder.add(Name);
   }
 
   // Sort the common symbols by alignment as an heuristic to pack them better.

Modified: lld/trunk/test/elf2/string-table.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/elf2/string-table.s?rev=246593&r1=246592&r2=246593&view=diff
==============================================================================
--- lld/trunk/test/elf2/string-table.s (original)
+++ lld/trunk/test/elf2/string-table.s Tue Sep  1 16:47:21 2015
@@ -6,6 +6,10 @@
 .global _start
 _start:
 
+.global hidden
+.hidden hidden
+hidden:
+
 .section        foobar,"", at progbits,unique,1
 .section        foobar,"T", at progbits,unique,2
 .section        foobar,"", at nobits,unique,3
@@ -42,7 +46,8 @@ _start:
 
 // CHECK-NOT:  Name: foobar
 
-// Test that the sting "bar" is merged into "foobar"
+// Test that the sting "bar" is merged into "foobar" and that we don't output
+// the name of a hidden symbol.
 
 // CHECK:      Section {
 // CHECK:        Index:




More information about the llvm-commits mailing list