summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorOwen Anderson <resistor@mac.com>2010-10-05 22:58:16 +0000
committerOwen Anderson <resistor@mac.com>2010-10-05 22:58:16 +0000
commite2a268fd03fd07f1e5d6121d2a29da42447cea35 (patch)
tree6daf1aa0ebc3af9572d921a36774ea650e8c1901 /include
parentdf72eaef3d863be99fd45f59c59919a8c1261d05 (diff)
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
Diffstat (limited to 'include')
-rw-r--r--include/llvm/PassSupport.h26
1 files changed, 19 insertions, 7 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> 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)