1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Generator for IPA pass related boilerplate code/data 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Supports gcc 4.5-6 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * Usage: 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * 1. before inclusion define PASS_NAME 10*4882a593Smuzhiyun * 2. before inclusion define NO_* for unimplemented callbacks 11*4882a593Smuzhiyun * NO_GENERATE_SUMMARY 12*4882a593Smuzhiyun * NO_READ_SUMMARY 13*4882a593Smuzhiyun * NO_WRITE_SUMMARY 14*4882a593Smuzhiyun * NO_READ_OPTIMIZATION_SUMMARY 15*4882a593Smuzhiyun * NO_WRITE_OPTIMIZATION_SUMMARY 16*4882a593Smuzhiyun * NO_STMT_FIXUP 17*4882a593Smuzhiyun * NO_FUNCTION_TRANSFORM 18*4882a593Smuzhiyun * NO_VARIABLE_TRANSFORM 19*4882a593Smuzhiyun * NO_GATE 20*4882a593Smuzhiyun * NO_EXECUTE 21*4882a593Smuzhiyun * 3. before inclusion define PROPERTIES_* and *TODO_FLAGS_* to override 22*4882a593Smuzhiyun * the default 0 values 23*4882a593Smuzhiyun * 4. for convenience, all the above will be undefined after inclusion! 24*4882a593Smuzhiyun * 5. the only exported name is make_PASS_NAME_pass() to register with gcc 25*4882a593Smuzhiyun */ 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #ifndef PASS_NAME 28*4882a593Smuzhiyun #error at least PASS_NAME must be defined 29*4882a593Smuzhiyun #else 30*4882a593Smuzhiyun #define __GCC_PLUGIN_STRINGIFY(n) #n 31*4882a593Smuzhiyun #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) 32*4882a593Smuzhiyun #define _GCC_PLUGIN_CONCAT2(x, y) x ## y 33*4882a593Smuzhiyun #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z 34*4882a593Smuzhiyun 35*4882a593Smuzhiyun #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) 36*4882a593Smuzhiyun #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) 37*4882a593Smuzhiyun 38*4882a593Smuzhiyun #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) 39*4882a593Smuzhiyun #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) 44*4882a593Smuzhiyun #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) 45*4882a593Smuzhiyun 46*4882a593Smuzhiyun #ifdef NO_GENERATE_SUMMARY 47*4882a593Smuzhiyun #define _GENERATE_SUMMARY NULL 48*4882a593Smuzhiyun #else 49*4882a593Smuzhiyun #define __GENERATE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _generate_summary) 50*4882a593Smuzhiyun #define _GENERATE_SUMMARY __GENERATE_SUMMARY(PASS_NAME) 51*4882a593Smuzhiyun #endif 52*4882a593Smuzhiyun 53*4882a593Smuzhiyun #ifdef NO_READ_SUMMARY 54*4882a593Smuzhiyun #define _READ_SUMMARY NULL 55*4882a593Smuzhiyun #else 56*4882a593Smuzhiyun #define __READ_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_summary) 57*4882a593Smuzhiyun #define _READ_SUMMARY __READ_SUMMARY(PASS_NAME) 58*4882a593Smuzhiyun #endif 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun #ifdef NO_WRITE_SUMMARY 61*4882a593Smuzhiyun #define _WRITE_SUMMARY NULL 62*4882a593Smuzhiyun #else 63*4882a593Smuzhiyun #define __WRITE_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_summary) 64*4882a593Smuzhiyun #define _WRITE_SUMMARY __WRITE_SUMMARY(PASS_NAME) 65*4882a593Smuzhiyun #endif 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun #ifdef NO_READ_OPTIMIZATION_SUMMARY 68*4882a593Smuzhiyun #define _READ_OPTIMIZATION_SUMMARY NULL 69*4882a593Smuzhiyun #else 70*4882a593Smuzhiyun #define __READ_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _read_optimization_summary) 71*4882a593Smuzhiyun #define _READ_OPTIMIZATION_SUMMARY __READ_OPTIMIZATION_SUMMARY(PASS_NAME) 72*4882a593Smuzhiyun #endif 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun #ifdef NO_WRITE_OPTIMIZATION_SUMMARY 75*4882a593Smuzhiyun #define _WRITE_OPTIMIZATION_SUMMARY NULL 76*4882a593Smuzhiyun #else 77*4882a593Smuzhiyun #define __WRITE_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_optimization_summary) 78*4882a593Smuzhiyun #define _WRITE_OPTIMIZATION_SUMMARY __WRITE_OPTIMIZATION_SUMMARY(PASS_NAME) 79*4882a593Smuzhiyun #endif 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun #ifdef NO_STMT_FIXUP 82*4882a593Smuzhiyun #define _STMT_FIXUP NULL 83*4882a593Smuzhiyun #else 84*4882a593Smuzhiyun #define __STMT_FIXUP(n) _GCC_PLUGIN_CONCAT2(n, _stmt_fixup) 85*4882a593Smuzhiyun #define _STMT_FIXUP __STMT_FIXUP(PASS_NAME) 86*4882a593Smuzhiyun #endif 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun #ifdef NO_FUNCTION_TRANSFORM 89*4882a593Smuzhiyun #define _FUNCTION_TRANSFORM NULL 90*4882a593Smuzhiyun #else 91*4882a593Smuzhiyun #define __FUNCTION_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _function_transform) 92*4882a593Smuzhiyun #define _FUNCTION_TRANSFORM __FUNCTION_TRANSFORM(PASS_NAME) 93*4882a593Smuzhiyun #endif 94*4882a593Smuzhiyun 95*4882a593Smuzhiyun #ifdef NO_VARIABLE_TRANSFORM 96*4882a593Smuzhiyun #define _VARIABLE_TRANSFORM NULL 97*4882a593Smuzhiyun #else 98*4882a593Smuzhiyun #define __VARIABLE_TRANSFORM(n) _GCC_PLUGIN_CONCAT2(n, _variable_transform) 99*4882a593Smuzhiyun #define _VARIABLE_TRANSFORM __VARIABLE_TRANSFORM(PASS_NAME) 100*4882a593Smuzhiyun #endif 101*4882a593Smuzhiyun 102*4882a593Smuzhiyun #ifdef NO_GATE 103*4882a593Smuzhiyun #define _GATE NULL 104*4882a593Smuzhiyun #define _HAS_GATE false 105*4882a593Smuzhiyun #else 106*4882a593Smuzhiyun #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) 107*4882a593Smuzhiyun #define _GATE __GATE(PASS_NAME) 108*4882a593Smuzhiyun #define _HAS_GATE true 109*4882a593Smuzhiyun #endif 110*4882a593Smuzhiyun 111*4882a593Smuzhiyun #ifdef NO_EXECUTE 112*4882a593Smuzhiyun #define _EXECUTE NULL 113*4882a593Smuzhiyun #define _HAS_EXECUTE false 114*4882a593Smuzhiyun #else 115*4882a593Smuzhiyun #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) 116*4882a593Smuzhiyun #define _EXECUTE __EXECUTE(PASS_NAME) 117*4882a593Smuzhiyun #define _HAS_EXECUTE true 118*4882a593Smuzhiyun #endif 119*4882a593Smuzhiyun 120*4882a593Smuzhiyun #ifndef PROPERTIES_REQUIRED 121*4882a593Smuzhiyun #define PROPERTIES_REQUIRED 0 122*4882a593Smuzhiyun #endif 123*4882a593Smuzhiyun 124*4882a593Smuzhiyun #ifndef PROPERTIES_PROVIDED 125*4882a593Smuzhiyun #define PROPERTIES_PROVIDED 0 126*4882a593Smuzhiyun #endif 127*4882a593Smuzhiyun 128*4882a593Smuzhiyun #ifndef PROPERTIES_DESTROYED 129*4882a593Smuzhiyun #define PROPERTIES_DESTROYED 0 130*4882a593Smuzhiyun #endif 131*4882a593Smuzhiyun 132*4882a593Smuzhiyun #ifndef TODO_FLAGS_START 133*4882a593Smuzhiyun #define TODO_FLAGS_START 0 134*4882a593Smuzhiyun #endif 135*4882a593Smuzhiyun 136*4882a593Smuzhiyun #ifndef TODO_FLAGS_FINISH 137*4882a593Smuzhiyun #define TODO_FLAGS_FINISH 0 138*4882a593Smuzhiyun #endif 139*4882a593Smuzhiyun 140*4882a593Smuzhiyun #ifndef FUNCTION_TRANSFORM_TODO_FLAGS_START 141*4882a593Smuzhiyun #define FUNCTION_TRANSFORM_TODO_FLAGS_START 0 142*4882a593Smuzhiyun #endif 143*4882a593Smuzhiyun 144*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 4009 145*4882a593Smuzhiyun namespace { 146*4882a593Smuzhiyun static const pass_data _PASS_NAME_PASS_DATA = { 147*4882a593Smuzhiyun #else 148*4882a593Smuzhiyun static struct ipa_opt_pass_d _PASS_NAME_PASS = { 149*4882a593Smuzhiyun .pass = { 150*4882a593Smuzhiyun #endif 151*4882a593Smuzhiyun .type = IPA_PASS, 152*4882a593Smuzhiyun .name = _PASS_NAME_NAME, 153*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 4008 154*4882a593Smuzhiyun .optinfo_flags = OPTGROUP_NONE, 155*4882a593Smuzhiyun #endif 156*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 5000 157*4882a593Smuzhiyun #elif BUILDING_GCC_VERSION == 4009 158*4882a593Smuzhiyun .has_gate = _HAS_GATE, 159*4882a593Smuzhiyun .has_execute = _HAS_EXECUTE, 160*4882a593Smuzhiyun #else 161*4882a593Smuzhiyun .gate = _GATE, 162*4882a593Smuzhiyun .execute = _EXECUTE, 163*4882a593Smuzhiyun .sub = NULL, 164*4882a593Smuzhiyun .next = NULL, 165*4882a593Smuzhiyun .static_pass_number = 0, 166*4882a593Smuzhiyun #endif 167*4882a593Smuzhiyun .tv_id = TV_NONE, 168*4882a593Smuzhiyun .properties_required = PROPERTIES_REQUIRED, 169*4882a593Smuzhiyun .properties_provided = PROPERTIES_PROVIDED, 170*4882a593Smuzhiyun .properties_destroyed = PROPERTIES_DESTROYED, 171*4882a593Smuzhiyun .todo_flags_start = TODO_FLAGS_START, 172*4882a593Smuzhiyun .todo_flags_finish = TODO_FLAGS_FINISH, 173*4882a593Smuzhiyun #if BUILDING_GCC_VERSION < 4009 174*4882a593Smuzhiyun }, 175*4882a593Smuzhiyun .generate_summary = _GENERATE_SUMMARY, 176*4882a593Smuzhiyun .write_summary = _WRITE_SUMMARY, 177*4882a593Smuzhiyun .read_summary = _READ_SUMMARY, 178*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 4006 179*4882a593Smuzhiyun .write_optimization_summary = _WRITE_OPTIMIZATION_SUMMARY, 180*4882a593Smuzhiyun .read_optimization_summary = _READ_OPTIMIZATION_SUMMARY, 181*4882a593Smuzhiyun #endif 182*4882a593Smuzhiyun .stmt_fixup = _STMT_FIXUP, 183*4882a593Smuzhiyun .function_transform_todo_flags_start = FUNCTION_TRANSFORM_TODO_FLAGS_START, 184*4882a593Smuzhiyun .function_transform = _FUNCTION_TRANSFORM, 185*4882a593Smuzhiyun .variable_transform = _VARIABLE_TRANSFORM, 186*4882a593Smuzhiyun #endif 187*4882a593Smuzhiyun }; 188*4882a593Smuzhiyun 189*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 4009 190*4882a593Smuzhiyun class _PASS_NAME_PASS : public ipa_opt_pass_d { 191*4882a593Smuzhiyun public: 192*4882a593Smuzhiyun _PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA, 193*4882a593Smuzhiyun g, 194*4882a593Smuzhiyun _GENERATE_SUMMARY, 195*4882a593Smuzhiyun _WRITE_SUMMARY, 196*4882a593Smuzhiyun _READ_SUMMARY, 197*4882a593Smuzhiyun _WRITE_OPTIMIZATION_SUMMARY, 198*4882a593Smuzhiyun _READ_OPTIMIZATION_SUMMARY, 199*4882a593Smuzhiyun _STMT_FIXUP, 200*4882a593Smuzhiyun FUNCTION_TRANSFORM_TODO_FLAGS_START, 201*4882a593Smuzhiyun _FUNCTION_TRANSFORM, 202*4882a593Smuzhiyun _VARIABLE_TRANSFORM) {} 203*4882a593Smuzhiyun 204*4882a593Smuzhiyun #ifndef NO_GATE 205*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 5000 206*4882a593Smuzhiyun virtual bool gate(function *) { return _GATE(); } 207*4882a593Smuzhiyun #else 208*4882a593Smuzhiyun virtual bool gate(void) { return _GATE(); } 209*4882a593Smuzhiyun #endif 210*4882a593Smuzhiyun #endif 211*4882a593Smuzhiyun 212*4882a593Smuzhiyun virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } 213*4882a593Smuzhiyun 214*4882a593Smuzhiyun #ifndef NO_EXECUTE 215*4882a593Smuzhiyun #if BUILDING_GCC_VERSION >= 5000 216*4882a593Smuzhiyun virtual unsigned int execute(function *) { return _EXECUTE(); } 217*4882a593Smuzhiyun #else 218*4882a593Smuzhiyun virtual unsigned int execute(void) { return _EXECUTE(); } 219*4882a593Smuzhiyun #endif 220*4882a593Smuzhiyun #endif 221*4882a593Smuzhiyun }; 222*4882a593Smuzhiyun } 223*4882a593Smuzhiyun 224*4882a593Smuzhiyun opt_pass *_MAKE_PASS_NAME_PASS(void) 225*4882a593Smuzhiyun { 226*4882a593Smuzhiyun return new _PASS_NAME_PASS(); 227*4882a593Smuzhiyun } 228*4882a593Smuzhiyun #else 229*4882a593Smuzhiyun struct opt_pass *_MAKE_PASS_NAME_PASS(void) 230*4882a593Smuzhiyun { 231*4882a593Smuzhiyun return &_PASS_NAME_PASS.pass; 232*4882a593Smuzhiyun } 233*4882a593Smuzhiyun #endif 234*4882a593Smuzhiyun 235*4882a593Smuzhiyun /* clean up user provided defines */ 236*4882a593Smuzhiyun #undef PASS_NAME 237*4882a593Smuzhiyun #undef NO_GENERATE_SUMMARY 238*4882a593Smuzhiyun #undef NO_WRITE_SUMMARY 239*4882a593Smuzhiyun #undef NO_READ_SUMMARY 240*4882a593Smuzhiyun #undef NO_WRITE_OPTIMIZATION_SUMMARY 241*4882a593Smuzhiyun #undef NO_READ_OPTIMIZATION_SUMMARY 242*4882a593Smuzhiyun #undef NO_STMT_FIXUP 243*4882a593Smuzhiyun #undef NO_FUNCTION_TRANSFORM 244*4882a593Smuzhiyun #undef NO_VARIABLE_TRANSFORM 245*4882a593Smuzhiyun #undef NO_GATE 246*4882a593Smuzhiyun #undef NO_EXECUTE 247*4882a593Smuzhiyun 248*4882a593Smuzhiyun #undef FUNCTION_TRANSFORM_TODO_FLAGS_START 249*4882a593Smuzhiyun #undef PROPERTIES_DESTROYED 250*4882a593Smuzhiyun #undef PROPERTIES_PROVIDED 251*4882a593Smuzhiyun #undef PROPERTIES_REQUIRED 252*4882a593Smuzhiyun #undef TODO_FLAGS_FINISH 253*4882a593Smuzhiyun #undef TODO_FLAGS_START 254*4882a593Smuzhiyun 255*4882a593Smuzhiyun /* clean up generated defines */ 256*4882a593Smuzhiyun #undef _EXECUTE 257*4882a593Smuzhiyun #undef __EXECUTE 258*4882a593Smuzhiyun #undef _FUNCTION_TRANSFORM 259*4882a593Smuzhiyun #undef __FUNCTION_TRANSFORM 260*4882a593Smuzhiyun #undef _GATE 261*4882a593Smuzhiyun #undef __GATE 262*4882a593Smuzhiyun #undef _GCC_PLUGIN_CONCAT2 263*4882a593Smuzhiyun #undef _GCC_PLUGIN_CONCAT3 264*4882a593Smuzhiyun #undef _GCC_PLUGIN_STRINGIFY 265*4882a593Smuzhiyun #undef __GCC_PLUGIN_STRINGIFY 266*4882a593Smuzhiyun #undef _GENERATE_SUMMARY 267*4882a593Smuzhiyun #undef __GENERATE_SUMMARY 268*4882a593Smuzhiyun #undef _HAS_EXECUTE 269*4882a593Smuzhiyun #undef _HAS_GATE 270*4882a593Smuzhiyun #undef _MAKE_PASS_NAME_PASS 271*4882a593Smuzhiyun #undef __MAKE_PASS_NAME_PASS 272*4882a593Smuzhiyun #undef _PASS_NAME_NAME 273*4882a593Smuzhiyun #undef _PASS_NAME_PASS 274*4882a593Smuzhiyun #undef __PASS_NAME_PASS 275*4882a593Smuzhiyun #undef _PASS_NAME_PASS_DATA 276*4882a593Smuzhiyun #undef __PASS_NAME_PASS_DATA 277*4882a593Smuzhiyun #undef _READ_OPTIMIZATION_SUMMARY 278*4882a593Smuzhiyun #undef __READ_OPTIMIZATION_SUMMARY 279*4882a593Smuzhiyun #undef _READ_SUMMARY 280*4882a593Smuzhiyun #undef __READ_SUMMARY 281*4882a593Smuzhiyun #undef _STMT_FIXUP 282*4882a593Smuzhiyun #undef __STMT_FIXUP 283*4882a593Smuzhiyun #undef _VARIABLE_TRANSFORM 284*4882a593Smuzhiyun #undef __VARIABLE_TRANSFORM 285*4882a593Smuzhiyun #undef _WRITE_OPTIMIZATION_SUMMARY 286*4882a593Smuzhiyun #undef __WRITE_OPTIMIZATION_SUMMARY 287*4882a593Smuzhiyun #undef _WRITE_SUMMARY 288*4882a593Smuzhiyun #undef __WRITE_SUMMARY 289*4882a593Smuzhiyun 290*4882a593Smuzhiyun #endif /* PASS_NAME */ 291