X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassAnalysisSupport.h;h=892d203ba3ac980c58936aa1e0b68fe18dcfb2f5;hb=c0ac317f93bef323437d791e4ef5a97f36d50515;hp=5b382703be28af803452b080e6f5004e159a7034;hpb=be583b914d8156b99d3da264d5adca37fee8dbc9;p=oota-llvm.git diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index 5b382703be2..892d203ba3a 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -1,4 +1,11 @@ -//===- llvm/PassAnalysisSupport.h - Analysis Pass Support code ---*- C++ -*-==// +//===- llvm/PassAnalysisSupport.h - Analysis Pass Support code --*- C++ -*-===// +// +// The LLVM Compiler Infrastructure +// +// This file was developed by the LLVM research group and is distributed under +// the University of Illinois Open Source License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// // // This file defines stuff that is used to define and "use" Analysis Passes. // This file is automatically #included by Pass.h, so: @@ -12,24 +19,27 @@ #ifndef LLVM_PASS_ANALYSIS_SUPPORT_H #define LLVM_PASS_ANALYSIS_SUPPORT_H -// No need to include Pass.h, we are being included by it! +#include + +namespace llvm { -#include +// No need to include Pass.h, we are being included by it! //===----------------------------------------------------------------------===// // AnalysisUsage - Represent the analysis usage information of a pass. This -// tracks analyses that the pass REQUIRES (must available when the pass runs), -// and analyses that the pass PRESERVES (the pass does not invalidate the +// tracks analyses that the pass REQUIRES (must be available when the pass +// runs), REQUIRES TRANSITIVE (must be available throughout the lifetime of the +// pass), and analyses that the pass PRESERVES (the pass does not invalidate the // results of these analyses). This information is provided by a pass to the // Pass infrastructure through the getAnalysisUsage virtual function. // class AnalysisUsage { // Sets of analyses required and preserved by a pass - std::vector Required, Preserved; + std::vector Required, RequiredTransitive, Preserved; bool PreservesAll; public: AnalysisUsage() : PreservesAll(false) {} - + // addRequired - Add the specified ID to the required set of the usage info // for a pass. // @@ -44,6 +54,15 @@ public: return *this; } + template + AnalysisUsage &addRequiredTransitive() { + AnalysisID ID = Pass::getClassPassInfo(); + assert(ID && "Pass class not registered!"); + Required.push_back(ID); + RequiredTransitive.push_back(ID); + return *this; + } + // addPreserved - Add the specified ID to the set of analyses preserved by // this pass // @@ -75,6 +94,9 @@ public: void setPreservesCFG(); const std::vector &getRequiredSet() const { return Required; } + const std::vector &getRequiredTransitiveSet() const { + return RequiredTransitive; + } const std::vector &getPreservedSet() const { return Preserved; } }; @@ -85,6 +107,7 @@ public: // is used to pull analysis information out of them. // struct AnalysisResolver { + virtual ~AnalysisResolver(); virtual Pass *getAnalysisOrNullUp(AnalysisID ID) const = 0; virtual Pass *getAnalysisOrNullDown(AnalysisID ID) const = 0; virtual void addPass(ImmutablePass *IP, AnalysisUsage &AU) = 0; @@ -112,4 +135,22 @@ protected: void setAnalysisResolver(Pass *P, AnalysisResolver *AR); }; +/// getAnalysisToUpdate() - This function is used by subclasses +/// to get to the analysis information that might be around that needs to be +/// updated. This is different than getAnalysis in that it can fail (ie the +/// analysis results haven't been computed), so should only be used if you +/// provide the capability to update an analysis that exists. This method is +/// often used by transformation APIs to update analysis results for a pass +/// automatically as the transform is performed. +/// +template +AnalysisType *Pass::getAnalysisToUpdate() const { + assert(Resolver && "Pass not resident in a PassManager object!"); + const PassInfo *PI = getClassPassInfo(); + if (PI == 0) return 0; + return dynamic_cast(Resolver->getAnalysisToUpdate(PI)); +} + +} // End llvm namespace + #endif