<div dir="ltr"><br><div class="gmail_extra"><br><div class="gmail_quote">On Wed, Dec 10, 2014 at 9:25 PM, Craig Topper <span dir="ltr"><<a href="mailto:craig.topper@gmail.com" target="_blank">craig.topper@gmail.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Author: ctopper<br>
Date: Wed Dec 10 23:25:30 2014<br>
New Revision: 223997<br>
<br>
URL: <a href="http://llvm.org/viewvc/llvm-project?rev=223997&view=rev" target="_blank">http://llvm.org/viewvc/llvm-project?rev=223997&view=rev</a><br>
Log:<br>
Replace std::map<K, V*> with std::map<K, std::unique_ptr<V>> to handle ownership and deletion of the values.<br>
<br>
Ideally we would store the MultiClasses by value directly in the maps, but I had some trouble with that before </blockquote><div><br>Might be worth documenting the troubles at least in the commit message (or in this thread) and possibly in a comment in the code so the next time someone thinks "this could be simpler" they'll know what to look out for.<br> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">and this at least fixes the leak.<br>
<br>
Modified:<br>
    llvm/trunk/lib/TableGen/TGParser.cpp<br>
    llvm/trunk/lib/TableGen/TGParser.h<br>
<br>
Modified: llvm/trunk/lib/TableGen/TGParser.cpp<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.cpp?rev=223997&r1=223996&r2=223997&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.cpp?rev=223997&r1=223996&r2=223997&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/TableGen/TGParser.cpp (original)<br>
+++ llvm/trunk/lib/TableGen/TGParser.cpp Wed Dec 10 23:25:30 2014<br>
@@ -459,7 +459,7 @@ MultiClass *TGParser::ParseMultiClassID(<br>
     return nullptr;<br>
   }<br>
<br>
-  MultiClass *Result = MultiClasses[Lex.getCurStrVal()];<br>
+  MultiClass *Result = MultiClasses[Lex.getCurStrVal()].get();<br>
   if (!Result)<br>
     TokError("Couldn't find multiclass '" + Lex.getCurStrVal() + "'");<br>
<br>
@@ -2290,11 +2290,14 @@ bool TGParser::ParseMultiClass() {<br>
     return TokError("expected identifier after multiclass for name");<br>
   std::string Name = Lex.getCurStrVal();<br>
<br>
-  if (MultiClasses.count(Name))<br>
+  auto Result =<br>
+    MultiClasses.insert(std::make_pair(Name,<br>
+                    llvm::make_unique<MultiClass>(Name, Lex.getLoc(),Records)));<br>
+<br>
+  if (!Result.second)<br>
     return TokError("multiclass '" + Name + "' already defined");<br>
<br>
-  CurMultiClass = MultiClasses[Name] = new MultiClass(Name,<br>
-                                                      Lex.getLoc(), Records);<br>
+  CurMultiClass = Result.first->second.get();<br>
   Lex.Lex();  // Eat the identifier.<br>
<br>
   // If there are template args, parse them.<br>
@@ -2555,7 +2558,7 @@ bool TGParser::ParseDefm(MultiClass *Cur<br>
     // To instantiate a multiclass, we need to first get the multiclass, then<br>
     // instantiate each def contained in the multiclass with the SubClassRef<br>
     // template parameters.<br>
-    MultiClass *MC = MultiClasses[Ref.Rec->getName()];<br>
+    MultiClass *MC = MultiClasses[Ref.Rec->getName()].get();<br>
     assert(MC && "Didn't lookup multiclass correctly?");<br>
     std::vector<Init*> &TemplateVals = Ref.TemplateArgs;<br>
<br>
<br>
Modified: llvm/trunk/lib/TableGen/TGParser.h<br>
URL: <a href="http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.h?rev=223997&r1=223996&r2=223997&view=diff" target="_blank">http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/TableGen/TGParser.h?rev=223997&r1=223996&r2=223997&view=diff</a><br>
==============================================================================<br>
--- llvm/trunk/lib/TableGen/TGParser.h (original)<br>
+++ llvm/trunk/lib/TableGen/TGParser.h Wed Dec 10 23:25:30 2014<br>
@@ -55,7 +55,7 @@ namespace llvm {<br>
 class TGParser {<br>
   TGLexer Lex;<br>
   std::vector<std::vector<LetRecord> > LetStack;<br>
-  std::map<std::string, MultiClass*> MultiClasses;<br>
+  std::map<std::string, std::unique_ptr<MultiClass>> MultiClasses;<br>
<br>
   /// Loops - Keep track of any foreach loops we are within.<br>
   ///<br>
<br>
<br>
_______________________________________________<br>
llvm-commits mailing list<br>
<a href="mailto:llvm-commits@cs.uiuc.edu">llvm-commits@cs.uiuc.edu</a><br>
<a href="http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits" target="_blank">http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits</a><br>
</blockquote></div><br></div></div>