Add ModulePassManager_New.
authorDevang Patel <dpatel@apple.com>
Tue, 7 Nov 2006 22:03:15 +0000 (22:03 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 7 Nov 2006 22:03:15 +0000 (22:03 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31517 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/PassManager.h
lib/VMCore/PassManager.cpp

index 53dfa6bab0f30c707a17665372eebfc3c63b3d2d..c75bc21a0361fc9fa0a6e23deead7a4d5028c64e 100644 (file)
@@ -143,6 +143,29 @@ private:
   BasicBlockPassManager_New *activeBBPassManager;
 };
 
+/// FunctionPassManager_New manages FunctionPasses.
+/// It batches all Module passes  passes and function pass managers together and
+/// sequence them to process one module.
+class ModulePassManager_New: public Pass {
+public:
+  ModulePassManager_New() { activeFunctionPassManager = NULL; }
+  
+  /// Add a pass into a passmanager queue. 
+  bool addPass(Pass *p);
+  
+  /// run - Execute all of the passes scheduled for execution.  Keep track of
+  /// whether any of the passes modifies the module, and if so, return true.
+  bool runOnModule(Module &M);
+  
+private:
+  // Collection of pass that are not yet scheduled
+  std::vector<Pass *> PassVector;
+  
+  // Active Pass Manager
+  FunctionPassManager_New *activeFunctionPassManager;
+};
+
 } // End llvm namespace
 
 #endif
index 450a515c40b20024f702752da49decac44b50e6f..31849a0ac0b751e37894182ee4161e82f3b5f60e 100644 (file)
@@ -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<FunctionPass*>(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<ModulePass *>(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<Pass *>::iterator itr = PassVector.begin(),
+         e = PassVector.end(); itr != e; ++itr) {
+    Pass *P = *itr;
+    ModulePass *MP = dynamic_cast<ModulePass*>(P);
+    Changed |= MP->runOnModule(M);
+  }
+  return Changed;
+}
+