From: Devang Patel Date: Mon, 16 Apr 2007 20:56:24 +0000 (+0000) Subject: Proivde getAnalysis(Func) support. X-Git-Url: http://demsky.eecs.uci.edu/git/?a=commitdiff_plain;h=6b1df0e863963929634d769f39cbce68f030f051;p=oota-llvm.git Proivde getAnalysis(Func) support. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@36159 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index cef45011cec..5dd3dba4c6e 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -196,9 +196,14 @@ public: template AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h + template + AnalysisType &getAnalysis(Function &F); // Defined in PassanalysisSupport.h + template AnalysisType &getAnalysisID(const PassInfo *PI) const; + template + AnalysisType &getAnalysisID(const PassInfo *PI, Function &F); }; inline std::ostream &operator<<(std::ostream &OS, const Pass &P) { diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index 3234e91ebac..75434a25ef2 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -127,6 +127,9 @@ public: return ResultPass; } + // Find pass that is implementing PI. Initialize pass for Function F. + Pass *findImplPass(Pass *P, const PassInfo *PI, Function &F); + void addAnalysisImplsPair(const PassInfo *PI, Pass *P) { std::pair pir = std::make_pair(PI,P); AnalysisImpls.push_back(pir); @@ -197,6 +200,39 @@ AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { return *Result; } +/// getAnalysis() - This function is used by subclasses to get +/// to the analysis information that they claim to use by overriding the +/// getAnalysisUsage function. +/// +template +AnalysisType &Pass::getAnalysis(Function &F) { + assert(Resolver &&"Pass has not been inserted into a PassManager object!"); + + return getAnalysisID(getClassPassInfo(), F); +} + +template +AnalysisType &Pass::getAnalysisID(const PassInfo *PI, Function &F) { + assert(PI && "getAnalysis for unregistered pass!"); + assert(Resolver&&"Pass has not been inserted into a PassManager object!"); + // PI *must* appear in AnalysisImpls. Because the number of passes used + // should be a small number, we just do a linear search over a (dense) + // vector. + Pass *ResultPass = Resolver->findImplPass(this, PI, F); + assert (ResultPass && + "getAnalysis*() called on an analysis that was not " + "'required' by pass!"); + + // Because the AnalysisType may not be a subclass of pass (for + // AnalysisGroups), we must use dynamic_cast here to potentially adjust the + // return pointer (because the class may multiply inherit, once from pass, + // once from AnalysisType). + // + AnalysisType *Result = dynamic_cast(ResultPass); + assert(Result && "Pass does not implement interface required!"); + return *Result; +} + } // End llvm namespace #endif diff --git a/lib/VMCore/PassManager.cpp b/lib/VMCore/PassManager.cpp index 10e6e2fd8a4..97cd380cef0 100644 --- a/lib/VMCore/PassManager.cpp +++ b/lib/VMCore/PassManager.cpp @@ -906,6 +906,11 @@ Pass *AnalysisResolver::getAnalysisToUpdate(AnalysisID ID, bool dir) const { return PM.findAnalysisPass(ID, dir); } +Pass *AnalysisResolver::findImplPass(Pass *P, const PassInfo *AnalysisPI, + Function &F) { + return PM.getOnTheFlyPass(P, AnalysisPI, F); +} + //===----------------------------------------------------------------------===// // BBPassManager implementation