Changes in directory llvm/include/llvm:
Pass.h updated: 1.57 -> 1.58 PassAnalysisSupport.h updated: 1.23 -> 1.24 --- Log message: Move getAnalysis() and getAnalysisID() definitions from Pass.h to PassAnalysisSupport.h --- Diffs of the changes: (+43 -33) Pass.h | 36 +++--------------------------------- PassAnalysisSupport.h | 40 ++++++++++++++++++++++++++++++++++++++++ 2 files changed, 43 insertions(+), 33 deletions(-) Index: llvm/include/llvm/Pass.h diff -u llvm/include/llvm/Pass.h:1.57 llvm/include/llvm/Pass.h:1.58 --- llvm/include/llvm/Pass.h:1.57 Fri Dec 8 17:52:04 2006 +++ llvm/include/llvm/Pass.h Tue Dec 12 18:23:44 2006 @@ -173,41 +173,11 @@ /// getAnalysisUsage function. /// template<typename AnalysisType> - AnalysisType &getAnalysis() const { - assert(Resolver && "Pass has not been inserted into a PassManager object!"); - const PassInfo *PI = getClassPassInfo<AnalysisType>(); - return getAnalysisID<AnalysisType>(PI); - } + AnalysisType &getAnalysis() const; // Defined in PassAnalysisSupport.h template<typename AnalysisType> - AnalysisType &getAnalysisID(const PassInfo *PI) const { - assert(Resolver && "Pass has not been inserted into a PassManager object!"); - assert(PI && "getAnalysis for unregistered pass!"); - - // 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 = 0; - for (unsigned i = 0; ; ++i) { - assert(i != AnalysisImpls.size() && - "getAnalysis*() called on an analysis that was not " - "'required' by pass!"); - if (AnalysisImpls[i].first == PI) { - ResultPass = AnalysisImpls[i].second; - break; - } - } - - // 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; - } - + AnalysisType &getAnalysisID(const PassInfo *PI) const; + private: template<typename Trait> friend class PassManagerT; friend class ModulePassManager; Index: llvm/include/llvm/PassAnalysisSupport.h diff -u llvm/include/llvm/PassAnalysisSupport.h:1.23 llvm/include/llvm/PassAnalysisSupport.h:1.24 --- llvm/include/llvm/PassAnalysisSupport.h:1.23 Fri Dec 8 17:28:54 2006 +++ llvm/include/llvm/PassAnalysisSupport.h Tue Dec 12 18:23:44 2006 @@ -195,6 +195,46 @@ return dynamic_cast<AnalysisType*>(Resolver->getAnalysisToUpdate(PI)); } +/// 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() const { + assert(Resolver && "Pass has not been inserted into a PassManager object!"); + const PassInfo *PI = getClassPassInfo<AnalysisType>(); + return getAnalysisID<AnalysisType>(PI); +} + +template<typename AnalysisType> +AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { + assert(Resolver && "Pass has not been inserted into a PassManager object!"); + assert(PI && "getAnalysis for unregistered pass!"); + + // 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 = 0; + for (unsigned i = 0; ; ++i) { + assert(i != AnalysisImpls.size() && + "getAnalysis*() called on an analysis that was not " + "'required' by pass!"); + if (AnalysisImpls[i].first == PI) { + ResultPass = AnalysisImpls[i].second; + break; + } + } + + // 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