From f3dc6d9f95d4ba7756105154df4a8075bbbcf931 Mon Sep 17 00:00:00 2001 From: Devang Patel Date: Fri, 8 Dec 2006 23:28:54 +0000 Subject: [PATCH] Add AnalysisResolver_New. It is a replacement for existing AnalysisResolver. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32383 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/PassAnalysisSupport.h | 44 ++++++++++++++++++++++++++++++ lib/VMCore/PassManager.cpp | 8 ++++++ 2 files changed, 52 insertions(+) diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index 892d203ba3a..3ef43fdcb7f 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -100,7 +100,51 @@ public: const std::vector &getPreservedSet() const { return Preserved; } }; +//===----------------------------------------------------------------------===// +// AnalysisResolver - Simple interface used by Pass objects to pull all +// analysis information out of pass manager that is responsible to manage +// the pass. +// +class PMDataManager; +class AnalysisResolver_New { +private: + AnalysisResolver_New(); // DO NOT IMPLEMENT +public: + AnalysisResolver_New(PMDataManager &P) : PM(P) { } + + inline PMDataManager &getPMDataManager() { return PM; } + + // Find pass that is implementing PI. + Pass *findImplPass(const PassInfo *PI) { + Pass *ResultPass = 0; + for (unsigned i = 0; i < AnalysisImpls.size() ; ++i) { + if (AnalysisImpls[i].first == PI) { + ResultPass = AnalysisImpls[i].second; + break; + } + } + return ResultPass; + } + + void addAnalysisImplsPair(const PassInfo *PI, Pass *P) { + std::pair pir = std::make_pair(PI,P); + AnalysisImpls.push_back(pir); + } + + // getAnalysisToUpdate - Return an analysis result or null if it doesn't exist + Pass *getAnalysisToUpdate(AnalysisID ID, bool Direction) const; + + // AnalysisImpls - This keeps track of which passes implements the interfaces + // that are required by the current pass (to implement getAnalysis()). + // NOTE : Remove AnalysisImpls from class Pass, when AnalysisResolver_New + // replaces AnalysisResolver + std::vector > AnalysisImpls; + +private: + // PassManager that is used to resolve analysis info + PMDataManager &PM; +}; //===----------------------------------------------------------------------===// // AnalysisResolver - Simple interface implemented by PassManager objects that diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 25e8cbff421..3fd2103007a 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -675,6 +675,14 @@ Pass *PMDataManager::findAnalysisPass(AnalysisID AID, bool SearchParent) { return P; } + +//===----------------------------------------------------------------------===// +// NOTE: Is this the right place to define this method ? +// getAnalysisToUpdate - Return an analysis result or null if it doesn't exist +Pass *AnalysisResolver_New::getAnalysisToUpdate(AnalysisID ID, bool dir) const { + return PM.findAnalysisPass(ID, dir); +} + //===----------------------------------------------------------------------===// // BasicBlockPassManager_New implementation