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