^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Generator for GIMPLE pass related boilerplate code/data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * Supports gcc 4.5-6
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) * Usage:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) * 1. before inclusion define PASS_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) * 2. before inclusion define NO_* for unimplemented callbacks
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * NO_GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * NO_EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * the default 0 values
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * 4. for convenience, all the above will be undefined after inclusion!
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * 5. the only exported name is make_PASS_NAME_pass() to register with gcc
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #ifndef PASS_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #error at least PASS_NAME must be defined
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define __GCC_PLUGIN_STRINGIFY(n) #n
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define _GCC_PLUGIN_CONCAT2(x, y) x ## y
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) #ifdef NO_GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) #define _GATE NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) #define _HAS_GATE false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define _GATE __GATE(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define _HAS_GATE true
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) #ifdef NO_EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) #define _EXECUTE NULL
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) #define _HAS_EXECUTE false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) #define _EXECUTE __EXECUTE(PASS_NAME)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) #define _HAS_EXECUTE true
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) #ifndef PROPERTIES_REQUIRED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) #define PROPERTIES_REQUIRED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) #ifndef PROPERTIES_PROVIDED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) #define PROPERTIES_PROVIDED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #ifndef PROPERTIES_DESTROYED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #define PROPERTIES_DESTROYED 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) #ifndef TODO_FLAGS_START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #define TODO_FLAGS_START 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) #ifndef TODO_FLAGS_FINISH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) #define TODO_FLAGS_FINISH 0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #if BUILDING_GCC_VERSION >= 4009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) namespace {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) static const pass_data _PASS_NAME_PASS_DATA = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) static struct gimple_opt_pass _PASS_NAME_PASS = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) .pass = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) .type = GIMPLE_PASS,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) .name = _PASS_NAME_NAME,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #if BUILDING_GCC_VERSION >= 4008
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) .optinfo_flags = OPTGROUP_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #if BUILDING_GCC_VERSION >= 5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) #elif BUILDING_GCC_VERSION == 4009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) .has_gate = _HAS_GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) .has_execute = _HAS_EXECUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) .gate = _GATE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) .execute = _EXECUTE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) .sub = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) .next = NULL,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) .static_pass_number = 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) .tv_id = TV_NONE,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) .properties_required = PROPERTIES_REQUIRED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) .properties_provided = PROPERTIES_PROVIDED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) .properties_destroyed = PROPERTIES_DESTROYED,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) .todo_flags_start = TODO_FLAGS_START,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) .todo_flags_finish = TODO_FLAGS_FINISH,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) #if BUILDING_GCC_VERSION < 4009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) #if BUILDING_GCC_VERSION >= 4009
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) class _PASS_NAME_PASS : public gimple_opt_pass {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) public:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) _PASS_NAME_PASS() : gimple_opt_pass(_PASS_NAME_PASS_DATA, g) {}
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) #ifndef NO_GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) #if BUILDING_GCC_VERSION >= 5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) virtual bool gate(function *) { return _GATE(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) virtual bool gate(void) { return _GATE(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) virtual opt_pass * clone () { return new _PASS_NAME_PASS(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) #ifndef NO_EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) #if BUILDING_GCC_VERSION >= 5000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) virtual unsigned int execute(function *) { return _EXECUTE(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) virtual unsigned int execute(void) { return _EXECUTE(); }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) opt_pass *_MAKE_PASS_NAME_PASS(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) return new _PASS_NAME_PASS();
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) #else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct opt_pass *_MAKE_PASS_NAME_PASS(void)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) return &_PASS_NAME_PASS.pass;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) /* clean up user provided defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) #undef PASS_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) #undef NO_GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) #undef NO_EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) #undef PROPERTIES_DESTROYED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) #undef PROPERTIES_PROVIDED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) #undef PROPERTIES_REQUIRED
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) #undef TODO_FLAGS_FINISH
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) #undef TODO_FLAGS_START
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) /* clean up generated defines */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) #undef _EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) #undef __EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) #undef _GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) #undef __GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) #undef _GCC_PLUGIN_CONCAT2
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) #undef _GCC_PLUGIN_CONCAT3
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) #undef _GCC_PLUGIN_STRINGIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) #undef __GCC_PLUGIN_STRINGIFY
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) #undef _HAS_EXECUTE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) #undef _HAS_GATE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) #undef _MAKE_PASS_NAME_PASS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) #undef __MAKE_PASS_NAME_PASS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) #undef _PASS_NAME_NAME
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) #undef _PASS_NAME_PASS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) #undef __PASS_NAME_PASS
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) #undef _PASS_NAME_PASS_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) #undef __PASS_NAME_PASS_DATA
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) #endif /* PASS_NAME */