diff --git a/lib/MC/ELFObjectWriter.cpp b/lib/MC/ELFObjectWriter.cpp index bde9e84eb9f..c70f93cd14d 100644 --- a/lib/MC/ELFObjectWriter.cpp +++ b/lib/MC/ELFObjectWriter.cpp @@ -228,29 +228,8 @@ namespace { const MCFragment *Fragment, const MCFixup &Fixup, MCValue Target, uint64_t &FixedValue); - // XXX-PERF: this should be cached - uint64_t getNumOfLocalSymbols(const MCAssembler &Asm) { - std::vector<const MCSymbol*> Local; - - uint64_t Index = 0; - for (MCAssembler::const_symbol_iterator it = Asm.symbol_begin(), - ie = Asm.symbol_end(); it != ie; ++it) { - const MCSymbol &Symbol = it->getSymbol(); - - // Ignore non-linker visible symbols. - if (!Asm.isSymbolLinkerVisible(Symbol)) - continue; - - if (it->isExternal() || Symbol.isUndefined()) - continue; - - Index++; - } - - return Index; - } - - uint64_t getSymbolIndexInSymbolTable(MCAssembler &Asm, const MCSymbol *S); + uint64_t getSymbolIndexInSymbolTable(const MCAssembler &Asm, + const MCSymbol *S); /// ComputeSymbolTable - Compute the symbol table data /// @@ -271,7 +250,10 @@ namespace { void CreateMetadataSections(MCAssembler &Asm, MCAsmLayout &Layout); - void ExecutePostLayoutBinding(MCAssembler &Asm) {} + void ExecutePostLayoutBinding(MCAssembler &Asm) { + // Compute symbol table information. + ComputeSymbolTable(Asm); + } void WriteSecHdrEntry(uint32_t Name, uint32_t Type, uint64_t Flags, uint64_t Address, uint64_t Offset, @@ -512,10 +494,10 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, if (Base) { if (MCFragment *F = SD.getFragment()) { - Index = F->getParent()->getOrdinal() + getNumOfLocalSymbols(Asm) + 1; + Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1; Value += Layout.getSymbolAddress(&SD); } else - Index = getSymbolIndexInSymbolTable(const_cast<MCAssembler &>(Asm), Symbol); + Index = getSymbolIndexInSymbolTable(Asm, Symbol); if (Base != &SD) Value += Layout.getSymbolAddress(&SD) - Layout.getSymbolAddress(Base); Addend = Value; @@ -525,7 +507,7 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, if (F) { // Index of the section in .symtab against this symbol // is being relocated + 2 (empty section + abs. symbols). - Index = F->getParent()->getOrdinal() + getNumOfLocalSymbols(Asm) + 1; + Index = F->getParent()->getOrdinal() + LocalSymbolData.size() + 1; MCSectionData *FSD = F->getParent(); // Offset of the symbol in the section @@ -597,62 +579,19 @@ void ELFObjectWriterImpl::RecordRelocation(const MCAssembler &Asm, Relocations[Fragment->getParent()].push_back(ERE); } -// XXX-PERF: this should be cached -uint64_t ELFObjectWriterImpl::getSymbolIndexInSymbolTable(MCAssembler &Asm, - const MCSymbol *S) { - std::vector<ELFSymbolData> Local; - std::vector<ELFSymbolData> External; - std::vector<ELFSymbolData> Undefined; - - for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), - ie = Asm.symbol_end(); it != ie; ++it) { - const MCSymbol &Symbol = it->getSymbol(); - - // Ignore non-linker visible symbols. - if (!Asm.isSymbolLinkerVisible(Symbol)) - continue; - - if (it->isExternal() || Symbol.isUndefined()) - continue; - - ELFSymbolData MSD; - MSD.SymbolData = it; - - Local.push_back(MSD); - } - for (MCAssembler::symbol_iterator it = Asm.symbol_begin(), - ie = Asm.symbol_end(); it != ie; ++it) { - const MCSymbol &Symbol = it->getSymbol(); - - // Ignore non-linker visible symbols. - if (!Asm.isSymbolLinkerVisible(Symbol)) - continue; - - if (!it->isExternal() && !Symbol.isUndefined()) - continue; - - ELFSymbolData MSD; - MSD.SymbolData = it; - - if (Symbol.isUndefined()) - Undefined.push_back(MSD); - else - External.push_back(MSD); - } - - array_pod_sort(Local.begin(), Local.end()); - array_pod_sort(External.begin(), External.end()); - array_pod_sort(Undefined.begin(), Undefined.end()); - - for (unsigned i = 0, e = Local.size(); i != e; ++i) - if (&Local[i].SymbolData->getSymbol() == S) +uint64_t +ELFObjectWriterImpl::getSymbolIndexInSymbolTable(const MCAssembler &Asm, + const MCSymbol *S) { + for (unsigned i = 0, e = LocalSymbolData.size(); i != e; ++i) + if (&LocalSymbolData[i].SymbolData->getSymbol() == S) return i + /* empty symbol */ 1; - for (unsigned i = 0, e = External.size(); i != e; ++i) - if (&External[i].SymbolData->getSymbol() == S) - return i + Local.size() + Asm.size() + /* empty symbol */ 1; - for (unsigned i = 0, e = Undefined.size(); i != e; ++i) - if (&Undefined[i].SymbolData->getSymbol() == S) - return i + Local.size() + External.size() + Asm.size() + /* empty symbol */ 1; + for (unsigned i = 0, e = ExternalSymbolData.size(); i != e; ++i) + if (&ExternalSymbolData[i].SymbolData->getSymbol() == S) + return i + LocalSymbolData.size() + Asm.size() + /* empty symbol */ 1; + for (unsigned i = 0, e = UndefinedSymbolData.size(); i != e; ++i) + if (&UndefinedSymbolData[i].SymbolData->getSymbol() == S) + return i + LocalSymbolData.size() + ExternalSymbolData.size() + + Asm.size() + /* empty symbol */ 1; llvm_unreachable("Cannot find symbol which should exist!"); } @@ -908,9 +847,6 @@ void ELFObjectWriterImpl::CreateMetadataSections(MCAssembler &Asm, void ELFObjectWriterImpl::WriteObject(const MCAssembler &Asm, const MCAsmLayout &Layout) { - // Compute symbol table information. - ComputeSymbolTable(const_cast<MCAssembler&>(Asm)); - CreateMetadataSections(const_cast<MCAssembler&>(Asm), const_cast<MCAsmLayout&>(Layout));