From 92c45eebf77de5d6ee84a3f18f560b83cb68e720 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Tue, 7 Nov 2006 22:03:15 +0000 Subject: Add ModulePassManager_New. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31517 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/PassManager.cpp | 55 +++++++++++++++++++++++++++++++++++++++++++++- 1 file changed, 54 insertions(+), 1 deletion(-) (limited to 'lib/VMCore/PassManager.cpp') diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 450a515c40..31849a0ac0 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -85,7 +85,7 @@ FunctionPassManager_New::addPass (Pass *P) { return false; // TODO: Check if it suitable to manage P using this FunctionPassManager - // or we need another instance of BasicBlockPassManager + // or we need another instance of FunctionPassManager PassVector.push_back(FP); activeBBPassManager = NULL; @@ -110,3 +110,56 @@ FunctionPassManager_New::runOnModule(Module &M) { } +// ModulePassManager implementation + +/// Add P into pass vector if it is manageble. If P is a FunctionPass +/// then use FunctionPassManager_New to manage it. Return FALSE if P +/// is not manageable by this manager. +bool +ModulePassManager_New::addPass (Pass *P) { + + // If P is FunctionPass then use function pass maanager. + if (FunctionPass *FP = dynamic_cast(P)) { + + activeFunctionPassManager = NULL; + + if (!activeFunctionPassManager + || !activeFunctionPassManager->addPass(P)) { + + activeFunctionPassManager = new FunctionPassManager_New(); + + PassVector.push_back(activeFunctionPassManager); + assert (!activeFunctionPassManager->addPass(FP) && + "Unable to add Pass"); + } + return true; + } + + ModulePass *MP = dynamic_cast(P); + if (!MP) + return false; + + // TODO: Check if it suitable to manage P using this ModulePassManager + // or we need another instance of ModulePassManager + + PassVector.push_back(MP); + activeFunctionPassManager = NULL; + return true; +} + + +/// Execute all of the passes scheduled for execution by invoking +/// runOnModule method. Keep track of whether any of the passes modifies +/// the module, and if so, return true. +bool +ModulePassManager_New::runOnModule(Module &M) { + bool Changed = false; + for (std::vector::iterator itr = PassVector.begin(), + e = PassVector.end(); itr != e; ++itr) { + Pass *P = *itr; + ModulePass *MP = dynamic_cast(P); + Changed |= MP->runOnModule(M); + } + return Changed; +} + -- cgit v1.2.3-18-g5258