X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassAnalysisSupport.h;h=892d203ba3ac980c58936aa1e0b68fe18dcfb2f5;hb=682365dc80deb63aee3d1f884d86c2e886d171a5;hp=d27d66964979ccf9d099c5395f86c2b8d3adaa66;hpb=df9ec1052b089f7c7520823addd74b3fd97ba674;p=oota-llvm.git diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index d27d6696497..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,22 +19,27 @@ #ifndef LLVM_PASS_ANALYSIS_SUPPORT_H #define LLVM_PASS_ANALYSIS_SUPPORT_H +#include + +namespace llvm { + // 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. // @@ -42,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 // @@ -73,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; } }; @@ -83,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; @@ -126,4 +151,6 @@ AnalysisType *Pass::getAnalysisToUpdate() const { return dynamic_cast(Resolver->getAnalysisToUpdate(PI)); } +} // End llvm namespace + #endif