Warning: This file is not a C or C++ file. It does not have highlighting.
1 | /* SPDX-License-Identifier: GPL-2.0 */ |
---|---|
2 | /* |
3 | * Generator for IPA pass related boilerplate code/data |
4 | * |
5 | * Supports gcc 4.5-6 |
6 | * |
7 | * Usage: |
8 | * |
9 | * 1. before inclusion define PASS_NAME |
10 | * 2. before inclusion define NO_* for unimplemented callbacks |
11 | * NO_GENERATE_SUMMARY |
12 | * NO_READ_SUMMARY |
13 | * NO_WRITE_SUMMARY |
14 | * NO_READ_OPTIMIZATION_SUMMARY |
15 | * NO_WRITE_OPTIMIZATION_SUMMARY |
16 | * NO_STMT_FIXUP |
17 | * NO_FUNCTION_TRANSFORM |
18 | * NO_VARIABLE_TRANSFORM |
19 | * NO_GATE |
20 | * NO_EXECUTE |
21 | * 3. before inclusion define PROPERTIES_* and *TODO_FLAGS_* to override |
22 | * the default 0 values |
23 | * 4. for convenience, all the above will be undefined after inclusion! |
24 | * 5. the only exported name is make_PASS_NAME_pass() to register with gcc |
25 | */ |
26 | |
27 | #ifndef PASS_NAME |
28 | #error at least PASS_NAME must be defined |
29 | #else |
30 | #define __GCC_PLUGIN_STRINGIFY(n) #n |
31 | #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) |
32 | #define _GCC_PLUGIN_CONCAT2(x, y) x ## y |
33 | #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z |
34 | |
35 | #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) |
36 | #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) |
37 | |
38 | #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) |
39 | #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) |
40 | |
41 | #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) |
42 | |
43 | #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) |
44 | #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) |
45 | |
46 | #ifdef NO_GENERATE_SUMMARY |
47 | #define _GENERATE_SUMMARY NULL |
48 | #else |
49 | #define __GENERATE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _generate_summary) |
50 | #define _GENERATE_SUMMARY __GENERATE_SUMMARY(PASS_NAME) |
51 | #endif |
52 | |
53 | #ifdef NO_READ_SUMMARY |
54 | #define _READ_SUMMARY NULL |
55 | #else |
56 | #define __READ_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_summary) |
57 | #define _READ_SUMMARY __READ_SUMMARY(PASS_NAME) |
58 | #endif |
59 | |
60 | #ifdef NO_WRITE_SUMMARY |
61 | #define _WRITE_SUMMARY NULL |
62 | #else |
63 | #define __WRITE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_summary) |
64 | #define _WRITE_SUMMARY __WRITE_SUMMARY(PASS_NAME) |
65 | #endif |
66 | |
67 | #ifdef NO_READ_OPTIMIZATION_SUMMARY |
68 | #define _READ_OPTIMIZATION_SUMMARY NULL |
69 | #else |
70 | #define __READ_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_optimization_summary) |
71 | #define _READ_OPTIMIZATION_SUMMARY __READ_OPTIMIZATION_SUMMARY(PASS_NAME) |
72 | #endif |
73 | |
74 | #ifdef NO_WRITE_OPTIMIZATION_SUMMARY |
75 | #define _WRITE_OPTIMIZATION_SUMMARY NULL |
76 | #else |
77 | #define __WRITE_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_optimization_summary) |
78 | #define _WRITE_OPTIMIZATION_SUMMARY __WRITE_OPTIMIZATION_SUMMARY(PASS_NAME) |
79 | #endif |
80 | |
81 | #ifdef NO_STMT_FIXUP |
82 | #define _STMT_FIXUP NULL |
83 | #else |
84 | #define __STMT_FIXUP(n) _GCC_PLUGIN_CONCAT2(n, _stmt_fixup) |
85 | #define _STMT_FIXUP __STMT_FIXUP(PASS_NAME) |
86 | #endif |
87 | |
88 | #ifdef NO_FUNCTION_TRANSFORM |
89 | #define _FUNCTION_TRANSFORM NULL |
90 | #else |
91 | #define __FUNCTION_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _function_transform) |
92 | #define _FUNCTION_TRANSFORM __FUNCTION_TRANSFORM(PASS_NAME) |
93 | #endif |
94 | |
95 | #ifdef NO_VARIABLE_TRANSFORM |
96 | #define _VARIABLE_TRANSFORM NULL |
97 | #else |
98 | #define __VARIABLE_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _variable_transform) |
99 | #define _VARIABLE_TRANSFORM __VARIABLE_TRANSFORM(PASS_NAME) |
100 | #endif |
101 | |
102 | #ifdef NO_GATE |
103 | #define _GATE NULL |
104 | #define _HAS_GATE false |
105 | #else |
106 | #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) |
107 | #define _GATE __GATE(PASS_NAME) |
108 | #define _HAS_GATE true |
109 | #endif |
110 | |
111 | #ifdef NO_EXECUTE |
112 | #define _EXECUTE NULL |
113 | #define _HAS_EXECUTE false |
114 | #else |
115 | #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) |
116 | #define _EXECUTE __EXECUTE(PASS_NAME) |
117 | #define _HAS_EXECUTE true |
118 | #endif |
119 | |
120 | #ifndef PROPERTIES_REQUIRED |
121 | #define PROPERTIES_REQUIRED 0 |
122 | #endif |
123 | |
124 | #ifndef PROPERTIES_PROVIDED |
125 | #define PROPERTIES_PROVIDED 0 |
126 | #endif |
127 | |
128 | #ifndef PROPERTIES_DESTROYED |
129 | #define PROPERTIES_DESTROYED 0 |
130 | #endif |
131 | |
132 | #ifndef TODO_FLAGS_START |
133 | #define TODO_FLAGS_START 0 |
134 | #endif |
135 | |
136 | #ifndef TODO_FLAGS_FINISH |
137 | #define TODO_FLAGS_FINISH 0 |
138 | #endif |
139 | |
140 | #ifndef FUNCTION_TRANSFORM_TODO_FLAGS_START |
141 | #define FUNCTION_TRANSFORM_TODO_FLAGS_START 0 |
142 | #endif |
143 | |
144 | namespace { |
145 | static const pass_data _PASS_NAME_PASS_DATA = { |
146 | .type = IPA_PASS, |
147 | .name = _PASS_NAME_NAME, |
148 | .optinfo_flags = OPTGROUP_NONE, |
149 | .tv_id = TV_NONE, |
150 | .properties_required = PROPERTIES_REQUIRED, |
151 | .properties_provided = PROPERTIES_PROVIDED, |
152 | .properties_destroyed = PROPERTIES_DESTROYED, |
153 | .todo_flags_start = TODO_FLAGS_START, |
154 | .todo_flags_finish = TODO_FLAGS_FINISH, |
155 | }; |
156 | |
157 | class _PASS_NAME_PASS : public ipa_opt_pass_d { |
158 | public: |
159 | _PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA, |
160 | g, |
161 | _GENERATE_SUMMARY, |
162 | _WRITE_SUMMARY, |
163 | _READ_SUMMARY, |
164 | _WRITE_OPTIMIZATION_SUMMARY, |
165 | _READ_OPTIMIZATION_SUMMARY, |
166 | _STMT_FIXUP, |
167 | FUNCTION_TRANSFORM_TODO_FLAGS_START, |
168 | _FUNCTION_TRANSFORM, |
169 | _VARIABLE_TRANSFORM) {} |
170 | |
171 | #ifndef NO_GATE |
172 | virtual bool gate(function *) { return _GATE(); } |
173 | |
174 | virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } |
175 | |
176 | #ifndef NO_EXECUTE |
177 | virtual unsigned int execute(function *) { return _EXECUTE(); } |
178 | #endif |
179 | }; |
180 | } |
181 | |
182 | opt_pass *_MAKE_PASS_NAME_PASS(void) |
183 | { |
184 | return new _PASS_NAME_PASS(); |
185 | } |
186 | #else |
187 | struct opt_pass *_MAKE_PASS_NAME_PASS(void) |
188 | { |
189 | return &_PASS_NAME_PASS.pass; |
190 | } |
191 | #endif |
192 | |
193 | /* clean up user provided defines */ |
194 | #undef PASS_NAME |
195 | #undef NO_GENERATE_SUMMARY |
196 | #undef NO_WRITE_SUMMARY |
197 | #undef NO_READ_SUMMARY |
198 | #undef NO_WRITE_OPTIMIZATION_SUMMARY |
199 | #undef NO_READ_OPTIMIZATION_SUMMARY |
200 | #undef NO_STMT_FIXUP |
201 | #undef NO_FUNCTION_TRANSFORM |
202 | #undef NO_VARIABLE_TRANSFORM |
203 | #undef NO_GATE |
204 | #undef NO_EXECUTE |
205 | |
206 | #undef FUNCTION_TRANSFORM_TODO_FLAGS_START |
207 | #undef PROPERTIES_DESTROYED |
208 | #undef PROPERTIES_PROVIDED |
209 | #undef PROPERTIES_REQUIRED |
210 | #undef TODO_FLAGS_FINISH |
211 | #undef TODO_FLAGS_START |
212 | |
213 | /* clean up generated defines */ |
214 | #undef _EXECUTE |
215 | #undef __EXECUTE |
216 | #undef _FUNCTION_TRANSFORM |
217 | #undef __FUNCTION_TRANSFORM |
218 | #undef _GATE |
219 | #undef __GATE |
220 | #undef _GCC_PLUGIN_CONCAT2 |
221 | #undef _GCC_PLUGIN_CONCAT3 |
222 | #undef _GCC_PLUGIN_STRINGIFY |
223 | #undef __GCC_PLUGIN_STRINGIFY |
224 | #undef _GENERATE_SUMMARY |
225 | #undef __GENERATE_SUMMARY |
226 | #undef _HAS_EXECUTE |
227 | #undef _HAS_GATE |
228 | #undef _MAKE_PASS_NAME_PASS |
229 | #undef __MAKE_PASS_NAME_PASS |
230 | #undef _PASS_NAME_NAME |
231 | #undef _PASS_NAME_PASS |
232 | #undef __PASS_NAME_PASS |
233 | #undef _PASS_NAME_PASS_DATA |
234 | #undef __PASS_NAME_PASS_DATA |
235 | #undef _READ_OPTIMIZATION_SUMMARY |
236 | #undef __READ_OPTIMIZATION_SUMMARY |
237 | #undef _READ_SUMMARY |
238 | #undef __READ_SUMMARY |
239 | #undef _STMT_FIXUP |
240 | #undef __STMT_FIXUP |
241 | #undef _VARIABLE_TRANSFORM |
242 | #undef __VARIABLE_TRANSFORM |
243 | #undef _WRITE_OPTIMIZATION_SUMMARY |
244 | #undef __WRITE_OPTIMIZATION_SUMMARY |
245 | #undef _WRITE_SUMMARY |
246 | #undef __WRITE_SUMMARY |
247 | |
248 | #endif /* PASS_NAME */ |
249 |
Warning: This file is not a C or C++ file. It does not have highlighting.