#include <vector>
#include <map>
#include <iosfwd>
+#include <typeinfo>
class Value;
class BasicBlock;
class Function;
// 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);
+
// 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 &getAnalysis() {
- assert(Resolver && "Pass not resident in a PassManager object!");
- return *(AnalysisType*)Resolver->getAnalysis(AnalysisType::ID);
+ 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);
}
template<typename AnalysisType>
AnalysisType &getAnalysisID(const PassInfo *PI) {
- assert(Resolver && "Pass not resident in a PassManager object!");
+ assert(Resolver && "Pass has not been inserted into a PassManager object!");
+ assert(PI && "getAnalysis for unregistered pass!");
return *(AnalysisType*)Resolver->getAnalysis(PI);
}
template<typename AnalysisType>
AnalysisType *getAnalysisToUpdate() {
assert(Resolver && "Pass not resident in a PassManager object!");
- return (AnalysisType*)Resolver->getAnalysisToUpdate(AnalysisType::ID);
+ const PassInfo *PI = getClassPassInfo<AnalysisType>();
+ if (PI == 0) return 0;
+ return (AnalysisType*)Resolver->getAnalysisToUpdate(PI);
}
}
template<class PassClass>
AnalysisUsage &addRequired() {
- Required.push_back(PassClass::ID);
+ Required.push_back(Pass::getClassPassInfo<PassClass>());
return *this;
}
template<class PassClass>
AnalysisUsage &addPreserved() {
- Preserved.push_back(PassClass::ID);
+ Preserved.push_back(Pass::getClassPassInfo<PassClass>());
return *this;
}
#include "llvm/Module.h"
#include "Support/STLExtras.h"
#include "Support/TypeInfo.h"
-#include <typeinfo>
#include <stdio.h>
#include <sys/resource.h>
#include <sys/unistd.h>
// pass...
const PassInfo *Pass::getPassInfo() const {
if (PassInfoCache) return PassInfoCache;
+ return lookupPassInfo(typeid(*this));
+}
+
+const PassInfo *Pass::lookupPassInfo(const std::type_info &TI) {
if (PassInfoMap == 0) return 0;
- std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->find(typeid(*this));
+ std::map<TypeInfo, PassInfo*>::iterator I = PassInfoMap->find(TI);
return (I != PassInfoMap->end()) ? I->second : 0;
}