mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-08-17 05:29:24 +00:00
- 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. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@3423 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
b63b29d9b0
commit
1d63a167ec
@ -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<typename AnalysisClass>
|
||||
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<AnalysisType>() - 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<AnalysisType>();
|
||||
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>
|
||||
|
Loading…
Reference in New Issue
Block a user