MC: Shave a pointer off of MCSymbol::Name
authorDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 22 May 2015 06:04:42 +0000 (06:04 +0000)
committerDuncan P. N. Exon Smith <dexonsmith@apple.com>
Fri, 22 May 2015 06:04:42 +0000 (06:04 +0000)
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.)

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@238005 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/MC/MCSymbol.h
lib/MC/MCContext.cpp

index ca22248876fc7e1520c5e78c3d5fc7451503c51f..cf99c919281e2427a3919a05a5121676cef362c2 100644 (file)
@@ -15,7 +15,7 @@
 #define LLVM_MC_MCSYMBOL_H
 
 #include "llvm/ADT/PointerIntPair.h"
 #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"
 
 #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.
 
   /// 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
 
   /// 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;
 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;
         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.
 
 public:
   /// getName - Get the symbol name.
-  StringRef getName() const { return Name; }
+  StringRef getName() const { return Name ? Name->first() : ""; }
 
   bool hasData() const { return HasData; }
 
 
   bool hasData() const { return HasData; }
 
index f3ea3cc1691675c1c02a5865de1cd957b2f566d5..968fd26f326a230c8705ab3551b7ae2aeec4c84d 100644 (file)
@@ -125,7 +125,7 @@ MCSymbol *MCContext::getOrCreateSectionSymbol(const MCSectionELF &Section) {
   }
 
   auto NameIter = UsedNames.insert(std::make_pair(Name, true)).first;
   }
 
   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;
 
   if (!OldSym)
     OldSym = Sym;
@@ -156,7 +156,7 @@ MCSymbol *MCContext::CreateSymbol(StringRef Name, bool AlwaysAddSuffix) {
     IsTemporary = Name.startswith(MAI->getPrivateGlobalPrefix());
 
   if (IsTemporary && AlwaysAddSuffix && !UseNamesOnTempLabels)
     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;
 
   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.
     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");
       return Result;
     }
     assert(IsTemporary && "Cannot rename non-temporary symbols");