]>
Commit | Line | Data |
---|---|---|
b2441318 | 1 | /* SPDX-License-Identifier: GPL-2.0 */ |
6b90bd4b ER |
2 | /* |
3 | * Generator for RTL 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 | ||
6b90bd4b ER |
76 | namespace { |
77 | static const pass_data _PASS_NAME_PASS_DATA = { | |
6b90bd4b ER |
78 | .type = RTL_PASS, |
79 | .name = _PASS_NAME_NAME, | |
6b90bd4b | 80 | .optinfo_flags = OPTGROUP_NONE, |
6b90bd4b ER |
81 | #if BUILDING_GCC_VERSION >= 5000 |
82 | #elif BUILDING_GCC_VERSION == 4009 | |
83 | .has_gate = _HAS_GATE, | |
84 | .has_execute = _HAS_EXECUTE, | |
85 | #else | |
86 | .gate = _GATE, | |
87 | .execute = _EXECUTE, | |
88 | .sub = NULL, | |
89 | .next = NULL, | |
90 | .static_pass_number = 0, | |
91 | #endif | |
92 | .tv_id = TV_NONE, | |
93 | .properties_required = PROPERTIES_REQUIRED, | |
94 | .properties_provided = PROPERTIES_PROVIDED, | |
95 | .properties_destroyed = PROPERTIES_DESTROYED, | |
96 | .todo_flags_start = TODO_FLAGS_START, | |
97 | .todo_flags_finish = TODO_FLAGS_FINISH, | |
6b90bd4b ER |
98 | }; |
99 | ||
6b90bd4b ER |
100 | class _PASS_NAME_PASS : public rtl_opt_pass { |
101 | public: | |
102 | _PASS_NAME_PASS() : rtl_opt_pass(_PASS_NAME_PASS_DATA, g) {} | |
103 | ||
104 | #ifndef NO_GATE | |
105 | #if BUILDING_GCC_VERSION >= 5000 | |
106 | virtual bool gate(function *) { return _GATE(); } | |
107 | #else | |
108 | virtual bool gate(void) { return _GATE(); } | |
109 | #endif | |
110 | #endif | |
111 | ||
112 | virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } | |
113 | ||
114 | #ifndef NO_EXECUTE | |
115 | #if BUILDING_GCC_VERSION >= 5000 | |
116 | virtual unsigned int execute(function *) { return _EXECUTE(); } | |
117 | #else | |
118 | virtual unsigned int execute(void) { return _EXECUTE(); } | |
119 | #endif | |
120 | #endif | |
121 | }; | |
122 | } | |
123 | ||
124 | opt_pass *_MAKE_PASS_NAME_PASS(void) | |
125 | { | |
126 | return new _PASS_NAME_PASS(); | |
127 | } | |
6b90bd4b ER |
128 | |
129 | /* clean up user provided defines */ | |
130 | #undef PASS_NAME | |
131 | #undef NO_GATE | |
132 | #undef NO_EXECUTE | |
133 | ||
134 | #undef PROPERTIES_DESTROYED | |
135 | #undef PROPERTIES_PROVIDED | |
136 | #undef PROPERTIES_REQUIRED | |
137 | #undef TODO_FLAGS_FINISH | |
138 | #undef TODO_FLAGS_START | |
139 | ||
140 | /* clean up generated defines */ | |
141 | #undef _EXECUTE | |
142 | #undef __EXECUTE | |
143 | #undef _GATE | |
144 | #undef __GATE | |
145 | #undef _GCC_PLUGIN_CONCAT2 | |
146 | #undef _GCC_PLUGIN_CONCAT3 | |
147 | #undef _GCC_PLUGIN_STRINGIFY | |
148 | #undef __GCC_PLUGIN_STRINGIFY | |
149 | #undef _HAS_EXECUTE | |
150 | #undef _HAS_GATE | |
151 | #undef _MAKE_PASS_NAME_PASS | |
152 | #undef __MAKE_PASS_NAME_PASS | |
153 | #undef _PASS_NAME_NAME | |
154 | #undef _PASS_NAME_PASS | |
155 | #undef __PASS_NAME_PASS | |
156 | #undef _PASS_NAME_PASS_DATA | |
157 | #undef __PASS_NAME_PASS_DATA | |
158 | ||
159 | #endif /* PASS_NAME */ |