diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h index cd8e70b1b36..81c7fd62221 100644 --- a/include/llvm/PassManager.h +++ b/include/llvm/PassManager.h @@ -97,6 +97,7 @@ class PassManager_New { public: PassManager_New(); + ~PassManager_New(); /// add - Add a pass to the queue of passes to run. This passes ownership of /// the Pass to the PassManager. When the PassManager is destroyed, the pass @@ -121,7 +122,7 @@ class FunctionPassManager_New { public: FunctionPassManager_New(ModuleProvider *P); FunctionPassManager_New(); - ~FunctionPassManager_New() { /* TODO */ }; + ~FunctionPassManager_New(); /// add - Add a pass to the queue of passes to run. This passes /// ownership of the Pass to the PassManager. When the diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 5a3def33161..e6f69c07a6a 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -126,6 +126,15 @@ public: Pass *findAnalysisPass(AnalysisID AID); virtual ~PMTopLevelManager() { + + for (std::vector::iterator I = PassManagers.begin(), + E = PassManagers.end(); I != E; ++I) + delete *I; + + for (std::vector::iterator + I = ImmutablePasses.begin(), E = ImmutablePasses.end(); I != E; ++I) + delete *I; + PassManagers.clear(); } @@ -182,6 +191,15 @@ public: initializeAnalysisInfo(); } + virtual ~PMDataManager() { + + for (std::vector::iterator I = PassVector.begin(), + E = PassVector.end(); I != E; ++I) + delete *I; + + PassVector.clear(); + } + /// Return true IFF pass P's required analysis set does not required new /// manager. bool manageablePass(Pass *P); @@ -914,6 +932,10 @@ FunctionPassManager_New::FunctionPassManager_New(ModuleProvider *P) { MP = P; } +FunctionPassManager_New::~FunctionPassManager_New() { + delete FPM; +} + /// add - Add a pass to the queue of passes to run. This passes /// ownership of the Pass to the PassManager. When the /// PassManager_X is destroyed, the pass will be destroyed as well, so @@ -1187,8 +1209,7 @@ ModulePassManager_New::runOnModule(Module &M) { //===----------------------------------------------------------------------===// // PassManagerImpl implementation - -// PassManager_New implementation +// /// Add P into active pass manager or use new module pass manager to /// manage it. bool PassManagerImpl_New::addPass(Pass *P) { @@ -1232,6 +1253,10 @@ PassManager_New::PassManager_New() { PM->setTopLevelManager(PM); } +PassManager_New::~PassManager_New() { + delete PM; +} + /// add - Add a pass to the queue of passes to run. This passes ownership of /// the Pass to the PassManager. When the PassManager is destroyed, the pass /// will be destroyed as well, so there is no need to delete the pass. This