X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FPassAnalysisSupport.h;h=490c5bf12c64637068b886669f937d38d29ef9a8;hb=87944916a4764dabc2f89cbec0a6c7e439c28530;hp=c105c390c55b5b2a2aa4e8105585cbff19ac27c7;hpb=aabff771653cb70b9b53d9beee027d680c5e29fd;p=oota-llvm.git diff --git a/include/llvm/PassAnalysisSupport.h b/include/llvm/PassAnalysisSupport.h index c105c390c55..490c5bf12c6 100644 --- a/include/llvm/PassAnalysisSupport.h +++ b/include/llvm/PassAnalysisSupport.h @@ -15,59 +15,6 @@ // No need to include Pass.h, we are being included by it! -// CreatePass - Helper template to invoke the constructor for the AnalysisID -// class. Note that this should be a template internal to AnalysisID, but -// GCC 2.95.3 crashes if we do that, doh. -// -template -static Pass *CreatePass() { return new AnalysisType(); } - -//===----------------------------------------------------------------------===// -// AnalysisID - This class is used to uniquely identify an analysis pass that -// is referenced by a transformation. -// -class AnalysisID { - static unsigned NextID; // Next ID # to deal out... - unsigned ID; // Unique ID for this analysis - Pass *(*Constructor)(); // Constructor to return the Analysis - - AnalysisID(); // Disable default ctor - AnalysisID(unsigned id, Pass *(*Ct)()) : ID(id), Constructor(Ct) {} -public: - // create - the only way to define a new AnalysisID. This static method is - // supposed to be used to define the class static AnalysisID's that are - // provided by analysis passes. In the implementation (.cpp) file for the - // class, there should be a line that looks like this (using CallGraph as an - // example): - // - // AnalysisID CallGraph::ID(AnalysisID::create()); - // - template - static AnalysisID create() { - return AnalysisID(NextID++, CreatePass); - } - - // Special Copy Constructor - This is how analysis passes declare that they - // only depend on the CFG of the function they are working on, so they are not - // invalidated by other passes that do not modify the CFG. This should be - // used like this: - // AnalysisID DominatorSet::ID(AnalysisID::create(), true); - // - AnalysisID(const AnalysisID &AID, bool DependsOnlyOnCFG = false); - - - inline Pass *createPass() const { return Constructor(); } - - inline bool operator==(const AnalysisID &A) const { - return A.ID == ID; - } - inline bool operator!=(const AnalysisID &A) const { - return A.ID != ID; - } - inline bool operator<(const AnalysisID &A) const { - return ID < A.ID; - } -}; //===----------------------------------------------------------------------===// // AnalysisUsage - Represent the analysis usage information of a pass. This @@ -78,37 +25,45 @@ public: // class AnalysisUsage { // Sets of analyses required and preserved by a pass - std::vector Required, Preserved, Provided; + std::vector Required, Preserved; bool PreservesAll; public: AnalysisUsage() : PreservesAll(false) {} - // addRequires - Add the specified ID to the required set of the usage info + // addRequired - Add the specified ID to the required set of the usage info // for a pass. // - AnalysisUsage &addRequired(AnalysisID ID) { + AnalysisUsage &addRequiredID(AnalysisID ID) { Required.push_back(ID); return *this; } + template + AnalysisUsage &addRequired() { + assert(Pass::getClassPassInfo() && "Pass class not registered!"); + Required.push_back(Pass::getClassPassInfo()); + return *this; + } - // addPreserves - Add the specified ID to the set of analyses preserved by + // addPreserved - Add the specified ID to the set of analyses preserved by // this pass // - AnalysisUsage &addPreserved(AnalysisID ID) { + AnalysisUsage &addPreservedID(AnalysisID ID) { Preserved.push_back(ID); return *this; } - void addProvided(AnalysisID ID) { - Provided.push_back(ID); + template + AnalysisUsage &addPreserved() { + assert(Pass::getClassPassInfo() && "Pass class not registered!"); + Preserved.push_back(Pass::getClassPassInfo()); + return *this; } - // PreservesAll - Set by analyses that do not transform their input at all + // setPreservesAll - Set by analyses that do not transform their input at all void setPreservesAll() { PreservesAll = true; } bool preservesAll() const { return PreservesAll; } - // preservesCFG - This function should be called to by the pass, iff they do - // not: + // preservesCFG - This function should be called by the pass, iff they do not: // // 1. Add or remove basic blocks from the function // 2. Modify terminator instructions in any way. @@ -120,31 +75,32 @@ public: const std::vector &getRequiredSet() const { return Required; } const std::vector &getPreservedSet() const { return Preserved; } - const std::vector &getProvidedSet() const { return Provided; } }; //===----------------------------------------------------------------------===// -// AnalysisResolver - Simple interface implemented by PassManagers objects that +// AnalysisResolver - Simple interface implemented by PassManager objects that // is used to pull analysis information out of them. // struct AnalysisResolver { virtual Pass *getAnalysisOrNullUp(AnalysisID ID) const = 0; virtual Pass *getAnalysisOrNullDown(AnalysisID ID) const = 0; - Pass *getAnalysis(AnalysisID ID) { + Pass *getAnalysis(AnalysisID ID) const { Pass *Result = getAnalysisOrNullUp(ID); assert(Result && "Pass has an incorrect analysis uses set!"); return Result; } // getAnalysisToUpdate - Return an analysis result or null if it doesn't exist - Pass *getAnalysisToUpdate(AnalysisID ID) { - Pass *Result = getAnalysisOrNullUp(ID); - return Result; + Pass *getAnalysisToUpdate(AnalysisID ID) const { + return getAnalysisOrNullUp(ID); } + // Methods for introspecting into pass manager objects... virtual unsigned getDepth() const = 0; + virtual unsigned getNumContainedPasses() const = 0; + virtual const Pass *getContainedPass(unsigned N) const = 0; virtual void markPassUsed(AnalysisID P, Pass *User) = 0;