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