Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
0002 /*
0003  * Generator for GIMPLE 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           = GIMPLE_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 gimple_opt_pass {
0090 public:
0091     _PASS_NAME_PASS() : gimple_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 };
0102 }
0103 
0104 opt_pass *_MAKE_PASS_NAME_PASS(void)
0105 {
0106     return new _PASS_NAME_PASS();
0107 }
0108 #else
0109 struct opt_pass *_MAKE_PASS_NAME_PASS(void)
0110 {
0111     return &_PASS_NAME_PASS.pass;
0112 }
0113 #endif
0114 
0115 /* clean up user provided defines */
0116 #undef PASS_NAME
0117 #undef NO_GATE
0118 #undef NO_EXECUTE
0119 
0120 #undef PROPERTIES_DESTROYED
0121 #undef PROPERTIES_PROVIDED
0122 #undef PROPERTIES_REQUIRED
0123 #undef TODO_FLAGS_FINISH
0124 #undef TODO_FLAGS_START
0125 
0126 /* clean up generated defines */
0127 #undef _EXECUTE
0128 #undef __EXECUTE
0129 #undef _GATE
0130 #undef __GATE
0131 #undef _GCC_PLUGIN_CONCAT2
0132 #undef _GCC_PLUGIN_CONCAT3
0133 #undef _GCC_PLUGIN_STRINGIFY
0134 #undef __GCC_PLUGIN_STRINGIFY
0135 #undef _HAS_EXECUTE
0136 #undef _HAS_GATE
0137 #undef _MAKE_PASS_NAME_PASS
0138 #undef __MAKE_PASS_NAME_PASS
0139 #undef _PASS_NAME_NAME
0140 #undef _PASS_NAME_PASS
0141 #undef __PASS_NAME_PASS
0142 #undef _PASS_NAME_PASS_DATA
0143 #undef __PASS_NAME_PASS_DATA
0144 
0145 #endif /* PASS_NAME */