fix memory leak in pass manager when adding an analysis pass that already existed...
authorNuno Lopes <nunoplopes@sapo.pt>
Tue, 4 Nov 2008 23:03:58 +0000 (23:03 +0000)
committerNuno Lopes <nunoplopes@sapo.pt>
Tue, 4 Nov 2008 23:03:58 +0000 (23:03 +0000)
tweak the opt tool so that it doesnt access a Pass after the ownership was taken by the pass manager

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

lib/VMCore/PassManager.cpp
tools/opt/opt.cpp

index ef90aace3dab03d3e07f5ff6bf435934f9c28fa3..6f559c47c3f166de994a2f453c65a0513c693eae 100644 (file)
@@ -458,8 +458,10 @@ void PMTopLevelManager::schedulePass(Pass *P) {
   // generate the analysis again. Stale analysis info should not be
   // available at this point.
   if (P->getPassInfo() &&
-      P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo()))
+      P->getPassInfo()->isAnalysis() && findAnalysisPass(P->getPassInfo())) {
+    delete P;
     return;
+  }
 
   AnalysisUsage *AnUsage = findAnalysisUsage(P);
 
index a339d316ea893d40fb6007a065b9f0bd7abffa16..b0077eaf29dc227acab6fbbe0c6689fcc512d620 100644 (file)
@@ -527,16 +527,21 @@ int main(int argc, char **argv) {
         cerr << argv[0] << ": cannot create pass: "
              << PassInf->getPassName() << "\n";
       if (P) {
+        bool isBBPass = dynamic_cast<BasicBlockPass*>(P) != 0;
+        bool isLPass = !isBBPass && dynamic_cast<LoopPass*>(P) != 0;
+        bool isFPass = !isLPass && dynamic_cast<FunctionPass*>(P) != 0;
+        bool isCGSCCPass = !isFPass && dynamic_cast<CallGraphSCCPass*>(P) != 0;
+
         addPass(Passes, P);
-        
+
         if (AnalyzeOnly) {
-          if (dynamic_cast<BasicBlockPass*>(P))
+          if (isBBPass)
             Passes.add(new BasicBlockPassPrinter(PassInf));
-          else if (dynamic_cast<LoopPass*>(P))
-            Passes.add(new  LoopPassPrinter(PassInf));
-          else if (dynamic_cast<FunctionPass*>(P))
+          else if (isLPass)
+            Passes.add(new LoopPassPrinter(PassInf));
+          else if (isFPass)
             Passes.add(new FunctionPassPrinter(PassInf));
-          else if (dynamic_cast<CallGraphSCCPass*>(P))
+          else if (isCGSCCPass)
             Passes.add(new CallGraphSCCPassPrinter(PassInf));
           else
             Passes.add(new ModulePassPrinter(PassInf));