Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Generator for SIMPLE_IPA pass related boilerplate code/data
0004  *
0005  * Supports gcc 4.5-6
0006  *
0007  * Usage:
0008  *
0009  * 1. before inclusion define PASS_NAME
0010  * 2. before inclusion define NO_* for unimplemented callbacks
0011  *    NO_GATE
0012  *    NO_EXECUTE
0013  * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override
0014  *    the default 0 values
0015  * 4. for convenience, all the above will be undefined after inclusion!
0016  * 5. the only exported name is make_PASS_NAME_pass() to register with gcc
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 /* clean up user provided defines */
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 /* clean up generated defines */
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 /* PASS_NAME */