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