diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index af15516c72b..601420eb37e 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 23a26130fc3..25353082433 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 &RequiredSet = AnUsage.getRequiredSet();