16b90bd4bSEmese Revfy /* 26b90bd4bSEmese Revfy * Generator for GIMPLE pass related boilerplate code/data 36b90bd4bSEmese Revfy * 46b90bd4bSEmese Revfy * Supports gcc 4.5-6 56b90bd4bSEmese Revfy * 66b90bd4bSEmese Revfy * Usage: 76b90bd4bSEmese Revfy * 86b90bd4bSEmese Revfy * 1. before inclusion define PASS_NAME 96b90bd4bSEmese Revfy * 2. before inclusion define NO_* for unimplemented callbacks 106b90bd4bSEmese Revfy * NO_GATE 116b90bd4bSEmese Revfy * NO_EXECUTE 126b90bd4bSEmese Revfy * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override 136b90bd4bSEmese Revfy * the default 0 values 146b90bd4bSEmese Revfy * 4. for convenience, all the above will be undefined after inclusion! 156b90bd4bSEmese Revfy * 5. the only exported name is make_PASS_NAME_pass() to register with gcc 166b90bd4bSEmese Revfy */ 176b90bd4bSEmese Revfy 186b90bd4bSEmese Revfy #ifndef PASS_NAME 196b90bd4bSEmese Revfy #error at least PASS_NAME must be defined 206b90bd4bSEmese Revfy #else 216b90bd4bSEmese Revfy #define __GCC_PLUGIN_STRINGIFY(n) #n 226b90bd4bSEmese Revfy #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n) 236b90bd4bSEmese Revfy #define _GCC_PLUGIN_CONCAT2(x, y) x ## y 246b90bd4bSEmese Revfy #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z 256b90bd4bSEmese Revfy 266b90bd4bSEmese Revfy #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data) 276b90bd4bSEmese Revfy #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME) 286b90bd4bSEmese Revfy 296b90bd4bSEmese Revfy #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass) 306b90bd4bSEmese Revfy #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME) 316b90bd4bSEmese Revfy 326b90bd4bSEmese Revfy #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME) 336b90bd4bSEmese Revfy 346b90bd4bSEmese Revfy #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass) 356b90bd4bSEmese Revfy #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME) 366b90bd4bSEmese Revfy 376b90bd4bSEmese Revfy #ifdef NO_GATE 386b90bd4bSEmese Revfy #define _GATE NULL 396b90bd4bSEmese Revfy #define _HAS_GATE false 406b90bd4bSEmese Revfy #else 416b90bd4bSEmese Revfy #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate) 426b90bd4bSEmese Revfy #define _GATE __GATE(PASS_NAME) 436b90bd4bSEmese Revfy #define _HAS_GATE true 446b90bd4bSEmese Revfy #endif 456b90bd4bSEmese Revfy 466b90bd4bSEmese Revfy #ifdef NO_EXECUTE 476b90bd4bSEmese Revfy #define _EXECUTE NULL 486b90bd4bSEmese Revfy #define _HAS_EXECUTE false 496b90bd4bSEmese Revfy #else 506b90bd4bSEmese Revfy #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute) 516b90bd4bSEmese Revfy #define _EXECUTE __EXECUTE(PASS_NAME) 526b90bd4bSEmese Revfy #define _HAS_EXECUTE true 536b90bd4bSEmese Revfy #endif 546b90bd4bSEmese Revfy 556b90bd4bSEmese Revfy #ifndef PROPERTIES_REQUIRED 566b90bd4bSEmese Revfy #define PROPERTIES_REQUIRED 0 576b90bd4bSEmese Revfy #endif 586b90bd4bSEmese Revfy 596b90bd4bSEmese Revfy #ifndef PROPERTIES_PROVIDED 606b90bd4bSEmese Revfy #define PROPERTIES_PROVIDED 0 616b90bd4bSEmese Revfy #endif 626b90bd4bSEmese Revfy 636b90bd4bSEmese Revfy #ifndef PROPERTIES_DESTROYED 646b90bd4bSEmese Revfy #define PROPERTIES_DESTROYED 0 656b90bd4bSEmese Revfy #endif 666b90bd4bSEmese Revfy 676b90bd4bSEmese Revfy #ifndef TODO_FLAGS_START 686b90bd4bSEmese Revfy #define TODO_FLAGS_START 0 696b90bd4bSEmese Revfy #endif 706b90bd4bSEmese Revfy 716b90bd4bSEmese Revfy #ifndef TODO_FLAGS_FINISH 726b90bd4bSEmese Revfy #define TODO_FLAGS_FINISH 0 736b90bd4bSEmese Revfy #endif 746b90bd4bSEmese Revfy 756b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4009 766b90bd4bSEmese Revfy namespace { 776b90bd4bSEmese Revfy static const pass_data _PASS_NAME_PASS_DATA = { 786b90bd4bSEmese Revfy #else 796b90bd4bSEmese Revfy static struct gimple_opt_pass _PASS_NAME_PASS = { 806b90bd4bSEmese Revfy .pass = { 816b90bd4bSEmese Revfy #endif 826b90bd4bSEmese Revfy .type = GIMPLE_PASS, 836b90bd4bSEmese Revfy .name = _PASS_NAME_NAME, 846b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4008 856b90bd4bSEmese Revfy .optinfo_flags = OPTGROUP_NONE, 866b90bd4bSEmese Revfy #endif 876b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000 886b90bd4bSEmese Revfy #elif BUILDING_GCC_VERSION == 4009 896b90bd4bSEmese Revfy .has_gate = _HAS_GATE, 906b90bd4bSEmese Revfy .has_execute = _HAS_EXECUTE, 916b90bd4bSEmese Revfy #else 926b90bd4bSEmese Revfy .gate = _GATE, 936b90bd4bSEmese Revfy .execute = _EXECUTE, 946b90bd4bSEmese Revfy .sub = NULL, 956b90bd4bSEmese Revfy .next = NULL, 966b90bd4bSEmese Revfy .static_pass_number = 0, 976b90bd4bSEmese Revfy #endif 986b90bd4bSEmese Revfy .tv_id = TV_NONE, 996b90bd4bSEmese Revfy .properties_required = PROPERTIES_REQUIRED, 1006b90bd4bSEmese Revfy .properties_provided = PROPERTIES_PROVIDED, 1016b90bd4bSEmese Revfy .properties_destroyed = PROPERTIES_DESTROYED, 1026b90bd4bSEmese Revfy .todo_flags_start = TODO_FLAGS_START, 1036b90bd4bSEmese Revfy .todo_flags_finish = TODO_FLAGS_FINISH, 1046b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION < 4009 1056b90bd4bSEmese Revfy } 1066b90bd4bSEmese Revfy #endif 1076b90bd4bSEmese Revfy }; 1086b90bd4bSEmese Revfy 1096b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4009 1106b90bd4bSEmese Revfy class _PASS_NAME_PASS : public gimple_opt_pass { 1116b90bd4bSEmese Revfy public: 1126b90bd4bSEmese Revfy _PASS_NAME_PASS() : gimple_opt_pass(_PASS_NAME_PASS_DATA, g) {} 1136b90bd4bSEmese Revfy 1146b90bd4bSEmese Revfy #ifndef NO_GATE 1156b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000 1166b90bd4bSEmese Revfy virtual bool gate(function *) { return _GATE(); } 1176b90bd4bSEmese Revfy #else 1186b90bd4bSEmese Revfy virtual bool gate(void) { return _GATE(); } 1196b90bd4bSEmese Revfy #endif 1206b90bd4bSEmese Revfy #endif 1216b90bd4bSEmese Revfy 1226b90bd4bSEmese Revfy virtual opt_pass * clone () { return new _PASS_NAME_PASS(); } 1236b90bd4bSEmese Revfy 1246b90bd4bSEmese Revfy #ifndef NO_EXECUTE 1256b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000 1266b90bd4bSEmese Revfy virtual unsigned int execute(function *) { return _EXECUTE(); } 1276b90bd4bSEmese Revfy #else 1286b90bd4bSEmese Revfy virtual unsigned int execute(void) { return _EXECUTE(); } 1296b90bd4bSEmese Revfy #endif 1306b90bd4bSEmese Revfy #endif 1316b90bd4bSEmese Revfy }; 1326b90bd4bSEmese Revfy } 1336b90bd4bSEmese Revfy 1346b90bd4bSEmese Revfy opt_pass *_MAKE_PASS_NAME_PASS(void) 1356b90bd4bSEmese Revfy { 1366b90bd4bSEmese Revfy return new _PASS_NAME_PASS(); 1376b90bd4bSEmese Revfy } 1386b90bd4bSEmese Revfy #else 1396b90bd4bSEmese Revfy struct opt_pass *_MAKE_PASS_NAME_PASS(void) 1406b90bd4bSEmese Revfy { 1416b90bd4bSEmese Revfy return &_PASS_NAME_PASS.pass; 1426b90bd4bSEmese Revfy } 1436b90bd4bSEmese Revfy #endif 1446b90bd4bSEmese Revfy 1456b90bd4bSEmese Revfy /* clean up user provided defines */ 1466b90bd4bSEmese Revfy #undef PASS_NAME 1476b90bd4bSEmese Revfy #undef NO_GATE 1486b90bd4bSEmese Revfy #undef NO_EXECUTE 1496b90bd4bSEmese Revfy 1506b90bd4bSEmese Revfy #undef PROPERTIES_DESTROYED 1516b90bd4bSEmese Revfy #undef PROPERTIES_PROVIDED 1526b90bd4bSEmese Revfy #undef PROPERTIES_REQUIRED 1536b90bd4bSEmese Revfy #undef TODO_FLAGS_FINISH 1546b90bd4bSEmese Revfy #undef TODO_FLAGS_START 1556b90bd4bSEmese Revfy 1566b90bd4bSEmese Revfy /* clean up generated defines */ 1576b90bd4bSEmese Revfy #undef _EXECUTE 1586b90bd4bSEmese Revfy #undef __EXECUTE 1596b90bd4bSEmese Revfy #undef _GATE 1606b90bd4bSEmese Revfy #undef __GATE 1616b90bd4bSEmese Revfy #undef _GCC_PLUGIN_CONCAT2 1626b90bd4bSEmese Revfy #undef _GCC_PLUGIN_CONCAT3 1636b90bd4bSEmese Revfy #undef _GCC_PLUGIN_STRINGIFY 1646b90bd4bSEmese Revfy #undef __GCC_PLUGIN_STRINGIFY 1656b90bd4bSEmese Revfy #undef _HAS_EXECUTE 1666b90bd4bSEmese Revfy #undef _HAS_GATE 1676b90bd4bSEmese Revfy #undef _MAKE_PASS_NAME_PASS 1686b90bd4bSEmese Revfy #undef __MAKE_PASS_NAME_PASS 1696b90bd4bSEmese Revfy #undef _PASS_NAME_NAME 1706b90bd4bSEmese Revfy #undef _PASS_NAME_PASS 1716b90bd4bSEmese Revfy #undef __PASS_NAME_PASS 1726b90bd4bSEmese Revfy #undef _PASS_NAME_PASS_DATA 1736b90bd4bSEmese Revfy #undef __PASS_NAME_PASS_DATA 1746b90bd4bSEmese Revfy 1756b90bd4bSEmese Revfy #endif /* PASS_NAME */ 176