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