diff options
author | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-05-22 06:04:42 +0000 |
---|---|---|
committer | Duncan P. N. Exon Smith <dexonsmith@apple.com> | 2015-05-22 06:04:42 +0000 |
commit | 03656162a3dcdfb71ee727fd2a00d75237359b32 (patch) | |
tree | 4f6850e45842d6f44fdc84b6d181bfe3aa26e401 | |
parent | 87fc5f8695d9b1ef6ae807e79680bdcf7c94f546 (diff) | |
download | bcm5719-llvm-03656162a3dcdfb71ee727fd2a00d75237359b32.tar.gz bcm5719-llvm-03656162a3dcdfb71ee727fd2a00d75237359b32.zip |
MC: Shave a pointer off of MCSymbol::Name
Shave a pointer off of `MCSymbolName` by storing `StringMapEntry<bool>*`
instead of `StringRef`. This brings `sizeof(MCSymbol)` down to 64 on
64-bit platforms, a nice round number. My profile showed memory
dropping from 914 MB down to 908 MB, roughly 0.7%. Other than memory
usage, no functionality change here.
(I'm looking at `llc` memory usage on `verify-uselistorder.lto.opt.bc`;
see r236629 for details.)
llvm-svn: 238005
-rw-r--r-- | llvm/include/llvm/MC/MCSymbol.h | 10 | ||||
-rw-r--r-- | llvm/lib/MC/MCContext.cpp | 7 |
2 files changed, 8 insertions, 9 deletions
diff --git a/llvm/include/llvm/MC/MCSymbol.h b/llvm/include/llvm/MC/MCSymbol.h index ca22248876f..cf99c919281 100644 --- a/llvm/include/llvm/MC/MCSymbol.h +++ b/llvm/include/llvm/MC/MCSymbol.h @@ -15,7 +15,7 @@ #define LLVM_MC_MCSYMBOL_H #include "llvm/ADT/PointerIntPair.h" -#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/StringMap.h" #include "llvm/MC/MCExpr.h" #include "llvm/Support/Compiler.h" @@ -145,7 +145,7 @@ class MCSymbol { /// Name - The name of the symbol. The referred-to string data is actually /// held by the StringMap that lives in MCContext. - StringRef Name; + const StringMapEntry<bool> *Name; /// The section the symbol is defined in. This is null for undefined symbols, /// and the special AbsolutePseudoSection value for absolute symbols. If this @@ -176,8 +176,8 @@ class MCSymbol { private: // MCContext creates and uniques these. friend class MCExpr; friend class MCContext; - MCSymbol(StringRef name, bool isTemporary) - : Name(name), Section(nullptr), Value(nullptr), IsTemporary(isTemporary), + MCSymbol(const StringMapEntry<bool> *Name, bool isTemporary) + : Name(Name), Section(nullptr), Value(nullptr), IsTemporary(isTemporary), IsRedefinable(false), IsUsed(false), HasData(false), Index(0) {} MCSymbol(const MCSymbol &) = delete; @@ -190,7 +190,7 @@ private: // MCContext creates and uniques these. public: /// getName - Get the symbol name. - StringRef getName() const { return Name; } + StringRef getName() const { return Name ? Name->first() : ""; } bool hasData() const { return HasData; } diff --git a/llvm/lib/MC/MCContext.cpp b/llvm/lib/MC/MCContext.cpp index f3ea3cc1691..968fd26f326 100644 --- a/llvm/lib/MC/MCContext.cpp +++ b/llvm/lib/MC/MCContext.cpp @@ -125,7 +125,7 @@ MCSymbol *MCContext::getOrCreateSectionSymbol(const MCSectionELF &Section) { } auto NameIter = UsedNames.insert(std::make_pair(Name, true)).first; - Sym = new (*this) MCSymbol(NameIter->getKey(), /*isTemporary*/ false); + Sym = new (*this) MCSymbol(&*NameIter, /*isTemporary*/ false); if (!OldSym) OldSym = Sym; @@ -156,7 +156,7 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name, bool AlwaysAddSuffix) { IsTemporary = Name.startswith(MAI->getPrivateGlobalPrefix()); if (IsTemporary && AlwaysAddSuffix && !UseNamesOnTempLabels) - return new (*this) MCSymbol("", true); + return new (*this) MCSymbol(nullptr, true); SmallString<128> NewName = Name; bool AddSuffix = AlwaysAddSuffix; @@ -170,8 +170,7 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name, bool AlwaysAddSuffix) { if (NameEntry.second) { // Ok, we found a name. Have the MCSymbol object itself refer to the copy // of the string that is embedded in the UsedNames entry. - MCSymbol *Result = - new (*this) MCSymbol(NameEntry.first->getKey(), IsTemporary); + MCSymbol *Result = new (*this) MCSymbol(&*NameEntry.first, IsTemporary); return Result; } assert(IsTemporary && "Cannot rename non-temporary symbols"); |