diff options
| author | Devang Patel <dpatel@apple.com> | 2007-01-23 21:52:35 +0000 |
|---|---|---|
| committer | Devang Patel <dpatel@apple.com> | 2007-01-23 21:52:35 +0000 |
| commit | 97fd2439f2b30b575cdd67eef52e03937d483680 (patch) | |
| tree | b2c0c3a43439ffd57fa1e6ddb23e36cbe19a655f | |
| parent | a6f567c89e5e15ab658ce798600eef7f313fe93d (diff) | |
Add CallGraphSCCPass::assignPassManager().
This enables CalLGraphPassManager.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33466 91177308-0d34-0410-b5e6-96231b3b80d8
| -rw-r--r-- | include/llvm/CallGraphSCCPass.h | 4 | ||||
| -rw-r--r-- | lib/Analysis/IPA/CallGraphSCCPass.cpp | 38 |
2 files changed, 42 insertions, 0 deletions
diff --git a/include/llvm/CallGraphSCCPass.h b/include/llvm/CallGraphSCCPass.h index c3307385b0..f64ece41b6 100644 --- a/include/llvm/CallGraphSCCPass.h +++ b/include/llvm/CallGraphSCCPass.h @@ -27,6 +27,7 @@ namespace llvm { class CallGraphNode; class CallGraph; +class PMStack; struct CallGraphSCCPass : public ModulePass { @@ -54,6 +55,9 @@ struct CallGraphSCCPass : public ModulePass { /// virtual bool runOnModule(Module &M); + /// Assign pass manager to manager this pass + virtual void assignPassManager(PMStack &PMS, + PassManagerType PMT = PMT_CallGraphPassManager); /// getAnalysisUsage - For this class, we declare that we require and preserve /// the call graph. If the derived class implements this method, it should diff --git a/lib/Analysis/IPA/CallGraphSCCPass.cpp b/lib/Analysis/IPA/CallGraphSCCPass.cpp index 7ec7a87d2c..4de2e56fc7 100644 --- a/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/lib/Analysis/IPA/CallGraphSCCPass.cpp @@ -144,6 +144,44 @@ bool CGPassManager::doFinalization(CallGraph &CG) { return Changed; } +/// Assign pass manager to manager this pass +void CallGraphSCCPass::assignPassManager(PMStack &PMS, + PassManagerType PreferredType) { + // Find CGPassManager + while (!PMS.empty()) { + if (PMS.top()->getPassManagerType() > PMT_CallGraphPassManager) + PMS.pop(); + else; + break; + } + + CGPassManager *CGP = dynamic_cast<CGPassManager *>(PMS.top()); + + // Create new Call Graph SCC Pass Manager if it does not exist. + if (!CGP) { + + assert (!PMS.empty() && "Unable to create Call Graph Pass Manager"); + PMDataManager *PMD = PMS.top(); + + // [1] Create new Call Graph Pass Manager + CGP = new CGPassManager(PMD->getDepth() + 1); + + // [2] Set up new manager's top level manager + PMTopLevelManager *TPM = PMD->getTopLevelManager(); + TPM->addIndirectPassManager(CGP); + + // [3] Assign manager to manage this new manager. This may create + // and push new managers into PMS + Pass *P = dynamic_cast<Pass *>(CGP); + P->assignPassManager(PMS); + + // [4] Push new manager into PMS + PMS.push(CGP); + } + + CGP->add(this); +} + /// getAnalysisUsage - For this class, we declare that we require and preserve /// the call graph. If the derived class implements this method, it should /// always explicitly call the implementation here. |
