Use a ManagedCleanup to prevent leaking the PassRegistrar map. In breaks the
[oota-llvm.git] / tools / opt / opt.cpp
index f7fd5c02b55e5ef5bd71d54d9c68b7788f25e1c8..311f67173f3761af9c71eb672b0634251d02eb17 100644 (file)
@@ -14,7 +14,6 @@
 
 #include "llvm/LLVMContext.h"
 #include "llvm/Module.h"
-#include "llvm/ModuleProvider.h"
 #include "llvm/PassManager.h"
 #include "llvm/CallGraphSCCPass.h"
 #include "llvm/Bitcode/ReaderWriter.h"
@@ -29,7 +28,6 @@
 #include "llvm/Support/Debug.h"
 #include "llvm/Support/IRReader.h"
 #include "llvm/Support/ManagedStatic.h"
-#include "llvm/Support/MemoryBuffer.h"
 #include "llvm/Support/PluginLoader.h"
 #include "llvm/Support/PrettyStackTrace.h"
 #include "llvm/Support/StandardPasses.h"
@@ -425,9 +423,9 @@ int main(int argc, char **argv) {
   if (TD)
     Passes.add(TD);
 
-  FunctionPassManager *FPasses = NULL;
+  OwningPtr<FunctionPassManager> FPasses;
   if (OptLevelO1 || OptLevelO2 || OptLevelO3) {
-    FPasses = new FunctionPassManager(new ExistingModuleProvider(M.get()));
+    FPasses.reset(new FunctionPassManager(M.get()));
     if (TD)
       FPasses->add(new TargetData(*TD));
   }
@@ -476,19 +474,27 @@ int main(int argc, char **argv) {
       errs() << argv[0] << ": cannot create pass: "
              << PassInf->getPassName() << "\n";
     if (P) {
+      PassKind Kind = P->getPassKind();
       addPass(Passes, P);
 
       if (AnalyzeOnly) {
-        if (dynamic_cast<BasicBlockPass*>(P))
+        switch (Kind) {
+        case PT_BasicBlock:
           Passes.add(new BasicBlockPassPrinter(PassInf));
-        else if (dynamic_cast<LoopPass*>(P))
+          break;
+        case PT_Loop:
           Passes.add(new LoopPassPrinter(PassInf));
-        else if (dynamic_cast<FunctionPass*>(P))
+          break;
+        case PT_Function:
           Passes.add(new FunctionPassPrinter(PassInf));
-        else if (dynamic_cast<CallGraphSCCPass*>(P))
+          break;
+        case PT_CallGraphSCC:
           Passes.add(new CallGraphSCCPassPrinter(PassInf));
-        else
+          break;
+        default:
           Passes.add(new ModulePassPrinter(PassInf));
+          break;
+        }
       }
     }