[ELF2] Determine the order of entries of symbol tables in the finalize() phase.
* Move the responsibility to call SymbolBody::setDynamicSymbolTableIndex()
from the hash table to the dynamic symbol table.
* Hash table is not longer responsible for filling the dynamic symbol table.
* The final order of symbols of both symbol tables is set before writing
phase starts.
* Remove repeaded scan of the symbol table during writting SymbolTableSection.
Differential Revision: http://reviews.llvm.org/D13911
llvm-svn: 250864
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp
index 6178a94..dc9cafc 100644
--- a/lld/ELF/Writer.cpp
+++ b/lld/ELF/Writer.cpp
@@ -282,7 +282,7 @@
StringRef SymName = *SymNameOrErr;
if (!shouldKeepInSymtab<ELFT>(*F, SymName, Sym))
continue;
- Out<ELFT>::SymTab->addSymbol(SymName, true);
+ Out<ELFT>::SymTab->addLocalSymbol(SymName);
}
}
}
@@ -498,7 +498,6 @@
// FIXME: Try to avoid the extra walk over all global symbols.
std::vector<DefinedCommon<ELFT> *> CommonSymbols;
for (auto &P : Symtab.getSymbols()) {
- StringRef Name = P.first;
SymbolBody *Body = P.second->Body;
if (auto *U = dyn_cast<Undefined<ELFT>>(Body))
if (!U->isWeak() && !U->canKeepUndefined())
@@ -508,10 +507,10 @@
CommonSymbols.push_back(C);
if (!includeInSymtab<ELFT>(*Body))
continue;
- Out<ELFT>::SymTab->addSymbol(Name);
+ Out<ELFT>::SymTab->addSymbol(Body);
if (isOutputDynamic() && includeInDynamicSymtab(*Body))
- Out<ELFT>::HashTab->addSymbol(Body);
+ Out<ELFT>::DynSymTab->addSymbol(Body);
}
addCommonSymbols(CommonSymbols);