From 99111287fc97eb95f035e2ad867165f563caa5fd Mon Sep 17 00:00:00 2001 From: Peter Collingbourne Date: Sun, 11 Dec 2016 22:15:20 +0000 Subject: [PATCH] COFF: Use a bit in SymbolBody to track which symbols are written to the symbol table. Using a set here caused us to take about 1 second longer to write the symbol table when linking chrome_child.dll. With this I consistently get better performance on Windows with the new symbol table. Before r289280 and with r289183 reverted (median of 5 runs): 17.65s After this change: 17.33s On Linux things look even better: Before: 10.700480444s After: 5.735681610s Differential Revision: https://reviews.llvm.org/D27648 llvm-svn: 289408 --- lld/COFF/Symbols.h | 7 ++++++- lld/COFF/Writer.cpp | 5 +++-- 2 files changed, 9 insertions(+), 3 deletions(-) diff --git a/lld/COFF/Symbols.h b/lld/COFF/Symbols.h index 240a67aa1f14..560010b63a43 100644 --- a/lld/COFF/Symbols.h +++ b/lld/COFF/Symbols.h @@ -80,7 +80,7 @@ protected: friend SymbolTable; explicit SymbolBody(Kind K, StringRef N = "") : SymbolKind(K), IsExternal(true), IsCOMDAT(false), - IsReplaceable(false), Name(N) {} + IsReplaceable(false), WrittenToSymtab(false), Name(N) {} const unsigned SymbolKind : 8; unsigned IsExternal : 1; @@ -91,6 +91,11 @@ protected: // This bit is used by the \c DefinedBitcode subclass. unsigned IsReplaceable : 1; +public: + // This bit is used by Writer::createSymbolAndStringTable(). + unsigned WrittenToSymtab : 1; + +protected: StringRef Name; }; diff --git a/lld/COFF/Writer.cpp b/lld/COFF/Writer.cpp index 13d95c6ea778..98fd6c4470cd 100644 --- a/lld/COFF/Writer.cpp +++ b/lld/COFF/Writer.cpp @@ -533,13 +533,14 @@ void Writer::createSymbolAndStringTable() { Sec->setStringTableOff(addEntryToStringTable(Name)); } - std::set SeenSymbols; for (lld::coff::ObjectFile *File : Symtab->ObjectFiles) for (SymbolBody *B : File->getSymbols()) if (auto *D = dyn_cast(B)) - if (SeenSymbols.insert(D).second) + if (!D->WrittenToSymtab) { + D->WrittenToSymtab = true; if (Optional Sym = createSymbol(D)) OutputSymtab.push_back(*Sym); + } OutputSection *LastSection = OutputSections.back(); // We position the symbol table to be adjacent to the end of the last section.