LLVM 23.0.0git
TargetPassRegistry.inc
Go to the documentation of this file.
1//===- TargetPassRegistry.inc - Registry of passes --------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8//
9// This file is used as the registry of passes in registerPassBuilderCallbacks
10// Just put the following lines in the body of registerPassBuilderCallbacks:
11// #define GET_PASS_REGISTRY "<Target>PassRegistry.def"
12// #include "llvm/Passes/TargetPassRegistry.inc"
13//
14//===----------------------------------------------------------------------===//
15
16// NOTE: NO INCLUDE GUARD DESIRED!
17
18#ifdef GET_PASS_REGISTRY
19
20#if !__has_include(GET_PASS_REGISTRY)
21#error "must provide <Target>PassRegistry.def"
22#endif
23
24auto *PIC = PB.getPassInstrumentationCallbacks();
25if (PIC) {
26 PIC->registerClassToPassNameCallback([this, PIC]() {
27 // MSVC requires this to be captured if it's used inside decltype.
28 // Other compilers consider it an unused lambda capture.
29 (void)this;
30#define ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS) \
31 PIC->addClassToPassName(decltype(CREATE_PASS)::name(), NAME);
32#define ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS) \
33 PIC->addClassToPassName(CLASS, NAME);
34
35#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
36 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
37#define MODULE_PASS(NAME, CREATE_PASS) \
38 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
39#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
40 ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
41#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
42 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
43#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
44 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
45#define FUNCTION_PASS(NAME, CREATE_PASS) \
46 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
47#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
48 ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
49#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
50 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
51#define LOOP_PASS(NAME, CREATE_PASS) \
52 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
53#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
54 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
55#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) \
56 ADD_CLASS_PASS_TO_PASS_NAME(NAME, CREATE_PASS)
57#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
58 PARAMS) \
59 ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS(NAME, CLASS)
60#include GET_PASS_REGISTRY
61#undef MODULE_ANALYSIS
62#undef MODULE_PASS
63#undef MODULE_PASS_WITH_PARAMS
64#undef FUNCTION_ANALYSIS
65#undef FUNCTION_ALIAS_ANALYSIS
66#undef FUNCTION_PASS
67#undef FUNCTION_PASS_WITH_PARAMS
68#undef LOOP_ANALYSIS
69#undef LOOP_PASS
70#undef MACHINE_FUNCTION_ANALYSIS
71#undef MACHINE_FUNCTION_PASS
72#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
73#undef ADD_CLASS_PASS_TO_PASS_NAME
74#undef ADD_CLASS_PASS_TO_PASS_NAME_WITH_PARAMS
75 });
76}
77
78#define ADD_PASS(NAME, CREATE_PASS) \
79 if (Name == NAME) { \
80 PM.addPass(CREATE_PASS); \
81 return true; \
82 }
83
84#define ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER) \
85 if (PassBuilder::checkParametrizedPassName(Name, NAME)) { \
86 auto Params = PassBuilder::parsePassParameters(PARSER, Name, NAME); \
87 if (!Params) { \
88 errs() << NAME ": " << toString(Params.takeError()) << '\n'; \
89 return false; \
90 } \
91 PM.addPass(CREATE_PASS(Params.get())); \
92 return true; \
93 }
94
95#define ADD_ANALYSIS_PASS(NAME, CREATE_PASS) \
96 if (Name == "invalidate<" NAME ">") { \
97 PM.addPass(InvalidateAnalysisPass< \
98 std::remove_reference_t<decltype(CREATE_PASS)>>()); \
99 return true; \
100 } \
101 if (Name == "require<" NAME ">") { \
102 PM.addPass( \
103 RequireAnalysisPass<std::remove_reference_t<decltype(CREATE_PASS)>, \
104 MachineFunction>()); \
105 return true; \
106 }
107
108PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
109 ArrayRef<PassBuilder::PipelineElement>) {
110#define MODULE_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
111#include GET_PASS_REGISTRY
112#undef MODULE_PASS
113 return false;
114});
115
116PB.registerPipelineParsingCallback([=](StringRef Name, ModulePassManager &PM,
117 ArrayRef<PassBuilder::PipelineElement>) {
118#define MODULE_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
119 ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
120#include GET_PASS_REGISTRY
121#undef MODULE_PASS_WITH_PARAMS
122 return false;
123});
124
125PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
126 ArrayRef<PassBuilder::PipelineElement>) {
127#define FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
128#include GET_PASS_REGISTRY
129#undef FUNCTION_PASS
130 return false;
131});
132
133PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
134 ArrayRef<PassBuilder::PipelineElement>) {
135#define FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, PARAMS) \
136 ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
137#include GET_PASS_REGISTRY
138#undef FUNCTION_PASS_WITH_PARAMS
139 return false;
140});
141
142PB.registerPipelineParsingCallback([=](StringRef Name, LoopPassManager &PM,
143 ArrayRef<PassBuilder::PipelineElement>) {
144#define LOOP_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
145#include GET_PASS_REGISTRY
146 return false;
147});
148
149PB.registerPipelineParsingCallback([=](StringRef Name,
150 MachineFunctionPassManager &PM,
151 ArrayRef<PassBuilder::PipelineElement>) {
152#define MACHINE_FUNCTION_PASS(NAME, CREATE_PASS) ADD_PASS(NAME, CREATE_PASS)
153#include GET_PASS_REGISTRY
154 return false;
155});
156
157PB.registerPipelineParsingCallback([=](StringRef Name, FunctionPassManager &PM,
158 ArrayRef<PassBuilder::PipelineElement>) {
159#define MACHINE_FUNCTION_PASS_WITH_PARAMS(NAME, CLASS, CREATE_PASS, PARSER, \
160 PARAMS) \
161 ADD_PASS_WITH_PARAMS(NAME, CREATE_PASS, PARSER)
162#include GET_PASS_REGISTRY
163#undef MACHINE_FUNCTION_PASS_WITH_PARAMS
164 return false;
165});
166
167PB.registerPipelineParsingCallback([=](StringRef Name,
168 MachineFunctionPassManager &PM,
169 ArrayRef<PassBuilder::PipelineElement>) {
170#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
171 ADD_ANALYSIS_PASS(NAME, CREATE_PASS)
172#include GET_PASS_REGISTRY
173#undef MACHINE_FUNCTION_ANALYSIS
174 return false;
175});
176
177#undef ADD_PASS
178#undef ADD_PASS_WITH_PARAMS
179
180PB.registerAnalysisRegistrationCallback([](ModuleAnalysisManager &AM) {
181#define MODULE_ANALYSIS(NAME, CREATE_PASS) \
182 AM.registerPass([&] { return CREATE_PASS; });
183#include GET_PASS_REGISTRY
184#undef MODULE_ANALYSIS
185});
186
187PB.registerAnalysisRegistrationCallback([](FunctionAnalysisManager &AM) {
188#define FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
189 AM.registerPass([&] { return CREATE_PASS; });
190#include GET_PASS_REGISTRY
191#undef FUNCTION_ANALYSIS
192});
193
194PB.registerParseAACallback([](StringRef Name, AAManager &AM) {
195#define FUNCTION_ALIAS_ANALYSIS(NAME, CREATE_PASS) \
196 if (Name == NAME) { \
197 AM.registerFunctionAnalysis< \
198 std::remove_reference_t<decltype(CREATE_PASS)>>(); \
199 return true; \
200 }
201#include GET_PASS_REGISTRY
202#undef FUNCTION_ALIAS_ANALYSIS
203 return false;
204});
205
206PB.registerAnalysisRegistrationCallback([](LoopAnalysisManager &AM) {
207#define LOOP_ANALYSIS(NAME, CREATE_PASS) \
208 AM.registerPass([&] { return CREATE_PASS; });
209#include GET_PASS_REGISTRY
210#undef LOOP_ANALYSIS
211});
212
213PB.registerAnalysisRegistrationCallback(
214 [=](MachineFunctionAnalysisManager &AM) {
215#define MACHINE_FUNCTION_ANALYSIS(NAME, CREATE_PASS) \
216 AM.registerPass([&] { return CREATE_PASS; });
217#include GET_PASS_REGISTRY
218#undef MACHINE_FUNCTION_ANALYSIS
219 });
220
221#undef GET_PASS_REGISTRY
222#endif // GET_PASS_REGISTRY
PassInstrumentationCallbacks PIC
PassBuilder PB(Machine, PassOpts->PTO, std::nullopt, &PIC)