aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/PassAnalysisSupport.h
diff options
context:
space:
mode:
authorDevang Patel <dpatel@apple.com>2006-12-13 00:23:44 +0000
committerDevang Patel <dpatel@apple.com>2006-12-13 00:23:44 +0000
commit3f2577decba715615597352c4b3e2a551d44b64c (patch)
treea69866dcab595faf6d70ebb6b3aee30683f8ad0b /include/llvm/PassAnalysisSupport.h
parent37a6f7966c39f69a92419d37949a94a758c29e90 (diff)
downloadexternal_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.h40
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