20#if !defined(LLVM_PASS_H) || defined(LLVM_PASSSUPPORT_H)
21#error "Do not include <PassSupport.h>; include <Pass.h> instead"
24#ifndef LLVM_PASSSUPPORT_H
25#define LLVM_PASSSUPPORT_H
38#define INITIALIZE_PASS(passName, arg, name, cfg, analysis) \
39 static void *initialize##passName##PassOnce(PassRegistry &Registry) { \
40 PassInfo *PI = new PassInfo( \
41 name, arg, &passName::ID, \
42 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
43 Registry.registerPass(*PI, true); \
46 static llvm::once_flag Initialize##passName##PassFlag; \
47 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
48 llvm::call_once(Initialize##passName##PassFlag, \
49 initialize##passName##PassOnce, std::ref(Registry)); \
52#define INITIALIZE_PASS_BEGIN(passName, arg, name, cfg, analysis) \
53 static void *initialize##passName##PassOnce(PassRegistry &Registry) {
55#define INITIALIZE_PASS_DEPENDENCY(depName) initialize##depName##Pass(Registry);
56#define INITIALIZE_AG_DEPENDENCY(depName) \
57 initialize##depName##AnalysisGroup(Registry);
59#define INITIALIZE_PASS_END(passName, arg, name, cfg, analysis) \
60 PassInfo *PI = new PassInfo( \
61 name, arg, &passName::ID, \
62 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
63 Registry.registerPass(*PI, true); \
66 static llvm::once_flag Initialize##passName##PassFlag; \
67 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
68 llvm::call_once(Initialize##passName##PassFlag, \
69 initialize##passName##PassOnce, std::ref(Registry)); \
72#define INITIALIZE_PASS_WITH_OPTIONS(PassName, Arg, Name, Cfg, Analysis) \
73 INITIALIZE_PASS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
74 PassName::registerOptions(); \
75 INITIALIZE_PASS_END(PassName, Arg, Name, Cfg, Analysis)
77#define INITIALIZE_PASS_WITH_OPTIONS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
78 INITIALIZE_PASS_BEGIN(PassName, Arg, Name, Cfg, Analysis) \
79 PassName::registerOptions();
83 std::enable_if_t<std::is_default_constructible<PassName>{},
bool> =
true>
90 std::enable_if_t<!std::is_default_constructible<PassName>{},
bool> =
true>
112 bool is_analysis =
false)
141 const void *PassID =
nullptr,
bool isDefault =
false);
144template <
typename Interface,
bool Default = false>
154#define INITIALIZE_ANALYSIS_GROUP(agName, name, defaultPass) \
155 static void *initialize##agName##AnalysisGroupOnce(PassRegistry &Registry) { \
156 initialize##defaultPass##Pass(Registry); \
157 PassInfo *AI = new PassInfo(name, &agName::ID); \
158 Registry.registerAnalysisGroup(&agName::ID, 0, *AI, false, true); \
161 static llvm::once_flag Initialize##agName##AnalysisGroupFlag; \
162 void llvm::initialize##agName##AnalysisGroup(PassRegistry &Registry) { \
163 llvm::call_once(Initialize##agName##AnalysisGroupFlag, \
164 initialize##agName##AnalysisGroupOnce, \
165 std::ref(Registry)); \
168#define INITIALIZE_AG_PASS(passName, agName, arg, name, cfg, analysis, def) \
169 static void *initialize##passName##PassOnce(PassRegistry &Registry) { \
171 initialize##agName##AnalysisGroup(Registry); \
172 PassInfo *PI = new PassInfo( \
173 name, arg, &passName::ID, \
174 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
175 Registry.registerPass(*PI, true); \
177 PassInfo *AI = new PassInfo(name, &agName::ID); \
178 Registry.registerAnalysisGroup(&agName::ID, &passName::ID, *AI, def, \
182 static llvm::once_flag Initialize##passName##PassFlag; \
183 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
184 llvm::call_once(Initialize##passName##PassFlag, \
185 initialize##passName##PassOnce, std::ref(Registry)); \
188#define INITIALIZE_AG_PASS_BEGIN(passName, agName, arg, n, cfg, analysis, def) \
189 static void *initialize##passName##PassOnce(PassRegistry &Registry) { \
191 initialize##agName##AnalysisGroup(Registry);
193#define INITIALIZE_AG_PASS_END(passName, agName, arg, n, cfg, analysis, def) \
194 PassInfo *PI = new PassInfo( \
195 n, arg, &passName::ID, \
196 PassInfo::NormalCtor_t(callDefaultCtor<passName>), cfg, analysis); \
197 Registry.registerPass(*PI, true); \
199 PassInfo *AI = new PassInfo(n, &agName::ID); \
200 Registry.registerAnalysisGroup(&agName::ID, &passName::ID, *AI, def, true); \
203 static llvm::once_flag Initialize##passName##PassFlag; \
204 void llvm::initialize##passName##Pass(PassRegistry &Registry) { \
205 llvm::call_once(Initialize##passName##PassFlag, \
206 initialize##passName##PassOnce, std::ref(Registry)); \
print lazy value Lazy Value Info Printer Pass
static cl::opt< bool > CFGOnly("dot-mcfg-only", cl::init(false), cl::Hidden, cl::desc("Print only the CFG without blocks body"))
static const char PassName[]
PassInfo class - An instance of this class exists for every pass known by the system,...
StringRef getPassName() const
getPassName - Return the friendly name for the pass, never returns null
const void * getTypeInfo() const
getTypeInfo - Return the id object for the pass... TODO : Rename
static PassRegistry * getPassRegistry()
getPassRegistry - Access the global registry object, which is automatically initialized at applicatio...
void registerPass(const PassInfo &PI, bool ShouldFree=false)
registerPass - Register a pass (by means of its PassInfo) with the registry.
Pass interface - Implemented by all 'passes'.
RegisterAnalysisGroup - Register a Pass as a member of an analysis group.
StringRef - Represent a constant reference to a string, i.e.
This is an optimization pass for GlobalISel generic memory operations.
void report_fatal_error(Error Err, bool gen_crash_diag=true)
Report a serious error, calling any installed error handler.
@ Default
The result values are uniform if and only if all operands are uniform.
PassRegistrationListener class - This class is meant to be derived from by clients that are intereste...
virtual void passRegistered(const PassInfo *)
Callback functions - These functions are invoked whenever a pass is loaded or removed from the curren...
PassRegistrationListener()=default
virtual void passEnumerate(const PassInfo *)
passEnumerate - Callback function invoked when someone calls enumeratePasses on this PassRegistration...
void enumeratePasses()
enumeratePasses - Iterate over the registered passes, calling the passEnumerate callback on each Pass...
virtual ~PassRegistrationListener()=default
RegisterAnalysisGroup(const char *Name)
RegisterAnalysisGroup(PassInfo &RPB)
RegisterPass<t> template - This template class is used to notify the system that a Pass is available ...
RegisterPass(StringRef PassArg, StringRef Name, bool CFGOnly=false, bool is_analysis=false)