OSDN Git Service

Add new method to FunctionPassManager to add ImmutablePasses.
authorBrian Gaeke <gaeke@uiuc.edu>
Thu, 14 Aug 2003 06:07:57 +0000 (06:07 +0000)
committerBrian Gaeke <gaeke@uiuc.edu>
Thu, 14 Aug 2003 06:07:57 +0000 (06:07 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7838 91177308-0d34-0410-b5e6-96231b3b80d8

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

index 5a313d5..c30164b 100644 (file)
@@ -34,6 +34,7 @@ public:
 };
 
 class FunctionPass;
+class ImmutablePass;
 class Function;
 
 class FunctionPassManager {
@@ -50,6 +51,11 @@ public:
   ///
   void add(FunctionPass *P);
 
+  /// add - ImmutablePasses are not FunctionPasses, so we have a 
+  /// special hack to get them into a FunctionPassManager.
+  ///
+  void add(ImmutablePass *IP);
+
   /// 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.
index 711b610..6fb3ef0 100644 (file)
@@ -78,6 +78,7 @@ bool PassManager::run(Module &M) { return PM->run(M); }
 FunctionPassManager::FunctionPassManager() : PM(new PassManagerT<Function>()) {}
 FunctionPassManager::~FunctionPassManager() { delete PM; }
 void FunctionPassManager::add(FunctionPass *P) { PM->add(P); }
+void FunctionPassManager::add(ImmutablePass *IP) { PM->add(IP); }
 bool FunctionPassManager::run(Function &F) { return PM->run(F); }
 
 
index 5ccb767..9f47665 100644 (file)
@@ -444,8 +444,27 @@ public:
     P->addToPassManager(this, AnUsage);
   }
 
-private:
+  // add - H4x0r an ImmutablePass into a PassManager that might not be
+  // expecting one.
+  //
+  void add(ImmutablePass *P) {
+    // Get information about what analyses the pass uses...
+    AnalysisUsage AnUsage;
+    P->getAnalysisUsage(AnUsage);
+    const std::vector<AnalysisID> &Required = AnUsage.getRequiredSet();
+
+    // Loop over all of the analyses used by this pass,
+    for (std::vector<AnalysisID>::const_iterator I = Required.begin(),
+           E = Required.end(); I != E; ++I) {
+      if (getAnalysisOrNullDown(*I) == 0)
+        add((PassClass*)(*I)->createPass());
+    }
+
+    // Add the ImmutablePass to this PassManager.
+    addPass(P, AnUsage);
+  }
 
+private:
   // addPass - These functions are used to implement the subclass specific
   // behaviors present in PassManager.  Basically the add(Pass*) method ends up
   // reflecting its behavior into a Pass::addToPassManager call.  Subclasses of