diff options
author | Devang Patel <dpatel@apple.com> | 2006-12-13 00:23:44 +0000 |
---|---|---|
committer | Devang Patel <dpatel@apple.com> | 2006-12-13 00:23:44 +0000 |
commit | 3f2577decba715615597352c4b3e2a551d44b64c (patch) | |
tree | a69866dcab595faf6d70ebb6b3aee30683f8ad0b /include/llvm/PassAnalysisSupport.h | |
parent | 37a6f7966c39f69a92419d37949a94a758c29e90 (diff) | |
download | external_llvm-3f2577decba715615597352c4b3e2a551d44b64c.zip external_llvm-3f2577decba715615597352c4b3e2a551d44b64c.tar.gz external_llvm-3f2577decba715615597352c4b3e2a551d44b64c.tar.bz2 |
Move getAnalysis() and getAnalysisID() definitions from Pass.h to
PassAnalysisSupport.h
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@32518 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'include/llvm/PassAnalysisSupport.h')
-rw-r--r-- | include/llvm/PassAnalysisSupport.h | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index 3ef43fd..d2aec0b 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -195,6 +195,46 @@ AnalysisType *Pass::getAnalysisToUpdate() const { return dynamic_cast<AnalysisType*>(Resolver->getAnalysisToUpdate(PI)); } +/// 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 &Pass::getAnalysis() const { + assert(Resolver && "Pass has not been inserted into a PassManager object!"); + const PassInfo *PI = getClassPassInfo<AnalysisType>(); + return getAnalysisID<AnalysisType>(PI); +} + +template<typename AnalysisType> +AnalysisType &Pass::getAnalysisID(const PassInfo *PI) const { + assert(Resolver && "Pass has not been inserted into a PassManager object!"); + assert(PI && "getAnalysis for unregistered pass!"); + + // PI *must* appear in AnalysisImpls. Because the number of passes used + // should be a small number, we just do a linear search over a (dense) + // vector. + Pass *ResultPass = 0; + for (unsigned i = 0; ; ++i) { + assert(i != AnalysisImpls.size() && + "getAnalysis*() called on an analysis that was not " + "'required' by pass!"); + if (AnalysisImpls[i].first == PI) { + ResultPass = AnalysisImpls[i].second; + break; + } + } + + // 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*>(ResultPass); + assert(Result && "Pass does not implement interface required!"); + return *Result; +} + } // End llvm namespace #endif |