Speculatively revert r108813, in an attempt to get the self-host buildbots working...
[oota-llvm.git] / include / llvm / PassSupport.h
index 0eae122007f72df9fd91a630d610ee2a4498eb9f..09abe93e916dd07b46c6501a479396ca595038de 100644 (file)
@@ -21,7 +21,7 @@
 #ifndef LLVM_PASS_SUPPORT_H
 #define LLVM_PASS_SUPPORT_H
 
-// No need to include Pass.h, we are being included by it!
+#include "Pass.h"
 
 namespace llvm {
 
@@ -36,6 +36,10 @@ class TargetMachine;
 class PassInfo {
 public:
   typedef Pass* (*NormalCtor_t)();
+  struct InterfaceInfo {
+    const PassInfo *interface;
+    const InterfaceInfo *next;
+  };
 
 private:
   const char      *const PassName;     // Nice name for Pass
@@ -44,7 +48,7 @@ private:
   const bool IsCFGOnlyPass;            // Pass only looks at the CFG.
   const bool IsAnalysis;               // True if an analysis pass.
   const bool IsAnalysisGroup;          // True if an analysis group.
-  std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
+  const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass
 
   NormalCtor_t NormalCtor;
 
@@ -53,10 +57,10 @@ public:
   /// through RegisterPass.
   PassInfo(const char *name, const char *arg, intptr_t pi,
            NormalCtor_t normal = 0,
-           bool isCFGOnly = false, bool isAnalysis = false)
+           bool isCFGOnly = false, bool is_analysis = false)
     : PassName(name), PassArgument(arg), PassID(pi), 
       IsCFGOnlyPass(isCFGOnly), 
-      IsAnalysis(isAnalysis), IsAnalysisGroup(false), NormalCtor(normal) {
+      IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) {
     registerPass();
   }
   /// PassInfo ctor - Do not call this directly, this should only be invoked
@@ -82,6 +86,11 @@ public:
   /// TODO : Rename
   intptr_t getTypeInfo() const { return PassID; }
 
+  /// Return true if this PassID implements the specified ID pointer.
+  bool isPassID(void *IDPtr) const {
+    return PassID == (intptr_t)IDPtr;
+  }
+  
   /// isAnalysisGroup - Return true if this is an analysis group, not a normal
   /// pass.
   ///
@@ -104,39 +113,33 @@ public:
   }
 
   /// createPass() - Use this method to create an instance of this pass.
-  Pass *createPass() const {
-    assert((!isAnalysisGroup() || NormalCtor) &&
-           "No default implementation found for analysis group!");
-    assert(NormalCtor &&
-           "Cannot call createPass on PassInfo without default ctor!");
-    return NormalCtor();
-  }
+  Pass *createPass() const;
 
   /// addInterfaceImplemented - This method is called when this pass is
   /// registered as a member of an analysis group with the RegisterAnalysisGroup
   /// template.
   ///
   void addInterfaceImplemented(const PassInfo *ItfPI) {
-    ItfImpl.push_back(ItfPI);
+    InterfaceInfo *NewInfo = new InterfaceInfo();
+    NewInfo->interface = ItfPI;
+    NewInfo->next = ItfImpl;
+    ItfImpl = NewInfo;
   }
 
   /// getInterfacesImplemented - Return a list of all of the analysis group
   /// interfaces implemented by this pass.
   ///
-  const std::vector<const PassInfo*> &getInterfacesImplemented() const {
+  const InterfaceInfo *getInterfacesImplemented() const {
     return ItfImpl;
   }
 
-  /// getPassInfo - Deprecated API compaatibility function. This function
-  /// just returns 'this'.
-  ///
-  const PassInfo *getPassInfo() const {
-    return this;
-  }
-
 protected:
   void registerPass();
   void unregisterPass();
+
+private:
+  void operator=(const PassInfo &); // do not implement
+  PassInfo(const PassInfo &);       // do not implement
 };
 
 
@@ -165,10 +168,10 @@ struct RegisterPass : public PassInfo {
 
   // Register Pass using default constructor...
   RegisterPass(const char *PassArg, const char *Name, bool CFGOnly = false,
-               bool IsAnalysis = false)
+               bool is_analysis = false)
     : PassInfo(Name, PassArg, intptr_t(&passName::ID),
                PassInfo::NormalCtor_t(callDefaultCtor<passName>),
-               CFGOnly, IsAnalysis) {
+               CFGOnly, is_analysis) {
   }
 };
 
@@ -181,7 +184,7 @@ struct RegisterPass : public PassInfo {
 ///
 /// If no analysis implementing the interface is available, a default
 /// implementation is created and added.  A pass registers itself as the default
-/// implementation by specifying 'true' as the third template argument of this
+/// implementation by specifying 'true' as the second template argument of this
 /// class.
 ///
 /// In addition to registering itself as an analysis group member, a pass must
@@ -193,14 +196,11 @@ struct RegisterPass : public PassInfo {
 /// a nice name with the interface.
 ///
 class RegisterAGBase : public PassInfo {
-  PassInfo *InterfaceInfo;
-  const PassInfo *ImplementationInfo;
-  bool isDefaultImplementation;
 protected:
-  explicit RegisterAGBase(const char *Name,
-                          intptr_t InterfaceID,
-                          intptr_t PassID = 0,
-                          bool isDefault = false);
+  RegisterAGBase(const char *Name,
+                 intptr_t InterfaceID,
+                 intptr_t PassID = 0,
+                 bool isDefault = false);
 };
 
 template<typename Interface, bool Default = false>
@@ -240,7 +240,7 @@ struct PassRegistrationListener {
   /// Callback functions - These functions are invoked whenever a pass is loaded
   /// or removed from the current executable.
   ///
-  virtual void passRegistered(const PassInfo *P) {}
+  virtual void passRegistered(const PassInfo *) {}
 
   /// enumeratePasses - Iterate over the registered passes, calling the
   /// passEnumerate callback on each PassInfo object.
@@ -250,7 +250,7 @@ struct PassRegistrationListener {
   /// passEnumerate - Callback function invoked when someone calls
   /// enumeratePasses on this PassRegistrationListener object.
   ///
-  virtual void passEnumerate(const PassInfo *P) {}
+  virtual void passEnumerate(const PassInfo *) {}
 };