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