summaryrefslogtreecommitdiffstats
path: root/llvm/tools/llvm-objcopy/Object.cpp
diff options
context:
space:
mode:
authorPaul Semel <semelpaul@gmail.com>2018-05-21 22:50:32 +0000
committerPaul Semel <semelpaul@gmail.com>2018-05-21 22:50:32 +0000
commit040df77ed6fe27889467b1fea6c5f35612c1c0c2 (patch)
tree38e893c2ca0b7fcd24a81f0d296f2ff114cd6a30 /llvm/tools/llvm-objcopy/Object.cpp
parent99f701182934461d5f9b4ffef2d0bcfacd8bf88f (diff)
downloadbcm5719-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.cpp16
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);
}
}
OpenPOWER on IntegriCloud