summaryrefslogtreecommitdiffstats
path: root/lld/COFF/Symbols.cpp
diff options
context:
space:
mode:
authorReid Kleckner <rnk@google.com>2019-04-19 22:51:49 +0000
committerReid Kleckner <rnk@google.com>2019-04-19 22:51:49 +0000
commita30920c31ffed9445ddc96203812fc812936c456 (patch)
tree1a4eac0a5933e3b4cd8ea93046646f5706b571bc /lld/COFF/Symbols.cpp
parenta27252794e0785af0eff7367ac9d57d91dffe944 (diff)
downloadbcm5719-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.cpp18
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() {
OpenPOWER on IntegriCloud