[llvm-commits] CVS: llvm/lib/AsmParser/llvmAsmParser.y

Reid Spencer reid at x10sys.com
Mon Mar 19 18:13:20 PDT 2007



Changes in directory llvm/lib/AsmParser:

llvmAsmParser.y updated: 1.329 -> 1.330
---
Log message:

Plug some PATypeHolder memory leaks.


---
Diffs of the changes:  (+25 -6)

 llvmAsmParser.y |   31 +++++++++++++++++++++++++------
 1 files changed, 25 insertions(+), 6 deletions(-)


Index: llvm/lib/AsmParser/llvmAsmParser.y
diff -u llvm/lib/AsmParser/llvmAsmParser.y:1.329 llvm/lib/AsmParser/llvmAsmParser.y:1.330
--- llvm/lib/AsmParser/llvmAsmParser.y:1.329	Mon Mar 19 15:40:22 2007
+++ llvm/lib/AsmParser/llvmAsmParser.y	Mon Mar 19 20:13:00 2007
@@ -513,9 +513,16 @@
     CurFun.CurrentFunction->getBasicBlockList().remove(BB);
     CurFun.CurrentFunction->getBasicBlockList().push_back(BB);
 
+    // We're about to erase the entry, save the key so we can clean it up.
+    ValID Tmp = BBI->first;
+
     // Erase the forward ref from the map as its no longer "forward"
     CurFun.BBForwardRefs.erase(ID);
 
+    // The key has been removed from the map but so we don't want to leave 
+    // strdup'd memory around so destroy it too.
+    Tmp.destroy();
+
     // If its a numbered definition, bump the number and set the BB value.
     if (ID.Type == ValID::LocalID) {
       assert(ID.Num == CurFun.NextValNum && "Invalid new block number");
@@ -1294,8 +1301,10 @@
     std::vector<FunctionType::ParameterAttributes> Attrs;
     Attrs.push_back($5);
     for (TypeWithAttrsList::iterator I=$3->begin(), E=$3->end(); I != E; ++I) {
-      Params.push_back(I->Ty->get());
-      if (I->Ty->get() != Type::VoidTy)
+      const Type *Ty = I->Ty->get();
+      delete I->Ty; I->Ty = 0;
+      Params.push_back(Ty);
+      if (Ty != Type::VoidTy)
         Attrs.push_back(I->Attrs);
     }
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
@@ -1312,8 +1321,10 @@
     std::vector<FunctionType::ParameterAttributes> Attrs;
     Attrs.push_back($5);
     for (TypeWithAttrsList::iterator I=$3->begin(), E=$3->end(); I != E; ++I) {
-      Params.push_back(I->Ty->get());
-      if (I->Ty->get() != Type::VoidTy)
+      const Type* Ty = I->Ty->get();
+      delete I->Ty; I->Ty = 0;
+      Params.push_back(Ty);
+      if (Ty != Type::VoidTy)
         Attrs.push_back(I->Attrs);
     }
     bool isVarArg = Params.size() && Params.back() == Type::VoidTy;
@@ -1429,11 +1440,13 @@
 //
 TypeListI : Types {
     $$ = new std::list<PATypeHolder>();
-    $$->push_back(*$1); delete $1;
+    $$->push_back(*$1); 
+    delete $1;
     CHECK_FOR_ERROR
   }
   | TypeListI ',' Types {
-    ($$=$1)->push_back(*$3); delete $3;
+    ($$=$1)->push_back(*$3); 
+    delete $3;
     CHECK_FOR_ERROR
   };
 
@@ -2479,6 +2492,8 @@
       PFTy = PointerType::get(Ty);
     }
 
+    delete $3;
+
     Value *V = getVal(PFTy, $4);   // Get the function we're calling...
     CHECK_FOR_ERROR
     BasicBlock *Normal = getBBVal($11);
@@ -2595,6 +2610,7 @@
     $$ = new ValueRefList();
     ValueRefListEntry E; E.Attrs = $3; E.Val = getVal($1->get(), $2);
     $$->push_back(E);
+    delete $1;
   }
   | ValueRefList ',' Types ValueRef OptParamAttrs {
     if (!UpRefs.empty())
@@ -2602,6 +2618,7 @@
     $$ = $1;
     ValueRefListEntry E; E.Attrs = $5; E.Val = getVal($3->get(), $4);
     $$->push_back(E);
+    delete $3;
     CHECK_FOR_ERROR
   }
   | /*empty*/ { $$ = new ValueRefList(); };
@@ -2674,6 +2691,7 @@
     $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
     if ($$ == 0)
       GEN_ERROR("icmp operator returned null");
+    delete $3;
   }
   | FCMP FPredicates Types ValueRef ',' ValueRef  {
     if (!UpRefs.empty())
@@ -2687,6 +2705,7 @@
     $$ = CmpInst::create($1, $2, tmpVal1, tmpVal2);
     if ($$ == 0)
       GEN_ERROR("fcmp operator returned null");
+    delete $3;
   }
   | CastOps ResolvedVal TO Types {
     if (!UpRefs.empty())






More information about the llvm-commits mailing list