aboutsummaryrefslogtreecommitdiffstats
path: root/include/llvm/Pass.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/llvm/Pass.h')
-rw-r--r--include/llvm/Pass.h155
1 files changed, 15 insertions, 140 deletions
diff --git a/include/llvm/Pass.h b/include/llvm/Pass.h
index 097fc34..2cf85d4 100644
--- a/include/llvm/Pass.h
+++ b/include/llvm/Pass.h
@@ -13,6 +13,10 @@
// global optimizations should derive from FunctionPass, because they do not add
// or delete functions, they operate on the internals of the function.
//
+// Note that this file #includes PassSupport.h and PassAnalysisSupport.h (at the
+// bottom), so the APIs exposed by these files are also automatically available
+// to all users of this file.
+//
//===----------------------------------------------------------------------===//
#ifndef LLVM_PASS_H
@@ -26,6 +30,7 @@ class Function;
class Module;
class AnalysisUsage;
class AnalysisID;
+class PassInfo;
template<class UnitType> class PassManagerT;
struct AnalysisResolver;
@@ -38,8 +43,8 @@ class Pass {
friend class AnalysisResolver;
AnalysisResolver *Resolver; // AnalysisResolver this pass is owned by...
public:
- inline Pass(AnalysisResolver *AR = 0) : Resolver(AR) {}
- inline virtual ~Pass() {} // Destructor is virtual so we can be subclassed
+ Pass(AnalysisResolver *AR = 0) : Resolver(AR) {}
+ virtual ~Pass() {} // Destructor is virtual so we can be subclassed
// getPassName - Return a nice clean name for a pass. This should be
// overloaded by the pass, but if it is not, C++ RTTI will be consulted to get
@@ -47,6 +52,10 @@ public:
//
virtual const char *getPassName() const;
+ // getPassInfo - Return the PassInfo data structure that corresponds to this
+ // pass...
+ const PassInfo *getPassInfo() const;
+
// run - Run this pass, returning true if a modification was made to the
// module argument. This should be implemented by all concrete subclasses.
//
@@ -186,144 +195,10 @@ private:
virtual void addToPassManager(PassManagerT<BasicBlock> *PM,AnalysisUsage &AU);
};
-
-// 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<class AnalysisType>
-static Pass *CreatePass(AnalysisID ID) { return new AnalysisType(ID); }
-
-//===----------------------------------------------------------------------===//
-// 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)(AnalysisID); // Constructor to return the Analysis
-
- AnalysisID(); // Disable default ctor
- AnalysisID(unsigned id, Pass *(*Ct)(AnalysisID)) : 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<CallGraph>());
- //
- template<class AnalysisType>
- static AnalysisID create() {
- return AnalysisID(NextID++, CreatePass<AnalysisType>);
- }
-
- // 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<DominatorSet>(), true);
- //
- AnalysisID(const AnalysisID &AID, bool DependsOnlyOnCFG = false);
-
-
- inline Pass *createPass() const { return Constructor(*this); }
-
- 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
-// tracks analyses that the pass REQUIRES (must available when the pass runs),
-// 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.
+// Include support files that contain important APIs commonly used by Passes,
+// but that we want to seperate out to make it easier to read the header files.
//
-class AnalysisUsage {
- // Sets of analyses required and preserved by a pass
- std::vector<AnalysisID> Required, Preserved, Provided;
- bool PreservesAll;
-public:
- AnalysisUsage() : PreservesAll(false) {}
-
- // addRequires - Add the specified ID to the required set of the usage info
- // for a pass.
- //
- AnalysisUsage &addRequired(AnalysisID ID) {
- Required.push_back(ID);
- return *this;
- }
-
- // addPreserves - Add the specified ID to the set of analyses preserved by
- // this pass
- //
- AnalysisUsage &addPreserved(AnalysisID ID) {
- Preserved.push_back(ID);
- return *this;
- }
-
- void addProvided(AnalysisID ID) {
- Provided.push_back(ID);
- }
-
- // PreservesAll - 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:
- //
- // 1. Add or remove basic blocks from the function
- // 2. Modify terminator instructions in any way.
- //
- // This function annotates the AnalysisUsage info object to say that analyses
- // that only depend on the CFG are preserved by this pass.
- //
- void preservesCFG();
-
- const std::vector<AnalysisID> &getRequiredSet() const { return Required; }
- const std::vector<AnalysisID> &getPreservedSet() const { return Preserved; }
- const std::vector<AnalysisID> &getProvidedSet() const { return Provided; }
-};
-
-
-
-//===----------------------------------------------------------------------===//
-// AnalysisResolver - Simple interface implemented by PassManagers 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 *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;
- }
-
- virtual unsigned getDepth() const = 0;
-
- virtual void markPassUsed(AnalysisID P, Pass *User) = 0;
-
- void startPass(Pass *P) {}
- void endPass(Pass *P) {}
-protected:
- void setAnalysisResolver(Pass *P, AnalysisResolver *AR);
-};
+#include "llvm/PassSupport.h"
+#include "llvm/PassAnalysisSupport.h"
#endif