diff options
author | Reid Kleckner <rnk@google.com> | 2019-04-19 22:51:49 +0000 |
---|---|---|
committer | Reid Kleckner <rnk@google.com> | 2019-04-19 22:51:49 +0000 |
commit | a30920c31ffed9445ddc96203812fc812936c456 (patch) | |
tree | 1a4eac0a5933e3b4cd8ea93046646f5706b571bc /lld/COFF/Symbols.cpp | |
parent | a27252794e0785af0eff7367ac9d57d91dffe944 (diff) | |
download | bcm5719-llvm-a30920c31ffed9445ddc96203812fc812936c456.tar.gz bcm5719-llvm-a30920c31ffed9445ddc96203812fc812936c456.zip |
[COFF] Pack Name in Symbol as is done in ELF
Summary:
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.
Reviewers: ruiu, inglorion, amccarth, aganea
Subscribers: llvm-commits
Tags: #llvm
Differential Revision: https://reviews.llvm.org/D60297
llvm-svn: 358794
Diffstat (limited to 'lld/COFF/Symbols.cpp')
-rw-r--r-- | lld/COFF/Symbols.cpp | 18 |
1 files changed, 13 insertions, 5 deletions
diff --git a/lld/COFF/Symbols.cpp b/lld/COFF/Symbols.cpp index e14785d8612..a23429ef835 100644 --- a/lld/COFF/Symbols.cpp +++ b/lld/COFF/Symbols.cpp @@ -20,6 +20,9 @@ using namespace llvm::object; 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 @@ StringRef Symbol::getName() { // 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 (NameData == 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); + NameData = NameStr.data(); + NameSize = NameStr.size(); + assert(NameSize == NameStr.size() && "name length truncated"); } - return Name; + return StringRef(NameData, NameSize); } InputFile *Symbol::getFile() { @@ -67,9 +74,10 @@ bool Symbol::isLive() const { // MinGW specific. void Symbol::replaceKeepingName(Symbol *Other, size_t Size) { - StringRef OrigName = Name; + StringRef OrigName = getName(); memcpy(this, Other, Size); - Name = OrigName; + NameData = OrigName.data(); + NameSize = OrigName.size(); } COFFSymbolRef DefinedCOFF::getCOFFSymbol() { |