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