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 | ||
6b90bd4b ER |
76 | namespace { |
77 | static const pass_data _PASS_NAME_PASS_DATA = { | |
6b90bd4b ER |
78 | .type = SIMPLE_IPA_PASS, |
79 | .name = _PASS_NAME_NAME, | |
6b90bd4b | 80 | .optinfo_flags = OPTGROUP_NONE, |
6b90bd4b ER |
81 | .tv_id = TV_NONE, |
82 | .properties_required = PROPERTIES_REQUIRED, | |
83 | .properties_provided = PROPERTIES_PROVIDED, | |
84 | .properties_destroyed = PROPERTIES_DESTROYED, | |
85 | .todo_flags_start = TODO_FLAGS_START, | |
86 | .todo_flags_finish = TODO_FLAGS_FINISH, | |
6b90bd4b ER |
87 | }; |
88 | ||
6b90bd4b ER |
89 | class _PASS_NAME_PASS : public simple_ipa_opt_pass { |
90 | public: | |
91 | _PASS_NAME_PASS() : simple_ipa_opt_pass(_PASS_NAME_PASS_DATA, g) {} | |
92 | ||
93 | #ifndef NO_GATE | |
6b90bd4b | 94 | virtual bool gate(function *) { return _GATE(); } |
6b90bd4b ER |
95 | #endif |
96 | ||
97 | virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } | |
98 | ||
99 | #ifndef NO_EXECUTE | |
6b90bd4b | 100 | virtual unsigned int execute(function *) { return _EXECUTE(); } |
6b90bd4b ER |
101 | #endif |
102 | }; | |
103 | } | |
104 | ||
105 | opt_pass *_MAKE_PASS_NAME_PASS(void) | |
106 | { | |
107 | return new _PASS_NAME_PASS(); | |
108 | } | |
6b90bd4b ER |
109 | |
110 | /* clean up user provided defines */ | |
111 | #undef PASS_NAME | |
112 | #undef NO_GATE | |
113 | #undef NO_EXECUTE | |
114 | ||
115 | #undef PROPERTIES_DESTROYED | |
116 | #undef PROPERTIES_PROVIDED | |
117 | #undef PROPERTIES_REQUIRED | |
118 | #undef TODO_FLAGS_FINISH | |
119 | #undef TODO_FLAGS_START | |
120 | ||
121 | /* clean up generated defines */ | |
122 | #undef _EXECUTE | |
123 | #undef __EXECUTE | |
124 | #undef _GATE | |
125 | #undef __GATE | |
126 | #undef _GCC_PLUGIN_CONCAT2 | |
127 | #undef _GCC_PLUGIN_CONCAT3 | |
128 | #undef _GCC_PLUGIN_STRINGIFY | |
129 | #undef __GCC_PLUGIN_STRINGIFY | |
130 | #undef _HAS_EXECUTE | |
131 | #undef _HAS_GATE | |
132 | #undef _MAKE_PASS_NAME_PASS | |
133 | #undef __MAKE_PASS_NAME_PASS | |
134 | #undef _PASS_NAME_NAME | |
135 | #undef _PASS_NAME_PASS | |
136 | #undef __PASS_NAME_PASS | |
137 | #undef _PASS_NAME_PASS_DATA | |
138 | #undef __PASS_NAME_PASS_DATA | |
139 | ||
140 | #endif /* PASS_NAME */ |