[PATCH] D60297: [COFF] Pack Name in Symbol as is done in ELF
Reid Kleckner via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Apr 4 17:29:51 PDT 2019
rnk created this revision.
rnk added reviewers: ruiu, inglorion, amccarth, aganea.
Herald added a project: LLVM.
This assumes all symbols are <4GB long, so we can store them as a 32-bit
integer. This reorders the fields so the length appears first, packing
with the other bitfield data in the base Symbol object.
This saved 70MB / 3.60% of heap allocations when linking
browser_tests.exe with no PDB. It's not much as a percentage, but worth
doing. I didn't do performance measurements, I don't think it will be
measurable in time.
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D60297
Files:
lld/COFF/Symbols.cpp
lld/COFF/Symbols.h
Index: lld/COFF/Symbols.h
===================================================================
--- lld/COFF/Symbols.h
+++ lld/COFF/Symbols.h
@@ -79,7 +79,8 @@
explicit Symbol(Kind K, StringRef N = "")
: SymbolKind(K), IsExternal(true), IsCOMDAT(false),
WrittenToSymtab(false), PendingArchiveLoad(false), IsGCRoot(false),
- IsRuntimePseudoReloc(false), Name(N) {}
+ IsRuntimePseudoReloc(false), NameLen(N.size()),
+ NameBase(N.empty() ? nullptr : N.data()) {}
const unsigned SymbolKind : 8;
unsigned IsExternal : 1;
@@ -106,7 +107,10 @@
unsigned IsRuntimePseudoReloc : 1;
protected:
- StringRef Name;
+ // Symbol name length. Assume symbol lengths fit in a 32-bit integer.
+ unsigned NameLen;
+
+ const char *NameBase;
};
// The base class for any defined symbols, including absolute symbols,
@@ -129,7 +133,7 @@
// Symbols defined via a COFF object file or bitcode file. For COFF files, this
// stores a coff_symbol_generic*, and names of internal symbols are lazily
// loaded through that. For bitcode files, Sym is nullptr and the name is stored
-// as a StringRef.
+// as a decomposed StringRef.
class DefinedCOFF : public Defined {
friend Symbol;
Index: lld/COFF/Symbols.cpp
===================================================================
--- lld/COFF/Symbols.cpp
+++ lld/COFF/Symbols.cpp
@@ -20,6 +20,9 @@
using namespace lld::coff;
+static_assert(sizeof(SymbolUnion) <= 48,
+ "symbols should be optimized for memory usage");
+
// Returns a symbol name for an error message.
std::string lld::toString(coff::Symbol &B) {
if (Config->Demangle)
@@ -39,11 +42,15 @@
// name. Object files contain lots of non-external symbols, and creating
// StringRefs for them (which involves lots of strlen() on the string table)
// is a waste of time.
- if (Name.empty()) {
+ if (NameBase == nullptr) {
auto *D = cast<DefinedCOFF>(this);
- cast<ObjFile>(D->File)->getCOFFObj()->getSymbolName(D->Sym, Name);
+ StringRef NameStr;
+ cast<ObjFile>(D->File)->getCOFFObj()->getSymbolName(D->Sym, NameStr);
+ NameBase = NameStr.data();
+ NameLen = NameStr.size();
+ assert(NameLen == NameStr.size() && "name length truncated");
}
- return Name;
+ return StringRef(NameBase, NameLen);
}
InputFile *Symbol::getFile() {
@@ -67,9 +74,10 @@
// MinGW specific.
void Symbol::replaceKeepingName(Symbol *Other, size_t Size) {
- StringRef OrigName = Name;
+ StringRef OrigName = getName();
memcpy(this, Other, Size);
- Name = OrigName;
+ NameBase = OrigName.data();
+ NameLen = OrigName.size();
}
COFFSymbolRef DefinedCOFF::getCOFFSymbol() {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D60297.193813.patch
Type: text/x-patch
Size: 2670 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20190405/dbd771e2/attachment.bin>
More information about the llvm-commits
mailing list