Create a new class, MemOperand, for describing memory references
[oota-llvm.git] / include / llvm / Pass.h
index b82e4b31c525ffe06b9fd1ee9092bae79fb208c4..71149d4e585dd57a722a42680366fa0f4cc216de 100644 (file)
@@ -2,8 +2,8 @@
 //
 //                     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 is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
 //
 //===----------------------------------------------------------------------===//
 //
 #ifndef LLVM_PASS_H
 #define LLVM_PASS_H
 
+#include "llvm/Support/DataTypes.h"
 #include "llvm/Support/Streams.h"
 #include <vector>
 #include <deque>
 #include <map>
 #include <iosfwd>
-#include <typeinfo>
 #include <cassert>
 
 namespace llvm {
@@ -46,8 +46,6 @@ class Module;
 class AnalysisUsage;
 class PassInfo;
 class ImmutablePass;
-class BasicBlockPassManager;
-class ModulePassManager;
 class PMStack;
 class AnalysisResolver;
 class PMDataManager;
@@ -77,7 +75,7 @@ typedef enum PassManagerType PassManagerType;
 ///
 class Pass {
   AnalysisResolver *Resolver;  // Used to resolve analysis
-  const PassInfo *PassInfoCache;
+  intptr_t PassID;
 
   // AnalysisImpls - This keeps track of which passes implement the interfaces
   // that are required by the current pass (to implement getAnalysis()).
@@ -87,7 +85,8 @@ class Pass {
   void operator=(const Pass&);  // DO NOT IMPLEMENT
   Pass(const Pass &);           // DO NOT IMPLEMENT
 public:
-  Pass(intptr_t pid = 0) : Resolver(0), PassInfoCache(0) {}
+  explicit Pass(intptr_t pid) : Resolver(0), PassID(pid) {}
+  explicit Pass(const void *pid) : Resolver(0), PassID((intptr_t)pid) {}
   virtual ~Pass();
 
   /// getPassName - Return a nice clean name for a pass.  This usually
@@ -133,8 +132,14 @@ public:
   }
 
   // Access AnalysisResolver
-  inline void setResolver(AnalysisResolver *AR) { Resolver = AR; }
-  inline AnalysisResolver *getResolver() { return Resolver; }
+  inline void setResolver(AnalysisResolver *AR) { 
+    assert (!Resolver && "Resolver is already set");
+    Resolver = AR; 
+  }
+  inline AnalysisResolver *getResolver() { 
+    assert (Resolver && "Resolver is not set");
+    return Resolver; 
+  }
 
   /// getAnalysisUsage - This function should be overriden by passes that need
   /// analysis information to do their job.  If a pass specifies that it uses a
@@ -158,17 +163,21 @@ public:
   ///
   virtual void releaseMemory() {}
 
+  /// verifyAnalysis() - This member can be implemented by a analysis pass to
+  /// check state of analysis information. 
+  virtual void verifyAnalysis() const {}
+
   // dumpPassStructure - Implement the -debug-passes=PassStructure option
   virtual void dumpPassStructure(unsigned Offset = 0);
 
   template<typename AnalysisClass>
   static const PassInfo *getClassPassInfo() {
-    return lookupPassInfo(typeid(AnalysisClass));
+    return lookupPassInfo(intptr_t(&AnalysisClass::ID));
   }
 
   // lookupPassInfo - Return the pass info object for the specified pass class,
   // or null if it is not known.
-  static const PassInfo *lookupPassInfo(const std::type_info &TI);
+  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
@@ -232,7 +241,8 @@ public:
     return PMT_ModulePassManager;
   }
 
-  ModulePass(intptr_t pid) : Pass(pid) {}
+  explicit ModulePass(intptr_t pid) : Pass(pid) {}
+  explicit ModulePass(const void *pid) : Pass(pid) {}
   // Force out-of-line virtual method.
   virtual ~ModulePass();
 };
@@ -255,9 +265,11 @@ public:
 
   /// ImmutablePasses are never run.
   ///
-  virtual bool runOnModule(Module &M) { return false; }
+  bool runOnModule(Module &M) { return false; }
 
-  ImmutablePass(intptr_t pid) : ModulePass(pid) {}
+  explicit ImmutablePass(intptr_t pid) : ModulePass(pid) {}
+  explicit ImmutablePass(const void *pid) : ModulePass(pid) {}
+  
   // Force out-of-line virtual method.
   virtual ~ImmutablePass();
 };
@@ -273,8 +285,9 @@ public:
 ///
 class FunctionPass : public Pass {
 public:
-  FunctionPass(intptr_t pid) : Pass(pid) {}
-  
+  explicit FunctionPass(intptr_t pid) : Pass(pid) {}
+  explicit FunctionPass(const void *pid) : Pass(pid) {}
+
   /// doInitialization - Virtual method overridden by subclasses to do
   /// any necessary per-module initialization.
   ///
@@ -324,8 +337,9 @@ public:
 ///
 class BasicBlockPass : public Pass {
 public:
-  BasicBlockPass(intptr_t pid) : Pass(pid) {}
-  
+  explicit BasicBlockPass(intptr_t pid) : Pass(pid) {}
+  explicit BasicBlockPass(const void *pid) : Pass(pid) {}
+
   /// doInitialization - Virtual method overridden by subclasses to do
   /// any necessary per-module initialization.
   ///