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