gcc-generate-ipa-pass.h (6429B)
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 144namespace { 145static const pass_data _PASS_NAME_PASS_DATA = { 146 .type = IPA_PASS, 147 .name = _PASS_NAME_NAME, 148 .optinfo_flags = OPTGROUP_NONE, 149 .tv_id = TV_NONE, 150 .properties_required = PROPERTIES_REQUIRED, 151 .properties_provided = PROPERTIES_PROVIDED, 152 .properties_destroyed = PROPERTIES_DESTROYED, 153 .todo_flags_start = TODO_FLAGS_START, 154 .todo_flags_finish = TODO_FLAGS_FINISH, 155}; 156 157class _PASS_NAME_PASS : public ipa_opt_pass_d { 158public: 159 _PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA, 160 g, 161 _GENERATE_SUMMARY, 162 _WRITE_SUMMARY, 163 _READ_SUMMARY, 164 _WRITE_OPTIMIZATION_SUMMARY, 165 _READ_OPTIMIZATION_SUMMARY, 166 _STMT_FIXUP, 167 FUNCTION_TRANSFORM_TODO_FLAGS_START, 168 _FUNCTION_TRANSFORM, 169 _VARIABLE_TRANSFORM) {} 170 171#ifndef NO_GATE 172 virtual bool gate(function *) { return _GATE(); } 173 174 virtual opt_pass *clone() { return new _PASS_NAME_PASS(); } 175 176#ifndef NO_EXECUTE 177 virtual unsigned int execute(function *) { return _EXECUTE(); } 178#endif 179}; 180} 181 182opt_pass *_MAKE_PASS_NAME_PASS(void) 183{ 184 return new _PASS_NAME_PASS(); 185} 186#else 187struct opt_pass *_MAKE_PASS_NAME_PASS(void) 188{ 189 return &_PASS_NAME_PASS.pass; 190} 191#endif 192 193/* clean up user provided defines */ 194#undef PASS_NAME 195#undef NO_GENERATE_SUMMARY 196#undef NO_WRITE_SUMMARY 197#undef NO_READ_SUMMARY 198#undef NO_WRITE_OPTIMIZATION_SUMMARY 199#undef NO_READ_OPTIMIZATION_SUMMARY 200#undef NO_STMT_FIXUP 201#undef NO_FUNCTION_TRANSFORM 202#undef NO_VARIABLE_TRANSFORM 203#undef NO_GATE 204#undef NO_EXECUTE 205 206#undef FUNCTION_TRANSFORM_TODO_FLAGS_START 207#undef PROPERTIES_DESTROYED 208#undef PROPERTIES_PROVIDED 209#undef PROPERTIES_REQUIRED 210#undef TODO_FLAGS_FINISH 211#undef TODO_FLAGS_START 212 213/* clean up generated defines */ 214#undef _EXECUTE 215#undef __EXECUTE 216#undef _FUNCTION_TRANSFORM 217#undef __FUNCTION_TRANSFORM 218#undef _GATE 219#undef __GATE 220#undef _GCC_PLUGIN_CONCAT2 221#undef _GCC_PLUGIN_CONCAT3 222#undef _GCC_PLUGIN_STRINGIFY 223#undef __GCC_PLUGIN_STRINGIFY 224#undef _GENERATE_SUMMARY 225#undef __GENERATE_SUMMARY 226#undef _HAS_EXECUTE 227#undef _HAS_GATE 228#undef _MAKE_PASS_NAME_PASS 229#undef __MAKE_PASS_NAME_PASS 230#undef _PASS_NAME_NAME 231#undef _PASS_NAME_PASS 232#undef __PASS_NAME_PASS 233#undef _PASS_NAME_PASS_DATA 234#undef __PASS_NAME_PASS_DATA 235#undef _READ_OPTIMIZATION_SUMMARY 236#undef __READ_OPTIMIZATION_SUMMARY 237#undef _READ_SUMMARY 238#undef __READ_SUMMARY 239#undef _STMT_FIXUP 240#undef __STMT_FIXUP 241#undef _VARIABLE_TRANSFORM 242#undef __VARIABLE_TRANSFORM 243#undef _WRITE_OPTIMIZATION_SUMMARY 244#undef __WRITE_OPTIMIZATION_SUMMARY 245#undef _WRITE_SUMMARY 246#undef __WRITE_SUMMARY 247 248#endif /* PASS_NAME */