[PATCH] D27648: COFF: Use a bit in SymbolBody to track which symbols are written to the symbol table.
Peter Collingbourne via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Fri Dec 9 17:56:54 PST 2016
pcc created this revision.
pcc added a reviewer: ruiu.
pcc added a subscriber: llvm-commits.
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
https://reviews.llvm.org/D27648
Files:
lld/COFF/Symbols.h
lld/COFF/Writer.cpp
Index: lld/COFF/Writer.cpp
===================================================================
--- lld/COFF/Writer.cpp
+++ lld/COFF/Writer.cpp
@@ -533,13 +533,14 @@
Sec->setStringTableOff(addEntryToStringTable(Name));
}
- std::set<SymbolBody *> SeenSymbols;
for (lld::coff::ObjectFile *File : Symtab->ObjectFiles)
for (SymbolBody *B : File->getSymbols())
if (auto *D = dyn_cast<Defined>(B))
- if (SeenSymbols.insert(D).second)
+ if (!D->WrittenToSymtab) {
+ D->WrittenToSymtab = true;
if (Optional<coff_symbol16> 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.
Index: lld/COFF/Symbols.h
===================================================================
--- lld/COFF/Symbols.h
+++ lld/COFF/Symbols.h
@@ -80,7 +80,7 @@
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 @@
// 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;
};
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D27648.80987.patch
Type: text/x-patch
Size: 1505 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20161210/f9495be1/attachment.bin>
More information about the llvm-commits
mailing list