From: Chris Lattner Date: Wed, 21 Aug 2002 22:13:33 +0000 (+0000) Subject: - Make Pass::lookupPassInfo a public member X-Git-Url: http://plrg.eecs.uci.edu/git/?a=commitdiff_plain;h=1d63a167ecf964d00d2865fec182f1d67e7e3f36;p=oota-llvm.git - Make Pass::lookupPassInfo a public member - Fix Pass::getAnalysis() to use dynamic_cast instead of a static cast to handle the case where the cast from & two classes are not related via inheritance. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3423 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h index 5b55e0dba12..eaa8fda71c2 100644 --- a/include/llvm/Pass.h +++ b/include/llvm/Pass.h @@ -38,7 +38,6 @@ struct AnalysisResolver; // AnalysisID - Use the PassInfo to identify a pass... typedef const PassInfo* AnalysisID; - //===----------------------------------------------------------------------===// // Pass interface - Implemented by all 'passes'. Subclass this if you are an // interprocedural optimization or you do not fit into any of the more @@ -109,17 +108,19 @@ public: // dumpPassStructure - Implement the -debug-passes=PassStructure option virtual void dumpPassStructure(unsigned Offset = 0); + // getPassInfo - Static method to get the pass information from a class name. template static const PassInfo *getClassPassInfo() { return lookupPassInfo(typeid(AnalysisClass)); } -protected: // lookupPassInfo - Return the pass info object for the specified pass class, // or null if it is not known. static const PassInfo *lookupPassInfo(const std::type_info &TI); +protected: + // getAnalysis() - This function is used by subclasses to get to // the analysis information that they claim to use by overriding the // getAnalysisUsage function. @@ -129,7 +130,16 @@ protected: assert(Resolver && "Pass has not been inserted into a PassManager object!"); const PassInfo *PI = getClassPassInfo(); assert(PI && "getAnalysis for unregistered pass!"); - return *(AnalysisType*)Resolver->getAnalysis(PI); + + // 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(Resolver->getAnalysis(PI)); + assert(Result && "Pass does not implement interface required!"); + return *Result; } template