Another step towards getting rid of static ctors for pass registration: have INITIALI...
authorOwen Anderson <resistor@mac.com>
Tue, 5 Oct 2010 22:58:16 +0000 (22:58 +0000)
committerOwen Anderson <resistor@mac.com>
Tue, 5 Oct 2010 22:58:16 +0000 (22:58 +0000)
expand to an initializeMyPass() function (in additional to the extant static ctors).  Eventually, these will be called
from a big InitializeAllPasses() function, and the PassInfo's they create (which would be leaked if this code were used
at the moment) will be handed off to a PassRegistry for ownership.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@115703 91177308-0d34-0410-b5e6-96231b3b80d8

include/llvm/PassSupport.h
lib/VMCore/Pass.cpp

index aac6a4c8887a76375c60adbc62c6873c6bf6335e..933a1455a52102784b01176420c1df2d9a3fb217 100644 (file)
@@ -55,17 +55,14 @@ public:
            NormalCtor_t normal, bool isCFGOnly, bool is_analysis)
     : PassName(name), PassArgument(arg), PassID(pi), 
       IsCFGOnlyPass(isCFGOnly), 
-      IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) {
-    PassRegistry::getPassRegistry()->registerPass(*this);
-  }
+      IsAnalysis(is_analysis), IsAnalysisGroup(false), NormalCtor(normal) { }
   /// 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, const void *pi)
     : PassName(name), PassArgument(""), PassID(pi), 
       IsCFGOnlyPass(false), 
-      IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) {
-  }
+      IsAnalysis(false), IsAnalysisGroup(true), NormalCtor(0) { }
 
   /// getPassName - Return the friendly name for the pass, never returns null
   ///
@@ -131,7 +128,13 @@ private:
 };
 
 #define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
+  void initialize##passName##Pass() { \
+    PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \
+      PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
+    PassRegistry::getPassRegistry()->registerPass(*PI); \
+  } \
   static RegisterPass<passName> passName ## _info(arg, name, cfg, analysis)
+    
 
 template<typename PassName>
 Pass *callDefaultCtor() { return new PassName(); }
@@ -162,7 +165,7 @@ struct RegisterPass : public PassInfo {
     : PassInfo(Name, PassArg, &passName::ID,
                PassInfo::NormalCtor_t(callDefaultCtor<passName>),
                CFGOnly, is_analysis) {
-    
+    PassRegistry::getPassRegistry()->registerPass(*this);
   }
 };
 
@@ -187,7 +190,7 @@ struct RegisterPass : public PassInfo {
 /// a nice name with the interface.
 ///
 class RegisterAGBase : public PassInfo {
-protected:
+public:
   RegisterAGBase(const char *Name,
                  const void *InterfaceID,
                  const void *PassID = 0,
@@ -208,6 +211,15 @@ struct RegisterAnalysisGroup : public RegisterAGBase {
 };
 
 #define INITIALIZE_AG_PASS(passName, agName, arg, name, cfg, analysis, def) \
+  void initialize##passName##Pass() { \
+    PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \
+      PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
+    PassRegistry::getPassRegistry()->registerPass(*PI); \
+    \
+    PassInfo *AI = new PassInfo(name, & agName :: ID); \
+    PassRegistry::getPassRegistry()->registerAnalysisGroup( \
+      & agName ::ID, & passName ::ID, *AI, def); \
+  } \
   static RegisterPass<passName> passName ## _info(arg, name, cfg, analysis); \
   static RegisterAnalysisGroup<agName, def> passName ## _ag(passName ## _info)
 
index a7d7f61dd76225104acad4ae6c57b5e671059830..9afc540633219bb8ac6ff611f1682e7fa7a155ed 100644 (file)
@@ -213,7 +213,6 @@ RegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID,
                                                          *this, isDefault);
 }
 
-
 //===----------------------------------------------------------------------===//
 // PassRegistrationListener implementation
 //