Changes in directory llvm/include/llvm:
Pass.h updated: 1.83 -> 1.84 PassAnalysisSupport.h updated: 1.29 -> 1.30 --- Log message: Proivde getAnalysis<FPAnalysis>(Func) support. --- Diffs of the changes: (+41 -0) Pass.h | 5 +++++ PassAnalysisSupport.h | 36 ++++++++++++++++++++++++++++++++++++ 2 files changed, 41 insertions(+) Index: llvm/include/llvm/Pass.h diff -u llvm/include/llvm/Pass.h:1.83 llvm/include/llvm/Pass.h:1.84 --- llvm/include/llvm/Pass.h:1.83 Mon Apr 16 13:51:25 2007 +++ llvm/include/llvm/Pass.h Mon Apr 16 15:56:24 2007 @@ -197,8 +197,13 @@ AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h template<typename AnalysisType> + AnalysisType &getAnalysis(Function &F); // Defined in PassanalysisSupport.h + + template<typename AnalysisType> AnalysisType &getAnalysisID(const PassInfo *PI) const; + template<typename AnalysisType> + AnalysisType &getAnalysisID(const PassInfo *PI, Function &F); }; inline std::ostream &operator<<(std::ostream &OS, const Pass &P) { Index: llvm/include/llvm/PassAnalysisSupport.h diff -u llvm/include/llvm/PassAnalysisSupport.h:1.29 llvm/include/llvm/PassAnalysisSupport.h:1.30 --- llvm/include/llvm/PassAnalysisSupport.h:1.29 Fri Mar 23 13:44:11 2007 +++ llvm/include/llvm/PassAnalysisSupport.h Mon Apr 16 15:56:24 2007 @@ -127,6 +127,9 @@ 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<const PassInfo*, Pass*> pir = std::make_pair(PI,P); AnalysisImpls.push_back(pir); @@ -197,6 +200,39 @@ return *Result; } +/// getAnalysis<AnalysisType>() - This function is used by subclasses to get +/// to the analysis information that they claim to use by overriding the +/// getAnalysisUsage function. +/// +template<typename AnalysisType> +AnalysisType &Pass::getAnalysis(Function &F) { + assert(Resolver &&"Pass has not been inserted into a PassManager object!"); + + return getAnalysisID<AnalysisType>(getClassPassInfo<AnalysisType>(), F); +} + +template<typename AnalysisType> +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<AnalysisType*>(ResultPass); + assert(Result && "Pass does not implement interface required!"); + return *Result; +} + } // End llvm namespace #endif _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits