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 | 1f8200b404eafff5d9bf498be8143deebbfe39ec (patch) | |
tree | 3ccfedf92f8b716ec5928e7cc53ab54589365c36 /llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp | |
parent | 2cfbcce102758a755f6f9c277164a63f7a398163 (diff) | |
download | bcm5719-llvm-1f8200b404eafff5d9bf498be8143deebbfe39ec.tar.gz bcm5719-llvm-1f8200b404eafff5d9bf498be8143deebbfe39ec.zip |
Add CallGraphSCCPass::assignPassManager().
This enables CalLGraphPassManager.
llvm-svn: 33466
Diffstat (limited to 'llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp')
-rw-r--r-- | llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp b/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp index 7ec7a87d2ca..4de2e56fc7a 100644 --- a/llvm/lib/Analysis/IPA/CallGraphSCCPass.cpp +++ b/llvm/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. |