From 1d3fa21cdd115b48241ff031f01e6b489b077abf Mon Sep 17 00:00:00 2001 From: Brian Gaeke Date: Thu, 14 Aug 2003 06:07:57 +0000 Subject: [PATCH] Add new method to FunctionPassManager to add ImmutablePasses. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@7838 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassManager.h | 6 ++++++ lib/VMCore/Pass.cpp | 1 + lib/VMCore/PassManagerT.h | 21 ++++++++++++++++++++- 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/include/llvm/PassManager.h b/include/llvm/PassManager.h index 5a313d5a6f1..c30164b5402 100644 --- a/include/llvm/PassManager.h +++ b/include/llvm/PassManager.h @@ -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. diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index 711b6108a1d..6fb3ef0c402 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -78,6 +78,7 @@ bool PassManager::run(Module &M) { return PM->run(M); } FunctionPassManager::FunctionPassManager() : PM(new PassManagerT()) {} 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); } diff --git a/lib/VMCore/PassManagerT.h b/lib/VMCore/PassManagerT.h index 5ccb76751b2..9f47665b53e 100644 --- a/lib/VMCore/PassManagerT.h +++ b/lib/VMCore/PassManagerT.h @@ -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 &Required = AnUsage.getRequiredSet(); + // Loop over all of the analyses used by this pass, + for (std::vector::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