0001
0002
0003
0004
0005
0006
0007
0008
0009
0010
0011
0012
0013
0014
0015
0016
0017
0018
0019 #ifndef PASS_NAME
0020 #error at least PASS_NAME must be defined
0021 #else
0022 #define __GCC_PLUGIN_STRINGIFY(n) #n
0023 #define _GCC_PLUGIN_STRINGIFY(n) __GCC_PLUGIN_STRINGIFY(n)
0024 #define _GCC_PLUGIN_CONCAT2(x, y) x ## y
0025 #define _GCC_PLUGIN_CONCAT3(x, y, z) x ## y ## z
0026
0027 #define __PASS_NAME_PASS_DATA(n) _GCC_PLUGIN_CONCAT2(n, _pass_data)
0028 #define _PASS_NAME_PASS_DATA __PASS_NAME_PASS_DATA(PASS_NAME)
0029
0030 #define __PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT2(n, _pass)
0031 #define _PASS_NAME_PASS __PASS_NAME_PASS(PASS_NAME)
0032
0033 #define _PASS_NAME_NAME _GCC_PLUGIN_STRINGIFY(PASS_NAME)
0034
0035 #define __MAKE_PASS_NAME_PASS(n) _GCC_PLUGIN_CONCAT3(make_, n, _pass)
0036 #define _MAKE_PASS_NAME_PASS __MAKE_PASS_NAME_PASS(PASS_NAME)
0037
0038 #ifdef NO_GATE
0039 #define _GATE NULL
0040 #define _HAS_GATE false
0041 #else
0042 #define __GATE(n) _GCC_PLUGIN_CONCAT2(n, _gate)
0043 #define _GATE __GATE(PASS_NAME)
0044 #define _HAS_GATE true
0045 #endif
0046
0047 #ifdef NO_EXECUTE
0048 #define _EXECUTE NULL
0049 #define _HAS_EXECUTE false
0050 #else
0051 #define __EXECUTE(n) _GCC_PLUGIN_CONCAT2(n, _execute)
0052 #define _EXECUTE __EXECUTE(PASS_NAME)
0053 #define _HAS_EXECUTE true
0054 #endif
0055
0056 #ifndef PROPERTIES_REQUIRED
0057 #define PROPERTIES_REQUIRED 0
0058 #endif
0059
0060 #ifndef PROPERTIES_PROVIDED
0061 #define PROPERTIES_PROVIDED 0
0062 #endif
0063
0064 #ifndef PROPERTIES_DESTROYED
0065 #define PROPERTIES_DESTROYED 0
0066 #endif
0067
0068 #ifndef TODO_FLAGS_START
0069 #define TODO_FLAGS_START 0
0070 #endif
0071
0072 #ifndef TODO_FLAGS_FINISH
0073 #define TODO_FLAGS_FINISH 0
0074 #endif
0075
0076 namespace {
0077 static const pass_data _PASS_NAME_PASS_DATA = {
0078 .type = SIMPLE_IPA_PASS,
0079 .name = _PASS_NAME_NAME,
0080 .optinfo_flags = OPTGROUP_NONE,
0081 .tv_id = TV_NONE,
0082 .properties_required = PROPERTIES_REQUIRED,
0083 .properties_provided = PROPERTIES_PROVIDED,
0084 .properties_destroyed = PROPERTIES_DESTROYED,
0085 .todo_flags_start = TODO_FLAGS_START,
0086 .todo_flags_finish = TODO_FLAGS_FINISH,
0087 };
0088
0089 class _PASS_NAME_PASS : public simple_ipa_opt_pass {
0090 public:
0091 _PASS_NAME_PASS() : simple_ipa_opt_pass(_PASS_NAME_PASS_DATA, g) {}
0092
0093 #ifndef NO_GATE
0094 virtual bool gate(function *) { return _GATE(); }
0095 #endif
0096
0097 virtual opt_pass *clone() { return new _PASS_NAME_PASS(); }
0098
0099 #ifndef NO_EXECUTE
0100 virtual unsigned int execute(function *) { return _EXECUTE(); }
0101 #endif
0102 };
0103 }
0104
0105 opt_pass *_MAKE_PASS_NAME_PASS(void)
0106 {
0107 return new _PASS_NAME_PASS();
0108 }
0109
0110
0111 #undef PASS_NAME
0112 #undef NO_GATE
0113 #undef NO_EXECUTE
0114
0115 #undef PROPERTIES_DESTROYED
0116 #undef PROPERTIES_PROVIDED
0117 #undef PROPERTIES_REQUIRED
0118 #undef TODO_FLAGS_FINISH
0119 #undef TODO_FLAGS_START
0120
0121
0122 #undef _EXECUTE
0123 #undef __EXECUTE
0124 #undef _GATE
0125 #undef __GATE
0126 #undef _GCC_PLUGIN_CONCAT2
0127 #undef _GCC_PLUGIN_CONCAT3
0128 #undef _GCC_PLUGIN_STRINGIFY
0129 #undef __GCC_PLUGIN_STRINGIFY
0130 #undef _HAS_EXECUTE
0131 #undef _HAS_GATE
0132 #undef _MAKE_PASS_NAME_PASS
0133 #undef __MAKE_PASS_NAME_PASS
0134 #undef _PASS_NAME_NAME
0135 #undef _PASS_NAME_PASS
0136 #undef __PASS_NAME_PASS
0137 #undef _PASS_NAME_PASS_DATA
0138 #undef __PASS_NAME_PASS_DATA
0139
0140 #endif