21 #ifndef LLVM_PASSSUPPORT_H
22 #define LLVM_PASSSUPPORT_H
41 typedef Pass* (*NormalCtor_t)();
44 const char *
const PassName;
45 const char *
const PassArgument;
47 const bool IsCFGOnlyPass;
48 const bool IsAnalysis;
49 const bool IsAnalysisGroup;
50 std::vector<const PassInfo*> ItfImpl;
57 PassInfo(
const char *name,
const char *arg,
const void *pi,
59 : PassName(name), PassArgument(arg), PassID(pi),
60 IsCFGOnlyPass(isCFGOnly),
61 IsAnalysis(is_analysis), IsAnalysisGroup(
false), NormalCtor(normal) { }
66 : PassName(name), PassArgument(
""), PassID(pi),
68 IsAnalysis(
false), IsAnalysisGroup(
true), NormalCtor(0) { }
86 return PassID == IDPtr;
118 ItfImpl.push_back(ItfPI);
133 #define CALL_ONCE_INITIALIZATION(function) \
134 static volatile sys::cas_flag initialized = 0; \
135 sys::cas_flag old_val = sys::CompareAndSwap(&initialized, 1, 0); \
136 if (old_val == 0) { \
137 function(Registry); \
138 sys::MemoryFence(); \
139 TsanIgnoreWritesBegin(); \
140 TsanHappensBefore(&initialized); \
142 TsanIgnoreWritesEnd(); \
144 sys::cas_flag tmp = initialized; \
145 sys::MemoryFence(); \
148 sys::MemoryFence(); \
151 TsanHappensAfter(&initialized);
153 #define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
154 static void* initialize##passName##PassOnce(PassRegistry &Registry) { \
155 PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \
156 PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
157 Registry.registerPass(*PI, true); \
160 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
161 CALL_ONCE_INITIALIZATION(initialize##passName##PassOnce) \
164 #define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis) \
165 static void* initialize##passName##PassOnce(PassRegistry &Registry) {
167 #define INITIALIZE_PASS_DEPENDENCY(depName) \
168 initialize##depName##Pass(Registry);
169 #define INITIALIZE_AG_DEPENDENCY(depName) \
170 initialize##depName##AnalysisGroup(Registry);
172 #define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \
173 PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \
174 PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
175 Registry.registerPass(*PI, true); \
178 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
179 CALL_ONCE_INITIALIZATION(initialize##passName##PassOnce) \
182 template<
typename PassName>
202 template<
typename passName>
207 bool is_analysis =
false)
210 CFGOnly, is_analysis) {
238 const void *InterfaceID,
239 const void *PassID = 0,
240 bool isDefault =
false);
243 template<
typename Interface,
bool Default = false>
256 #define INITIALIZE_ANALYSIS_GROUP(agName, name, defaultPass) \
257 static void* initialize##agName##AnalysisGroupOnce(PassRegistry &Registry) { \
258 initialize##defaultPass##Pass(Registry); \
259 PassInfo *AI = new PassInfo(name, & agName :: ID); \
260 Registry.registerAnalysisGroup(& agName ::ID, 0, *AI, false, true); \
263 void llvm::initialize##agName##AnalysisGroup(PassRegistry &Registry) { \
264 CALL_ONCE_INITIALIZATION(initialize##agName##AnalysisGroupOnce) \
268 #define INITIALIZE_AG_PASS(passName, agName, arg, name, cfg, analysis, def) \
269 static void* initialize##passName##PassOnce(PassRegistry &Registry) { \
270 if (!def) initialize##agName##AnalysisGroup(Registry); \
271 PassInfo *PI = new PassInfo(name, arg, & passName ::ID, \
272 PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
273 Registry.registerPass(*PI, true); \
275 PassInfo *AI = new PassInfo(name, & agName :: ID); \
276 Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, \
280 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
281 CALL_ONCE_INITIALIZATION(initialize##passName##PassOnce) \
285 #define INITIALIZE_AG_PASS_BEGIN(passName, agName, arg, n, cfg, analysis, def) \
286 static void* initialize##passName##PassOnce(PassRegistry &Registry) { \
287 if (!def) initialize##agName##AnalysisGroup(Registry);
289 #define INITIALIZE_AG_PASS_END(passName, agName, arg, n, cfg, analysis, def) \
290 PassInfo *PI = new PassInfo(n, arg, & passName ::ID, \
291 PassInfo::NormalCtor_t(callDefaultCtor< passName >), cfg, analysis); \
292 Registry.registerPass(*PI, true); \
294 PassInfo *AI = new PassInfo(n, & agName :: ID); \
295 Registry.registerAnalysisGroup(& agName ::ID, & passName ::ID, \
299 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
300 CALL_ONCE_INITIALIZATION(initialize##passName##PassOnce) \
330 void enumeratePasses();
static PassRegistry * getPassRegistry()
void setNormalCtor(NormalCtor_t Ctor)
const char * getPassName() const
const std::vector< const PassInfo * > & getInterfacesImplemented() const
bool isCFGOnlyPass() const
const void * getTypeInfo() const
void addInterfaceImplemented(const PassInfo *ItfPI)
RegisterAnalysisGroup(const char *Name)
bool isAnalysisGroup() const
virtual void passRegistered(const PassInfo *)
ID
LLVM Calling Convention Representation.
bool isPassID(const void *IDPtr) const
Return true if this PassID implements the specified ID pointer.
PassInfo(const char *name, const char *arg, const void *pi, NormalCtor_t normal, bool isCFGOnly, bool is_analysis)
virtual void passEnumerate(const PassInfo *)
NormalCtor_t getNormalCtor() const
PassInfo(const char *name, const void *pi)
Pass * createPass() const
createPass() - Use this method to create an instance of this pass.
#define LLVM_DELETED_FUNCTION
const char * getPassArgument() const
RegisterPass(const char *PassArg, const char *Name, bool CFGOnly=false, bool is_analysis=false)
void registerPass(const PassInfo &PI, bool ShouldFree=false)
RegisterAnalysisGroup(PassInfo &RPB)