aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2007-01-23 21:52:35 +0000
committerDevang Patel <dpatel@apple.com>2007-01-23 21:52:35 +0000
commit97fd2439f2b30b575cdd67eef52e03937d483680 (patch)
treeb2c0c3a43439ffd57fa1e6ddb23e36cbe19a655f
parenta6f567c89e5e15ab658ce798600eef7f313fe93d (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.h4
-rw-r--r--lib/Analysis/IPA/CallGraphSCCPass.cpp38
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.