- Make Pass::lookupPassInfo a public member
- Fix Pass::getAnalysis<AnalysisType>() to use dynamic_cast instead of a
static cast to handle the case where the cast from & two classes are not
related via inheritance.
llvm-svn: 3423
This commit is contained in:
parent
e49f299041
commit
a8d76433ce
|
|
@ -38,7 +38,6 @@ struct AnalysisResolver;
|
||||||
// AnalysisID - Use the PassInfo to identify a pass...
|
// AnalysisID - Use the PassInfo to identify a pass...
|
||||||
typedef const PassInfo* AnalysisID;
|
typedef const PassInfo* AnalysisID;
|
||||||
|
|
||||||
|
|
||||||
//===----------------------------------------------------------------------===//
|
//===----------------------------------------------------------------------===//
|
||||||
// Pass interface - Implemented by all 'passes'. Subclass this if you are an
|
// Pass interface - Implemented by all 'passes'. Subclass this if you are an
|
||||||
// interprocedural optimization or you do not fit into any of the more
|
// interprocedural optimization or you do not fit into any of the more
|
||||||
|
|
@ -109,17 +108,19 @@ public:
|
||||||
// dumpPassStructure - Implement the -debug-passes=PassStructure option
|
// dumpPassStructure - Implement the -debug-passes=PassStructure option
|
||||||
virtual void dumpPassStructure(unsigned Offset = 0);
|
virtual void dumpPassStructure(unsigned Offset = 0);
|
||||||
|
|
||||||
|
|
||||||
// getPassInfo - Static method to get the pass information from a class name.
|
// getPassInfo - Static method to get the pass information from a class name.
|
||||||
template<typename AnalysisClass>
|
template<typename AnalysisClass>
|
||||||
static const PassInfo *getClassPassInfo() {
|
static const PassInfo *getClassPassInfo() {
|
||||||
return lookupPassInfo(typeid(AnalysisClass));
|
return lookupPassInfo(typeid(AnalysisClass));
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
|
||||||
// lookupPassInfo - Return the pass info object for the specified pass class,
|
// lookupPassInfo - Return the pass info object for the specified pass class,
|
||||||
// or null if it is not known.
|
// or null if it is not known.
|
||||||
static const PassInfo *lookupPassInfo(const std::type_info &TI);
|
static const PassInfo *lookupPassInfo(const std::type_info &TI);
|
||||||
|
|
||||||
|
protected:
|
||||||
|
|
||||||
// getAnalysis<AnalysisType>() - This function is used by subclasses to get to
|
// getAnalysis<AnalysisType>() - This function is used by subclasses to get to
|
||||||
// the analysis information that they claim to use by overriding the
|
// the analysis information that they claim to use by overriding the
|
||||||
// getAnalysisUsage function.
|
// getAnalysisUsage function.
|
||||||
|
|
@ -129,7 +130,16 @@ protected:
|
||||||
assert(Resolver && "Pass has not been inserted into a PassManager object!");
|
assert(Resolver && "Pass has not been inserted into a PassManager object!");
|
||||||
const PassInfo *PI = getClassPassInfo<AnalysisType>();
|
const PassInfo *PI = getClassPassInfo<AnalysisType>();
|
||||||
assert(PI && "getAnalysis for unregistered pass!");
|
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<AnalysisType*>(Resolver->getAnalysis(PI));
|
||||||
|
assert(Result && "Pass does not implement interface required!");
|
||||||
|
return *Result;
|
||||||
}
|
}
|
||||||
|
|
||||||
template<typename AnalysisType>
|
template<typename AnalysisType>
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue