xref: /linux/scripts/gcc-plugins/gcc-generate-ipa-pass.h (revision 5e21a3ecad1500e35b46701e7f3f232e15d78e69)
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  #if BUILDING_GCC_VERSION >= 5000
150  #elif BUILDING_GCC_VERSION == 4009
151  		.has_gate		= _HAS_GATE,
152  		.has_execute		= _HAS_EXECUTE,
153  #else
154  		.gate			= _GATE,
155  		.execute		= _EXECUTE,
156  		.sub			= NULL,
157  		.next			= NULL,
158  		.static_pass_number	= 0,
159  #endif
160  		.tv_id			= TV_NONE,
161  		.properties_required	= PROPERTIES_REQUIRED,
162  		.properties_provided	= PROPERTIES_PROVIDED,
163  		.properties_destroyed	= PROPERTIES_DESTROYED,
164  		.todo_flags_start	= TODO_FLAGS_START,
165  		.todo_flags_finish	= TODO_FLAGS_FINISH,
166  };
167  
168  class _PASS_NAME_PASS : public ipa_opt_pass_d {
169  public:
170  	_PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA,
171  			 g,
172  			 _GENERATE_SUMMARY,
173  			 _WRITE_SUMMARY,
174  			 _READ_SUMMARY,
175  			 _WRITE_OPTIMIZATION_SUMMARY,
176  			 _READ_OPTIMIZATION_SUMMARY,
177  			 _STMT_FIXUP,
178  			 FUNCTION_TRANSFORM_TODO_FLAGS_START,
179  			 _FUNCTION_TRANSFORM,
180  			 _VARIABLE_TRANSFORM) {}
181  
182  #ifndef NO_GATE
183  #if BUILDING_GCC_VERSION >= 5000
184  	virtual bool gate(function *) { return _GATE(); }
185  #else
186  	virtual bool gate(void) { return _GATE(); }
187  #endif
188  
189  	virtual opt_pass *clone() { return new _PASS_NAME_PASS(); }
190  
191  #ifndef NO_EXECUTE
192  #if BUILDING_GCC_VERSION >= 5000
193  	virtual unsigned int execute(function *) { return _EXECUTE(); }
194  #else
195  	virtual unsigned int execute(void) { return _EXECUTE(); }
196  #endif
197  #endif
198  };
199  }
200  
201  opt_pass *_MAKE_PASS_NAME_PASS(void)
202  {
203  	return new _PASS_NAME_PASS();
204  }
205  #else
206  struct opt_pass *_MAKE_PASS_NAME_PASS(void)
207  {
208  	return &_PASS_NAME_PASS.pass;
209  }
210  #endif
211  
212  /* clean up user provided defines */
213  #undef PASS_NAME
214  #undef NO_GENERATE_SUMMARY
215  #undef NO_WRITE_SUMMARY
216  #undef NO_READ_SUMMARY
217  #undef NO_WRITE_OPTIMIZATION_SUMMARY
218  #undef NO_READ_OPTIMIZATION_SUMMARY
219  #undef NO_STMT_FIXUP
220  #undef NO_FUNCTION_TRANSFORM
221  #undef NO_VARIABLE_TRANSFORM
222  #undef NO_GATE
223  #undef NO_EXECUTE
224  
225  #undef FUNCTION_TRANSFORM_TODO_FLAGS_START
226  #undef PROPERTIES_DESTROYED
227  #undef PROPERTIES_PROVIDED
228  #undef PROPERTIES_REQUIRED
229  #undef TODO_FLAGS_FINISH
230  #undef TODO_FLAGS_START
231  
232  /* clean up generated defines */
233  #undef _EXECUTE
234  #undef __EXECUTE
235  #undef _FUNCTION_TRANSFORM
236  #undef __FUNCTION_TRANSFORM
237  #undef _GATE
238  #undef __GATE
239  #undef _GCC_PLUGIN_CONCAT2
240  #undef _GCC_PLUGIN_CONCAT3
241  #undef _GCC_PLUGIN_STRINGIFY
242  #undef __GCC_PLUGIN_STRINGIFY
243  #undef _GENERATE_SUMMARY
244  #undef __GENERATE_SUMMARY
245  #undef _HAS_EXECUTE
246  #undef _HAS_GATE
247  #undef _MAKE_PASS_NAME_PASS
248  #undef __MAKE_PASS_NAME_PASS
249  #undef _PASS_NAME_NAME
250  #undef _PASS_NAME_PASS
251  #undef __PASS_NAME_PASS
252  #undef _PASS_NAME_PASS_DATA
253  #undef __PASS_NAME_PASS_DATA
254  #undef _READ_OPTIMIZATION_SUMMARY
255  #undef __READ_OPTIMIZATION_SUMMARY
256  #undef _READ_SUMMARY
257  #undef __READ_SUMMARY
258  #undef _STMT_FIXUP
259  #undef __STMT_FIXUP
260  #undef _VARIABLE_TRANSFORM
261  #undef __VARIABLE_TRANSFORM
262  #undef _WRITE_OPTIMIZATION_SUMMARY
263  #undef __WRITE_OPTIMIZATION_SUMMARY
264  #undef _WRITE_SUMMARY
265  #undef __WRITE_SUMMARY
266  
267  #endif /* PASS_NAME */
268