]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
6b90bd4b ER |
2 | /* |
3 | * Generator for SIMPLE_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_GATE | |
12 | * NO_EXECUTE | |
13 | * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override | |
14 | * the default 0 values | |
15 | * 4. for convenience, all the above will be undefined after inclusion! | |
16 | * 5. the only exported name is make_PASS_NAME_pass() to register with gcc | |
17 | */ | |
18 | ||
19 | #ifndef PASS_NAME | |
20 | #error at least PASS_NAME must be defined | |
21 | #else | |
22 | #define __GCC_PLUGIN_STRINGIFY(n) #n | |
23 | #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) | |
24 | #define _GCC_PLUGIN_CONCAT2(x, y) x ## y | |
25 | #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z | |
26 | ||
27 | #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) | |
28 | #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) | |
29 | ||
30 | #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) | |
31 | #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) | |
32 | ||
33 | #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) | |
34 | ||
35 | #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) | |
36 | #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) | |
37 | ||
38 | #ifdef NO_GATE | |
39 | #define _GATE NULL | |
40 | #define _HAS_GATE false | |
41 | #else | |
42 | #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) | |
43 | #define _GATE __GATE(PASS_NAME) | |
44 | #define _HAS_GATE true | |
45 | #endif | |
46 | ||
47 | #ifdef NO_EXECUTE | |
48 | #define _EXECUTE NULL | |
49 | #define _HAS_EXECUTE false | |
50 | #else | |
51 | #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) | |
52 | #define _EXECUTE __EXECUTE(PASS_NAME) | |
53 | #define _HAS_EXECUTE true | |
54 | #endif | |
55 | ||
56 | #ifndef PROPERTIES_REQUIRED | |
57 | #define PROPERTIES_REQUIRED 0 | |
58 | #endif | |
59 | ||
60 | #ifndef PROPERTIES_PROVIDED | |
61 | #define PROPERTIES_PROVIDED 0 | |
62 | #endif | |
63 | ||
64 | #ifndef PROPERTIES_DESTROYED | |
65 | #define PROPERTIES_DESTROYED 0 | |
66 | #endif | |
67 | ||
68 | #ifndef TODO_FLAGS_START | |
69 | #define TODO_FLAGS_START 0 | |
70 | #endif | |
71 | ||
72 | #ifndef TODO_FLAGS_FINISH | |
73 | #define TODO_FLAGS_FINISH 0 | |
74 | #endif | |
75 | ||
76 | #if BUILDING_GCC_VERSION >= 4009 | |
77 | namespace { | |
78 | static const pass_data _PASS_NAME_PASS_DATA = { | |
79 | #else | |
80 | static struct simple_ipa_opt_pass _PASS_NAME_PASS = { | |
81 | .pass = { | |
82 | #endif | |
83 | .type = SIMPLE_IPA_PASS, | |
84 | .name = _PASS_NAME_NAME, | |
85 | #if BUILDING_GCC_VERSION >= 4008 | |
86 | .optinfo_flags = OPTGROUP_NONE, | |
87 | #endif | |
88 | #if BUILDING_GCC_VERSION >= 5000 | |
89 | #elif BUILDING_GCC_VERSION == 4009 | |
90 | .has_gate = _HAS_GATE, | |
91 | .has_execute = _HAS_EXECUTE, | |
92 | #else | |
93 | .gate = _GATE, | |
94 | .execute = _EXECUTE, | |
95 | .sub = NULL, | |
96 | .next = NULL, | |
97 | .static_pass_number = 0, | |
98 | #endif | |
99 | .tv_id = TV_NONE, | |
100 | .properties_required = PROPERTIES_REQUIRED, | |
101 | .properties_provided = PROPERTIES_PROVIDED, | |
102 | .properties_destroyed = PROPERTIES_DESTROYED, | |
103 | .todo_flags_start = TODO_FLAGS_START, | |
104 | .todo_flags_finish = TODO_FLAGS_FINISH, | |
105 | #if BUILDING_GCC_VERSION < 4009 | |
106 | } | |
107 | #endif | |
108 | }; | |
109 | ||
110 | #if BUILDING_GCC_VERSION >= 4009 | |
111 | class _PASS_NAME_PASS : public simple_ipa_opt_pass { | |
112 | public: | |
113 | _PASS_NAME_PASS() : simple_ipa_opt_pass(_PASS_NAME_PASS_DATA, g) {} | |
114 | ||
115 | #ifndef NO_GATE | |
116 | #if BUILDING_GCC_VERSION >= 5000 | |
117 | virtual bool gate(function *) { return _GATE(); } | |
118 | #else | |
119 | virtual bool gate(void) { return _GATE(); } | |
120 | #endif | |
121 | #endif | |
122 | ||
123 | virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } | |
124 | ||
125 | #ifndef NO_EXECUTE | |
126 | #if BUILDING_GCC_VERSION >= 5000 | |
127 | virtual unsigned int execute(function *) { return _EXECUTE(); } | |
128 | #else | |
129 | virtual unsigned int execute(void) { return _EXECUTE(); } | |
130 | #endif | |
131 | #endif | |
132 | }; | |
133 | } | |
134 | ||
135 | opt_pass *_MAKE_PASS_NAME_PASS(void) | |
136 | { | |
137 | return new _PASS_NAME_PASS(); | |
138 | } | |
139 | #else | |
140 | struct opt_pass *_MAKE_PASS_NAME_PASS(void) | |
141 | { | |
142 | return &_PASS_NAME_PASS.pass; | |
143 | } | |
144 | #endif | |
145 | ||
146 | /* clean up user provided defines */ | |
147 | #undef PASS_NAME | |
148 | #undef NO_GATE | |
149 | #undef NO_EXECUTE | |
150 | ||
151 | #undef PROPERTIES_DESTROYED | |
152 | #undef PROPERTIES_PROVIDED | |
153 | #undef PROPERTIES_REQUIRED | |
154 | #undef TODO_FLAGS_FINISH | |
155 | #undef TODO_FLAGS_START | |
156 | ||
157 | /* clean up generated defines */ | |
158 | #undef _EXECUTE | |
159 | #undef __EXECUTE | |
160 | #undef _GATE | |
161 | #undef __GATE | |
162 | #undef _GCC_PLUGIN_CONCAT2 | |
163 | #undef _GCC_PLUGIN_CONCAT3 | |
164 | #undef _GCC_PLUGIN_STRINGIFY | |
165 | #undef __GCC_PLUGIN_STRINGIFY | |
166 | #undef _HAS_EXECUTE | |
167 | #undef _HAS_GATE | |
168 | #undef _MAKE_PASS_NAME_PASS | |
169 | #undef __MAKE_PASS_NAME_PASS | |
170 | #undef _PASS_NAME_NAME | |
171 | #undef _PASS_NAME_PASS | |
172 | #undef __PASS_NAME_PASS | |
173 | #undef _PASS_NAME_PASS_DATA | |
174 | #undef __PASS_NAME_PASS_DATA | |
175 | ||
176 | #endif /* PASS_NAME */ |