diff options
-rw-r--r-- | include/llvm/Pass.h | 5 | ||||
-rw-r--r-- | lib/VMCore/PassManager.cpp | 3 |
2 files changed, 8 insertions, 0 deletions
diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index af15516c72..601420eb37 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -119,8 +119,13 @@ public: void print(std::ostream *O, const Module *M) const { if (O) print(*O, M); } void dump() const; // dump - call print(std::cerr, 0); + /// Each pass is responsible for assigning a pass manager to itself. + /// PMS is the stack of available pass manager. virtual void assignPassManager(PMStack &PMS, PassManagerType T = PMT_Unknown) {} + /// Check if available pass managers are suitable for this pass or not. + virtual void preparePassManager(PMStack &PMS) {} + // Access AnalysisResolver inline void setResolver(AnalysisResolver *AR) { Resolver = AR; } inline AnalysisResolver *getResolver() { return Resolver; } diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 23a26130fc..2535308243 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -385,6 +385,9 @@ void PMTopLevelManager::schedulePass(Pass *P) { if (findAnalysisPass(P->getPassInfo())) return; + // Give pass a chance to prepare the stage. + P->preparePassManager(activeStack); + AnalysisUsage AnUsage; P->getAnalysisUsage(AnUsage); const std::vector<AnalysisID> &RequiredSet = AnUsage.getRequiredSet(); |