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

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

index 0bcf318f5d0913c232e897bc6f9f0dfc160350d1..7e1d903d553d1555feb5dd97b6c4fe5ce1c63538 100644 (file)
@@ -166,6 +166,40 @@ private:
   FunctionPassManager_New *activeFunctionPassManager;
 };
 
+/// PassManager_New manages ModulePassManagers
+class PassManager_New: public Pass {
+
+public:
+
+  /// 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
+  /// implies that all passes MUST be allocated with 'new'.
+  void add(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 run(Module &M);
+
+private:
+  /// Add a pass into a passmanager queue. This is used by schedulePasses
+  bool addPass(Pass *p);
+
+  /// Schedule all passes collected in pass queue using add(). Add all the
+  /// schedule passes into various manager's queue using addPass().
+  void schedulePasses();
+
+  // Collection of pass managers
+  std::vector<ModulePassManager_New *> PassManagers;
+
+  // Collection of pass that are not yet scheduled
+  std::vector<Pass *> PassVector;
+  
+  // Active Pass Manager
+  ModulePassManager_New *activeManager;
+};
+
 } // End llvm namespace
 
 #endif
index 31849a0ac0b751e37894182ee4161e82f3b5f60e..c87d33305a76d22ee534dee555d4fcb7c7a55870 100644 (file)
@@ -163,3 +163,44 @@ ModulePassManager_New::runOnModule(Module &M) {
   return Changed;
 }
 
+/// Schedule all passes from the queue by adding them in their
+/// respective manager's queue. 
+void
+PassManager_New::schedulePasses() {
+  /* TODO */
+}
+
+/// Add pass P to the queue of passes to run.
+void
+PassManager_New::add(Pass *P) {
+  /* TODO */
+}
+
+// PassManager_New implementation
+/// Add P into active pass manager or use new module pass manager to
+/// manage it.
+bool
+PassManager_New::addPass (Pass *P) {
+
+  if (!activeManager) {
+    activeManager = new ModulePassManager_New();
+    PassManagers.push_back(activeManager);
+  }
+
+  return activeManager->addPass(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
+PassManager_New::run(Module &M) {
+
+  schedulePasses();
+  bool Changed = false;
+  for (std::vector<ModulePassManager_New *>::iterator itr = PassManagers.begin(),
+         e = PassManagers.end(); itr != e; ++itr) {
+    ModulePassManager_New *pm = *itr;
+    Changed |= pm->runOnModule(M);
+  }
+  return Changed;
+}