//===- Object.cpp ---------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #include "Object.h" #include namespace llvm { namespace objcopy { namespace coff { using namespace object; void Object::addSymbols(ArrayRef NewSymbols) { for (Symbol S : NewSymbols) { S.UniqueId = NextSymbolUniqueId++; Symbols.emplace_back(S); } updateSymbols(); } void Object::updateSymbols() { SymbolMap = DenseMap(Symbols.size()); size_t RawSymIndex = 0; for (Symbol &Sym : Symbols) { SymbolMap[Sym.UniqueId] = &Sym; Sym.RawIndex = RawSymIndex; RawSymIndex += 1 + Sym.Sym.NumberOfAuxSymbols; } } const Symbol *Object::findSymbol(size_t UniqueId) const { auto It = SymbolMap.find(UniqueId); if (It == SymbolMap.end()) return nullptr; return It->second; } void Object::removeSymbols(function_ref ToRemove) { Symbols.erase( std::remove_if(std::begin(Symbols), std::end(Symbols), [ToRemove](const Symbol &Sym) { return ToRemove(Sym); }), std::end(Symbols)); updateSymbols(); } Error Object::markSymbols() { for (Symbol &Sym : Symbols) Sym.Referenced = false; for (const Section &Sec : Sections) { for (const Relocation &R : Sec.Relocs) { auto It = SymbolMap.find(R.Target); if (It == SymbolMap.end()) return make_error("Relocation target " + Twine(R.Target) + " not found", object_error::invalid_symbol_index); It->second->Referenced = true; } } return Error::success(); } } // end namespace coff } // end namespace objcopy } // end namespace llvm