Speculatively revert r108813, in an attempt to get the self-host buildbots working...
[oota-llvm.git] / include / llvm / PassSupport.h
index 29e7374815373d0af8ae405d500c8699262982d4..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 {
 
@@ -34,30 +34,47 @@ class TargetMachine;
 /// template, defined below.
 ///
 class PassInfo {
-  const char           *PassName;      // Nice name for Pass
-  const char           *PassArgument;  // Command Line argument to run this pass
-  intptr_t             PassID;      
-  bool IsCFGOnlyPass;                  // Pass only looks at the CFG.
-  bool IsAnalysis;                     // True if an analysis pass.
-  bool IsAnalysisGroup;                // True if an analysis group.
-  std::vector<const PassInfo*> ItfImpl;// Interfaces implemented by this pass
-
-  Pass *(*NormalCtor)();
+public:
+  typedef Pass* (*NormalCtor_t)();
+  struct InterfaceInfo {
+    const PassInfo *interface;
+    const InterfaceInfo *next;
+  };
+
+private:
+  const char      *const PassName;     // Nice name for Pass
+  const char      *const PassArgument; // Command Line argument to run this pass
+  const intptr_t  PassID;      
+  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.
+  const InterfaceInfo *ItfImpl;// Interfaces implemented by this pass
+
+  NormalCtor_t NormalCtor;
 
 public:
   /// PassInfo ctor - Do not call this directly, this should only be invoked
   /// through RegisterPass.
   PassInfo(const char *name, const char *arg, intptr_t pi,
-           Pass *(*normal)() = 0, bool isCFGOnly = false, bool isAnalysis = false)
+           NormalCtor_t normal = 0,
+           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
+  /// through RegisterPass. This version is for use by analysis groups; it
+  /// does not auto-register the pass.
+  PassInfo(const char *name, intptr_t pi)
+    : PassName(name), PassArgument(""), PassID(pi), 
+      IsCFGOnlyPass(false), 
+      IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) {
   }
 
   /// getPassName - Return the friendly name for the pass, never returns null
   ///
   const char *getPassName() const { return PassName; }
-  void setPassName(const char *Name) { PassName = Name; }
 
   /// getPassArgument - Return the command line option that may be passed to
   /// 'opt' that will cause this pass to be run.  This will return null if there
@@ -69,12 +86,16 @@ 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.
   ///
   bool isAnalysisGroup() const { return IsAnalysisGroup; }
   bool isAnalysis() const { return IsAnalysis; }
-  void SetIsAnalysisGroup() { IsAnalysisGroup = true; }
 
   /// isCFGOnlyPass - return true if this pass only looks at the CFG for the
   /// function.
@@ -84,39 +105,47 @@ public:
   /// an instance of the pass and returns it.  This pointer may be null if there
   /// is no default constructor for the pass.
   ///
-  Pass *(*getNormalCtor() const)() {
+  NormalCtor_t getNormalCtor() const {
     return NormalCtor;
   }
-  void setNormalCtor(Pass *(*Ctor)()) {
+  void setNormalCtor(NormalCtor_t Ctor) {
     NormalCtor = Ctor;
   }
 
   /// 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;
   }
+
+protected:
+  void registerPass();
+  void unregisterPass();
+
+private:
+  void operator=(const PassInfo &); // do not implement
+  PassInfo(const PassInfo &);       // do not implement
 };
 
 
+template<typename PassName>
+Pass *callDefaultCtor() { return new PassName(); }
+
 //===---------------------------------------------------------------------------
 /// RegisterPass<t> template - This template class is used to notify the system
 /// that a Pass is available for use, and registers it into the internal
@@ -134,44 +163,15 @@ public:
 ///
 /// static RegisterPass<PassClassName> tmp("passopt", "My Name");
 ///
-struct RegisterPassBase {
-  /// getPassInfo - Get the pass info for the registered class...
-  ///
-  const PassInfo *getPassInfo() const { return &PIObj; }
-
-  typedef Pass* (*NormalCtor_t)();
-  
-  RegisterPassBase(const char *Name, const char *Arg, intptr_t TI,
-                   NormalCtor_t NormalCtor = 0, bool CFGOnly = false, 
-                   bool IsAnalysis = false)
-    : PIObj(Name, Arg, TI, NormalCtor, CFGOnly, IsAnalysis) {
-    registerPass();
-  }
-  explicit RegisterPassBase(intptr_t TI)
-    : PIObj("", "", TI) {
-    // This ctor may only be used for analysis groups: it does not auto-register
-    // the pass.
-    PIObj.SetIsAnalysisGroup();
-  }
-
-protected:
-  PassInfo PIObj;       // The PassInfo object for this pass
-  void registerPass();
-  void unregisterPass();
-};
-
-template<typename PassName>
-Pass *callDefaultCtor() { return new PassName(); }
-
-template<typename PassName>
-struct RegisterPass : public RegisterPassBase {
+template<typename passName>
+struct RegisterPass : public PassInfo {
 
   // Register Pass using default constructor...
   RegisterPass(const char *PassArg, const char *Name, bool CFGOnly = false,
-               bool IsAnalysis = false)
-    : RegisterPassBase(Name, PassArg, intptr_t(&PassName::ID),
-                      RegisterPassBase::NormalCtor_t(callDefaultCtor<PassName>),
-                      CFGOnly, IsAnalysis) {
+               bool is_analysis = false)
+    : PassInfo(Name, PassArg, intptr_t(&passName::ID),
+               PassInfo::NormalCtor_t(callDefaultCtor<passName>),
+               CFGOnly, is_analysis) {
   }
 };
 
@@ -184,7 +184,7 @@ struct RegisterPass : public RegisterPassBase {
 ///
 /// 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
@@ -195,27 +195,24 @@ struct RegisterPass : public RegisterPassBase {
 /// second template argument).  The interface should be registered to associate
 /// a nice name with the interface.
 ///
-class RegisterAGBase : public RegisterPassBase {
-  PassInfo *InterfaceInfo;
-  const PassInfo *ImplementationInfo;
-  bool isDefaultImplementation;
+class RegisterAGBase : public PassInfo {
 protected:
-  explicit RegisterAGBase(intptr_t InterfaceID,
-                          intptr_t PassID = 0,
-                          bool isDefault = false);
-  void setGroupName(const char *Name);
+  RegisterAGBase(const char *Name,
+                 intptr_t InterfaceID,
+                 intptr_t PassID = 0,
+                 bool isDefault = false);
 };
 
 template<typename Interface, bool Default = false>
 struct RegisterAnalysisGroup : public RegisterAGBase {
-  explicit RegisterAnalysisGroup(RegisterPassBase &RPB)
-    : RegisterAGBase(intptr_t(&Interface::ID), RPB.getPassInfo()->getTypeInfo(),
+  explicit RegisterAnalysisGroup(PassInfo &RPB)
+    : RegisterAGBase(RPB.getPassName(),
+                     intptr_t(&Interface::ID), RPB.getTypeInfo(),
                      Default) {
   }
 
   explicit RegisterAnalysisGroup(const char *Name)
-    : RegisterAGBase(intptr_t(&Interface::ID)) {
-    setGroupName(Name);
+    : RegisterAGBase(Name, intptr_t(&Interface::ID)) {
   }
 };
 
@@ -243,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.
@@ -253,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 *) {}
 };