Add CallGraphSCCPass::assignPassManager().
authorDevang Patel <dpatel@apple.com>
Tue, 23 Jan 2007 21:52:35 +0000 (21:52 +0000)
committerDevang Patel <dpatel@apple.com>
Tue, 23 Jan 2007 21:52:35 +0000 (21:52 +0000)
This enables CalLGraphPassManager.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@33466 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/CallGraphSCCPass.h
lib/Analysis/IPA/CallGraphSCCPass.cpp

index c3307385b0794fbcb0e9bea696dd8596ea9272af..f64ece41b6d7ab0977f7596d3424097e9f0d8a84 100644 (file)
@@ -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
index 7ec7a87d2ca5edf21cefa7520198811a0ef70723..4de2e56fc7a386f88541c4ec00c878347acd4063 100644 (file)
@@ -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.