Add BasicBlockPassManager_New.
authorDevang Patel <dpatel@apple.com>
Tue, 7 Nov 2006 21:31:57 +0000 (21:31 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 7 Nov 2006 21:31:57 +0000 (21:31 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31513 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/PassManager.h
lib/VMCore/PassManager.cpp [new file with mode: 0644]

index 7d4a2df6d15220e48a068e94f1f1f7b8d10befcb..2769a4dbf2a4bb66355f4da4b590330b5a11d0ec 100644 (file)
@@ -17,6 +17,9 @@
 #ifndef LLVM_PASSMANAGER_H
 #define LLVM_PASSMANAGER_H
 
+#include "llvm/Pass.h"
+#include <vector>
+
 namespace llvm {
 
 class Pass;
@@ -85,6 +88,26 @@ public:
   bool doFinalization();
 };
 
+/// BasicBlockpassManager_New manages BasicBlockPass. It batches all the
+/// pass together and sequence them to process one basic block before
+/// processing next basic block.
+class BasicBlockPassManager_New: public Pass {
+
+public:
+  BasicBlockPassManager_New() { }
+
+  /// Add a pass into a passmanager queue. 
+  bool addPass(Pass *p);
+  
+  /// Execute all of the passes scheduled for execution.  Keep track of
+  /// whether any of the passes modifies the function, and if so, return true.
+  bool runOnFunction(Function &F);
+
+private:
+  // Collection of pass that are not yet scheduled
+  std::vector<Pass *> PassVector;
+};
+
 } // End llvm namespace
 
 #endif
diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp
new file mode 100644 (file)
index 0000000..bd8faac
--- /dev/null
@@ -0,0 +1,56 @@
+//===- PassManager.cpp - LLVM Pass Infrastructure Implementation ----------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file was developed by the LLVM research group and is distributed under
+// the University of Illinois Open Source License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the LLVM Pass Manager infrastructure. 
+//
+//===----------------------------------------------------------------------===//
+
+
+#include "llvm/PassManager.h"
+#include "llvm/Function.h"
+#include "llvm/Module.h"
+
+using namespace llvm;
+
+/// BasicBlockPassManager implementation
+
+/// Add pass P into PassVector and return TRUE. If this pass is not
+/// manageable by this manager then return FALSE.
+bool
+BasicBlockPassManager_New::addPass (Pass *P) {
+
+  BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
+  if (!BP)
+    return false;
+
+  // TODO: Check if it suitable to manage P using this BasicBlockPassManager
+  // or we need another instance of BasicBlockPassManager
+
+  // Add pass
+  PassVector.push_back(BP);
+  return true;
+}
+
+/// Execute all of the passes scheduled for execution by invoking 
+/// runOnBasicBlock method.  Keep track of whether any of the passes modifies 
+/// the function, and if so, return true.
+bool
+BasicBlockPassManager_New::runOnFunction(Function &F) {
+
+  bool Changed = false;
+  for (Function::iterator I = F.begin(), E = F.end(); I != E; ++I)
+    for (std::vector<Pass *>::iterator itr = PassVector.begin(),
+           e = PassVector.end(); itr != e; ++itr) {
+      Pass *P = *itr;
+      BasicBlockPass *BP = dynamic_cast<BasicBlockPass*>(P);
+      Changed |= BP->runOnBasicBlock(*I);
+    }
+  return Changed;
+}
+