Revert the part of 75177 that split ConstantRange into two classes, and
[oota-llvm.git] / include / llvm / Pass.h
index 58bdfc010afaba73bd0e3ea45bf1224e02c66fff..51186fa2db021008aa8af761ccd259c03167a830 100644 (file)
 #ifndef LLVM_PASS_H
 #define LLVM_PASS_H
 
+#include "llvm/Module.h"
 #include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Streams.h"
-#include <vector>
-#include <map>
-#include <iosfwd>
 #include <cassert>
+#include <iosfwd>
+#include <utility>
+#include <vector>
 
 namespace llvm {
 
-class Value;
 class BasicBlock;
 class Function;
 class Module;
@@ -48,6 +48,7 @@ class ImmutablePass;
 class PMStack;
 class AnalysisResolver;
 class PMDataManager;
+class LLVMContext;
 
 // AnalysisID - Use the PassInfo to identify a pass...
 typedef const PassInfo* AnalysisID;
@@ -74,16 +75,19 @@ class Pass {
   AnalysisResolver *Resolver;  // Used to resolve analysis
   intptr_t PassID;
 
-  // AnalysisImpls - This keeps track of which passes implement the interfaces
-  // that are required by the current pass (to implement getAnalysis()).
-  //
-  std::vector<std::pair<const PassInfo*, Pass*> > AnalysisImpls;
-
   void operator=(const Pass&);  // DO NOT IMPLEMENT
   Pass(const Pass &);           // DO NOT IMPLEMENT
+  
+protected:
+  LLVMContext *Context;
+  
 public:
-  explicit Pass(intptr_t pid) : Resolver(0), PassID(pid) {}
-  explicit Pass(const void *pid) : Resolver(0), PassID((intptr_t)pid) {}
+  explicit Pass(intptr_t pid) : Resolver(0), PassID(pid) {
+    assert(pid && "pid cannot be 0");
+  }
+  explicit Pass(const void *pid) : Resolver(0), PassID((intptr_t)pid) {
+    assert(pid && "pid cannot be 0"); 
+  }
   virtual ~Pass();
 
   /// getPassName - Return a nice clean name for a pass.  This usually
@@ -110,10 +114,10 @@ public:
 
   /// Each pass is responsible for assigning a pass manager to itself.
   /// PMS is the stack of available pass manager. 
-  virtual void assignPassManager(PMStack &PMS
-                                 PassManagerType = PMT_Unknown) {}
+  virtual void assignPassManager(PMStack &, 
+                                 PassManagerType = PMT_Unknown) {}
   /// Check if available pass managers are suitable for this pass or not.
-  virtual void preparePassManager(PMStack &PMS) {}
+  virtual void preparePassManager(PMStack &) {}
   
   ///  Return what kind of Pass Manager can manage this pass.
   virtual PassManagerType getPotentialPassManagerType() const {
@@ -126,21 +130,15 @@ public:
     Resolver = AR; 
   }
   inline AnalysisResolver *getResolver() { 
-    assert (Resolver && "Resolver is not set");
     return Resolver; 
   }
 
-  /// isAnalysis - Return true if this pass is  implementing an analysis pass.
-  virtual bool isAnalysis() const {
-    return false;
-  }
-
   /// getAnalysisUsage - This function should be overriden by passes that need
   /// analysis information to do their job.  If a pass specifies that it uses a
   /// particular analysis result to this function, it can then use the
   /// getAnalysis<AnalysisType>() function, below.
   ///
-  virtual void getAnalysisUsage(AnalysisUsage &Info) const {
+  virtual void getAnalysisUsage(AnalysisUsage &) const {
     // By default, no analysis results are used, all are invalidated.
   }
 
@@ -173,22 +171,22 @@ public:
   // or null if it is not known.
   static const PassInfo *lookupPassInfo(intptr_t TI);
 
-  /// getAnalysisToUpdate<AnalysisType>() - 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.
+  /// getAnalysisIfAvailable<AnalysisType>() - Subclasses use this function to
+  /// get analysis information that might be around, for example to update it.
+  /// This is different than getAnalysis in that it can fail (if the analysis
+  /// results haven't been computed), so should only be used if you can handle
+  /// the case when the analysis is not available.  This method is often used by
+  /// transformation APIs to update analysis results for a pass automatically as
+  /// the transform is performed.
   ///
-  template<typename AnalysisType>
-  AnalysisType *getAnalysisToUpdate() const; // Defined in PassAnalysisSupport.h
+  template<typename AnalysisType> AnalysisType *
+    getAnalysisIfAvailable() const; // Defined in PassAnalysisSupport.h
 
   /// mustPreserveAnalysisID - This method serves the same function as
-  /// getAnalysisToUpdate, but works if you just have an AnalysisID.  This
+  /// getAnalysisIfAvailable, but works if you just have an AnalysisID.  This
   /// obviously cannot give you a properly typed instance of the class if you
-  /// don't have the class name available (use getAnalysisToUpdate if you do),
-  /// but it can tell you if you need to preserve the pass at least.
+  /// don't have the class name available (use getAnalysisIfAvailable if you
+  /// do), but it can tell you if you need to preserve the pass at least.
   ///
   bool mustPreserveAnalysisID(const PassInfo *AnalysisID) const;
 
@@ -256,10 +254,11 @@ public:
 
   /// ImmutablePasses are never run.
   ///
-  bool runOnModule(Module &M) { return false; }
+  bool runOnModule(Module &) { return false; }
 
   explicit ImmutablePass(intptr_t pid) : ModulePass(pid) {}
-  explicit ImmutablePass(const void *pid) : ModulePass(pid) {}
+  explicit ImmutablePass(const void *pid) 
+  : ModulePass(pid) {}
   
   // Force out-of-line virtual method.
   virtual ~ImmutablePass();
@@ -282,7 +281,10 @@ public:
   /// doInitialization - Virtual method overridden by subclasses to do
   /// any necessary per-module initialization.
   ///
-  virtual bool doInitialization(Module &M) { return false; }
+  virtual bool doInitialization(Module &M) {
+    Context = &M.getContext();
+    return false;
+  }
 
   /// runOnFunction - Virtual method overriden by subclasses to do the
   /// per-function processing of the pass.
@@ -292,7 +294,7 @@ public:
   /// doFinalization - Virtual method overriden by subclasses to do any post
   /// processing needed after all passes have run.
   ///
-  virtual bool doFinalization(Module &M) { return false; }
+  virtual bool doFinalization(Module &) { return false; }
 
   /// runOnModule - On a module, we run this pass by initializing,
   /// ronOnFunction'ing once for every function in the module, then by
@@ -334,12 +336,15 @@ public:
   /// doInitialization - Virtual method overridden by subclasses to do
   /// any necessary per-module initialization.
   ///
-  virtual bool doInitialization(Module &M) { return false; }
+  virtual bool doInitialization(Module &M) { 
+    Context = &M.getContext();
+    return false;
+  }
 
   /// doInitialization - Virtual method overridden by BasicBlockPass subclasses
   /// to do any necessary per-function initialization.
   ///
-  virtual bool doInitialization(Function &F) { return false; }
+  virtual bool doInitialization(Function &) { return false; }
 
   /// runOnBasicBlock - Virtual method overriden by subclasses to do the
   /// per-basicblock processing of the pass.
@@ -349,12 +354,12 @@ public:
   /// doFinalization - Virtual method overriden by BasicBlockPass subclasses to
   /// do any post processing needed after all passes have run.
   ///
-  virtual bool doFinalization(Function &F) { return false; }
+  virtual bool doFinalization(Function &) { return false; }
 
   /// doFinalization - Virtual method overriden by subclasses to do any post
   /// processing needed after all passes have run.
   ///
-  virtual bool doFinalization(Module &M) { return false; }
+  virtual bool doFinalization(Module &) { return false; }
 
 
   // To run this pass on a function, we simply call runOnBasicBlock once for