Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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