Speculatively revert r108813, in an attempt to get the self-host buildbots working...
[oota-llvm.git] / include / llvm / PassSupport.h
index fe3ca520659cb3b2f159b1f17b72b69f5ca3e57d..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;
 
@@ -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,26 +113,23 @@ 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;
   }
 
@@ -190,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>