Add run(Function &F) support in FunctionPassManager_New
authorDevang Patel <dpatel@apple.com>
Wed, 15 Nov 2006 19:39:54 +0000 (19:39 +0000)
committerDevang Patel <dpatel@apple.com>
Wed, 15 Nov 2006 19:39:54 +0000 (19:39 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@31756 91177308-0d34-0410-b5e6-96231b3b80d8

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

index ae52f1822468c6ac9da5bc49998020f82f44af5c..f8ebd62ca6a691a39323ec1a7df6add3bb9360f9 100644 (file)
@@ -135,6 +135,12 @@ public:
   /// so, return true.
   bool runOnModule(Module &M);
 
+  /// run - 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 run(Function &F);
+  
   /// doInitialization - Run all of the initializers for the function passes.
   ///
   bool doInitialization();
index d0d54d4c4f736eede2e7e2c77e023305b73ca98b..b8717ea42f7ca382f95bab8d3cb565852ce83dd1 100644 (file)
@@ -17,6 +17,7 @@
 #include "llvm/ModuleProvider.h"
 #include <vector>
 #include <map>
+#include <iostream>
 
 using namespace llvm;
 
@@ -158,6 +159,7 @@ public:
   /// track of whether any of the passes modifies the function, and if
   /// so, return true.
   bool runOnModule(Module &M);
+  bool runOnFunction(Function &F);
 
   /// Return true IFF AnalysisID AID is currently available.
   Pass *getAnalysisPassFromManager(AnalysisID AID);
@@ -423,19 +425,31 @@ FunctionPassManager_New::FunctionPassManager_New() {
 /// PassManager_X is destroyed, the pass will be destroyed as well, so
 /// there is no need to delete the pass. (TODO delete passes.)
 /// This implies that all passes MUST be allocated with 'new'.
-void 
-FunctionPassManager_New::add(Pass *P) { 
+void FunctionPassManager_New::add(Pass *P) { 
   FPM->add(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 
-FunctionPassManager_New::runOnModule(Module &M) {
+bool FunctionPassManager_New::runOnModule(Module &M) {
   return FPM->runOnModule(M);
 }
 
+/// run - 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 FunctionPassManager_New::run(Function &F) {
+  std::string errstr;
+  if (MP->materializeFunction(&F, &errstr)) {
+    std::cerr << "Error reading bytecode file: " << errstr << "\n";
+    abort();
+  }
+  return FPM->runOnFunction(F);
+}
+
+
 /// doInitialization - Run all of the initializers for the function passes.
 ///
 bool FunctionPassManager_New::doInitialization() {
@@ -489,8 +503,7 @@ FunctionPassManagerImpl_New::addPass(Pass *P) {
 /// Execute all of the passes scheduled for execution by invoking 
 /// runOnFunction method.  Keep track of whether any of the passes modifies 
 /// the function, and if so, return true.
-bool
-FunctionPassManagerImpl_New::runOnModule(Module &M) {
+bool FunctionPassManagerImpl_New::runOnModule(Module &M) {
 
   bool Changed = false;
   clearAnalysis();
@@ -509,6 +522,28 @@ FunctionPassManagerImpl_New::runOnModule(Module &M) {
   return Changed;
 }
 
+/// Execute all of the passes scheduled for execution by invoking 
+/// runOnFunction method.  Keep track of whether any of the passes modifies 
+/// the function, and if so, return true.
+bool FunctionPassManagerImpl_New::runOnFunction(Function &F) {
+
+  bool Changed = false;
+  clearAnalysis();
+
+  for (std::vector<Pass *>::iterator itr = passVectorBegin(),
+         e = passVectorEnd(); itr != e; ++itr) {
+    Pass *P = *itr;
+    
+    noteDownAvailableAnalysis(P);
+    FunctionPass *FP = dynamic_cast<FunctionPass*>(P);
+    Changed |= FP->runOnFunction(F);
+    removeNotPreservedAnalysis(P);
+    removeDeadPasses(P);
+  }
+  return Changed;
+}
+
+
 /// Return true IFF AnalysisID AID is currently available.
 Pass *FunctionPassManagerImpl_New::getAnalysisPassFromManager(AnalysisID AID) {