From e2a268fd03fd07f1e5d6121d2a29da42447cea35 Mon Sep 17 00:00:00 2001 From: Owen Anderson Date: Tue, 5 Oct 2010 22:58:16 +0000 Subject: [PATCH] Another step towards getting rid of static ctors for pass registration: have INITIALIZE_PASS AND INITIALIZE_AG_PASS 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 | 26 +++++++++++++++++++------- lib/VMCore/Pass.cpp | 1 - 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/include/llvm/PassSupport.h b/include/llvm/PassSupport.h index aac6a4c8887..933a1455a52 100644 --- a/include/llvm/PassSupport.h +++ b/include/llvm/PassSupport.h @@ -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 ## _info(arg, name, cfg, analysis) + template Pass *callDefaultCtor() { return new PassName(); } @@ -162,7 +165,7 @@ struct RegisterPass : public PassInfo { : PassInfo(Name, PassArg, &passName::ID, PassInfo::NormalCtor_t(callDefaultCtor), 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 ## _info(arg, name, cfg, analysis); \ static RegisterAnalysisGroup passName ## _ag(passName ## _info) diff --git a/lib/VMCore/Pass.cpp b/lib/VMCore/Pass.cpp index a7d7f61dd76..9afc5406332 100644 --- a/lib/VMCore/Pass.cpp +++ b/lib/VMCore/Pass.cpp @@ -213,7 +213,6 @@ RegisterAGBase::RegisterAGBase(const char *Name, const void *InterfaceID, *this, isDefault); } - //===----------------------------------------------------------------------===// // PassRegistrationListener implementation //