diff options
author | Paul Semel <semelpaul@gmail.com> | 2018-05-21 22:50:32 +0000 |
---|---|---|
committer | Paul Semel <semelpaul@gmail.com> | 2018-05-21 22:50:32 +0000 |
commit | 040df77ed6fe27889467b1fea6c5f35612c1c0c2 (patch) | |
tree | 38e893c2ca0b7fcd24a81f0d296f2ff114cd6a30 /llvm/tools/llvm-objcopy/Object.cpp | |
parent | 99f701182934461d5f9b4ffef2d0bcfacd8bf88f (diff) | |
download | bcm5719-llvm-040df77ed6fe27889467b1fea6c5f35612c1c0c2.tar.gz bcm5719-llvm-040df77ed6fe27889467b1fea6c5f35612c1c0c2.zip |
[llvm-objcopy] Add --strip-unneeded option
This option removes symbols that are not needed by relocations.
Differential Revision: https://reviews.llvm.org/D46896
llvm-svn: 332915
Diffstat (limited to 'llvm/tools/llvm-objcopy/Object.cpp')
-rw-r--r-- | llvm/tools/llvm-objcopy/Object.cpp | 16 |
1 files changed, 15 insertions, 1 deletions
diff --git a/llvm/tools/llvm-objcopy/Object.cpp b/llvm/tools/llvm-objcopy/Object.cpp index efb3207aa8d..bd728270fb7 100644 --- a/llvm/tools/llvm-objcopy/Object.cpp +++ b/llvm/tools/llvm-objcopy/Object.cpp @@ -185,6 +185,7 @@ void SymbolTableSection::addSymbol(StringRef Name, uint8_t Bind, uint8_t Type, Sym.Visibility = Visibility; Sym.Size = Sz; Sym.Index = Symbols.size(); + Sym.ReferenceCount = 0; Symbols.emplace_back(llvm::make_unique<Symbol>(Sym)); Size += this->EntrySize; } @@ -255,6 +256,11 @@ const Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) const { return Symbols[Index].get(); } +Symbol *SymbolTableSection::getSymbolByIndex(uint32_t Index) { + return const_cast<Symbol *>( + static_cast<const SymbolTableSection *>(this)->getSymbolByIndex(Index)); +} + template <class ELFT> void ELFSectionWriter<ELFT>::visit(const SymbolTableSection &Sec) { uint8_t *Buf = Out.getBufferStart(); @@ -344,6 +350,12 @@ void RelocationSection::accept(SectionVisitor &Visitor) const { Visitor.visit(*this); } +RelocationSection::~RelocationSection() { + for (auto &Rel : Relocations) { + --Rel.RelocSymbol->ReferenceCount; + } +} + void RelocationSection::removeSymbols( function_ref<bool(const Symbol &)> ToRemove) { for (const Relocation &Reloc : Relocations) @@ -647,7 +659,9 @@ void initRelocations(RelocationSection *Relocs, SymbolTableSection *SymbolTable, ToAdd.Offset = Rel.r_offset; getAddend(ToAdd.Addend, Rel); ToAdd.Type = Rel.getType(false); - ToAdd.RelocSymbol = SymbolTable->getSymbolByIndex(Rel.getSymbol(false)); + Symbol *Sym = SymbolTable->getSymbolByIndex(Rel.getSymbol(false)); + ++Sym->ReferenceCount; + ToAdd.RelocSymbol = Sym; Relocs->addRelocation(ToAdd); } } |