[llvm-commits] [llvm] r98536 - in /llvm/trunk: include/llvm/MC/MCContext.h include/llvm/MC/MCSymbol.h lib/MC/MCContext.cpp

Chris Lattner sabre at nondot.org
Sun Mar 14 23:15:35 PDT 2010


Author: lattner
Date: Mon Mar 15 01:15:35 2010
New Revision: 98536

URL: http://llvm.org/viewvc/llvm-project?rev=98536&view=rev
Log:
fix a memory leak yjasskin pointed out: MCSymbol is bump pointer
allocated and thus not freed.  This is cool except that it contains
and std::string so the string data didn't get freed.  In any case
there is no reason to redundantly store the string data in the 
MCSymbol anyway, just make the MCSymbol ref the string data in the
MCContext StringMap.

Modified:
    llvm/trunk/include/llvm/MC/MCContext.h
    llvm/trunk/include/llvm/MC/MCSymbol.h
    llvm/trunk/lib/MC/MCContext.cpp

Modified: llvm/trunk/include/llvm/MC/MCContext.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCContext.h?rev=98536&r1=98535&r2=98536&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCContext.h (original)
+++ llvm/trunk/include/llvm/MC/MCContext.h Mon Mar 15 01:15:35 2010
@@ -65,8 +65,8 @@
     /// reference and return it.
     ///
     /// @param Name - The symbol name, which must be unique across all symbols.
-    MCSymbol *GetOrCreateSymbol(StringRef Name);
-    MCSymbol *GetOrCreateSymbol(const Twine &Name);
+    MCSymbol *GetOrCreateSymbol(StringRef Name, bool isTemporary = false);
+    MCSymbol *GetOrCreateSymbol(const Twine &Name, bool isTemporary = false);
 
     /// GetOrCreateTemporarySymbol - Create a new assembler temporary symbol
     /// with the specified @p Name if it doesn't exist or return the existing

Modified: llvm/trunk/include/llvm/MC/MCSymbol.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCSymbol.h?rev=98536&r1=98535&r2=98536&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCSymbol.h (original)
+++ llvm/trunk/include/llvm/MC/MCSymbol.h Mon Mar 15 01:15:35 2010
@@ -14,9 +14,7 @@
 #ifndef LLVM_MC_MCSYMBOL_H
 #define LLVM_MC_MCSYMBOL_H
 
-#include <string>
 #include "llvm/ADT/StringRef.h"
-#include "llvm/System/DataTypes.h"
 
 namespace llvm {
   class MCExpr;
@@ -38,8 +36,9 @@
     // FIXME: Use a PointerInt wrapper for this?
     static const MCSection *AbsolutePseudoSection;
 
-    /// Name - The name of the symbol.
-    std::string Name;
+    /// Name - The name of the symbol.  The referred-to string data is actually
+    /// held by the StringMap that lives in MCContext.
+    StringRef Name;
 
     /// Section - The section the symbol is defined in. This is null for
     /// undefined symbols, and the special AbsolutePseudoSection value for
@@ -56,14 +55,14 @@
     
   private:  // MCContext creates and uniques these.
     friend class MCContext;
-    MCSymbol(StringRef _Name, bool _IsTemporary)
-      : Name(_Name), Section(0), Value(0), IsTemporary(_IsTemporary) {}
+    MCSymbol(StringRef name, bool isTemporary)
+      : Name(name), Section(0), Value(0), IsTemporary(isTemporary) {}
 
     MCSymbol(const MCSymbol&);       // DO NOT IMPLEMENT
     void operator=(const MCSymbol&); // DO NOT IMPLEMENT
   public:
     /// getName - Get the symbol name.
-    const std::string &getName() const { return Name; }
+    StringRef getName() const { return Name; }
 
     /// @name Symbol Type
     /// @{

Modified: llvm/trunk/lib/MC/MCContext.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCContext.cpp?rev=98536&r1=98535&r2=98536&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCContext.cpp (original)
+++ llvm/trunk/lib/MC/MCContext.cpp Mon Mar 15 01:15:35 2010
@@ -23,18 +23,25 @@
   // we don't need to free them here.
 }
 
-MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name) {
+MCSymbol *MCContext::GetOrCreateSymbol(StringRef Name, bool isTemporary) {
   assert(!Name.empty() && "Normal symbols cannot be unnamed!");
-  MCSymbol *&Entry = Symbols[Name];
-  if (Entry) return Entry;
-
-  return Entry = new (*this) MCSymbol(Name, false);
+  
+  // Do the lookup and get the entire StringMapEntry.  We want access to the
+  // key if we are creating the entry.
+  StringMapEntry<MCSymbol*> &Entry = Symbols.GetOrCreateValue(Name);
+  if (Entry.getValue()) return Entry.getValue();
+
+  // Ok, the entry doesn't already exist.  Have the MCSymbol object itself refer
+  // to the copy of the string that is embedded in the StringMapEntry.
+  MCSymbol *Result = new (*this) MCSymbol(Entry.getKey(), isTemporary);
+  Entry.setValue(Result);
+  return Result; 
 }
 
-MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name) {
+MCSymbol *MCContext::GetOrCreateSymbol(const Twine &Name, bool isTemporary) {
   SmallString<128> NameSV;
   Name.toVector(NameSV);
-  return GetOrCreateSymbol(NameSV.str());
+  return GetOrCreateSymbol(NameSV.str(), isTemporary);
 }
 
 MCSymbol *MCContext::CreateTempSymbol() {
@@ -50,10 +57,7 @@
     return GetOrCreateTemporarySymbol(Twine(MAI.getPrivateGlobalPrefix()) +
                                       "tmp" + Twine(NextUniqueID++));
   
-  // Otherwise create as usual.
-  MCSymbol *&Entry = Symbols[Name];
-  if (Entry) return Entry;
-  return Entry = new (*this) MCSymbol(Name, true);
+  return GetOrCreateSymbol(Name, true);
 }
 
 MCSymbol *MCContext::GetOrCreateTemporarySymbol(const Twine &Name) {





More information about the llvm-commits mailing list