From 591b1b7526ed9c099de23cc995853a250c20502f Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 8 Dec 2006 23:11:43 +0000 Subject: [PATCH] Keep track of other pass managers, that are not directly managed by top level manager. Use this info to findAnalysisPass. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32382 91177308-0d34-0410-b5e6-96231b3b80d8 --- lib/VMCore/PassManager.cpp | 24 +++++++++++++++++++----- 1 file changed, 19 insertions(+), 5 deletions(-) diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 3207ef2a3f5..25e8cbff421 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -141,11 +141,21 @@ public: PassManagers.push_back(Manager); } + // Add Manager into the list of managers that are not directly + // maintained by this top level pass manager + void addOtherPassManager(Pass *Manager) { + OtherPassManagers.push_back(Manager); + } + private: /// Collection of pass managers std::vector PassManagers; + /// Collection of pass managers that are not directly maintained + /// by this pass manager + std::vector OtherPassManagers; + // Map to keep track of last user of the analysis pass. // LastUser->second is the last user of Lastuser->first. std::map LastUser; @@ -231,14 +241,16 @@ Pass *PMTopLevelManager::findAnalysisPass(AnalysisID AID) { } } - if (P) - return P; - - // Check pass managers; + // Check pass managers for (std::vector::iterator I = PassManagers.begin(), E = PassManagers.end(); P == NULL && I != E; ++I) P = NULL; // FIXME: (*I)->findAnalysisPass(AID, false /* Search downward */); + // Check other pass managers + for (std::vector::iterator I = OtherPassManagers.begin(), + E = OtherPassManagers.end(); P == NULL && I != E; ++I) + P = NULL; // FIXME: (*I)->findAnalysisPass(AID, false /* Search downward */); + return P; } @@ -839,6 +851,7 @@ FunctionPassManagerImpl_New::addPass(Pass *P) { activeBBPassManager = new BasicBlockPassManager_New(getDepth() + 1); addPassToManager(activeBBPassManager, false); + TPM->addOtherPassManager(activeBBPassManager); // Add pass into new manager. This time it must succeed. if (!activeBBPassManager->addPass(BP)) @@ -970,7 +983,8 @@ ModulePassManager_New::addPass(Pass *P) { activeFunctionPassManager = new FunctionPassManagerImpl_New(getDepth() + 1); addPassToManager(activeFunctionPassManager, false); - + TPM->addOtherPassManager(activeFunctionPassManager); + // Add pass into new manager. This time it must succeed. if (!activeFunctionPassManager->addPass(FP)) assert(0 && "Unable to add pass");