[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