aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/llvm/Pass.h5
-rw-r--r--lib/VMCore/PassManager.cpp3
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();