summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-05-22 06:04:42 +0000
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>2015-05-22 06:04:42 +0000
commit03656162a3dcdfb71ee727fd2a00d75237359b32 (patch)
tree4f6850e45842d6f44fdc84b6d181bfe3aa26e401
parent87fc5f8695d9b1ef6ae807e79680bdcf7c94f546 (diff)
downloadbcm5719-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.h10
-rw-r--r--llvm/lib/MC/MCContext.cpp7
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");
OpenPOWER on IntegriCloud