linux/scripts/gcc-plugins/gcc-generate-simple_ipa-pass.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Generator for SIMPLE_IPA 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
  76namespace {
  77static const pass_data _PASS_NAME_PASS_DATA = {
  78                .type                   = SIMPLE_IPA_PASS,
  79                .name                   = _PASS_NAME_NAME,
  80                .optinfo_flags          = OPTGROUP_NONE,
  81#if BUILDING_GCC_VERSION >= 5000
  82#elif BUILDING_GCC_VERSION == 4009
  83                .has_gate               = _HAS_GATE,
  84                .has_execute            = _HAS_EXECUTE,
  85#else
  86                .gate                   = _GATE,
  87                .execute                = _EXECUTE,
  88                .sub                    = NULL,
  89                .next                   = NULL,
  90                .static_pass_number     = 0,
  91#endif
  92                .tv_id                  = TV_NONE,
  93                .properties_required    = PROPERTIES_REQUIRED,
  94                .properties_provided    = PROPERTIES_PROVIDED,
  95                .properties_destroyed   = PROPERTIES_DESTROYED,
  96                .todo_flags_start       = TODO_FLAGS_START,
  97                .todo_flags_finish      = TODO_FLAGS_FINISH,
  98};
  99
 100class _PASS_NAME_PASS : public simple_ipa_opt_pass {
 101public:
 102        _PASS_NAME_PASS() : simple_ipa_opt_pass(_PASS_NAME_PASS_DATA, g) {}
 103
 104#ifndef NO_GATE
 105#if BUILDING_GCC_VERSION >= 5000
 106        virtual bool gate(function *) { return _GATE(); }
 107#else
 108        virtual bool gate(void) { return _GATE(); }
 109#endif
 110#endif
 111
 112        virtual opt_pass *clone() { return new _PASS_NAME_PASS(); }
 113
 114#ifndef NO_EXECUTE
 115#if BUILDING_GCC_VERSION >= 5000
 116        virtual unsigned int execute(function *) { return _EXECUTE(); }
 117#else
 118        virtual unsigned int execute(void) { return _EXECUTE(); }
 119#endif
 120#endif
 121};
 122}
 123
 124opt_pass *_MAKE_PASS_NAME_PASS(void)
 125{
 126        return new _PASS_NAME_PASS();
 127}
 128
 129/* clean up user provided defines */
 130#undef PASS_NAME
 131#undef NO_GATE
 132#undef NO_EXECUTE
 133
 134#undef PROPERTIES_DESTROYED
 135#undef PROPERTIES_PROVIDED
 136#undef PROPERTIES_REQUIRED
 137#undef TODO_FLAGS_FINISH
 138#undef TODO_FLAGS_START
 139
 140/* clean up generated defines */
 141#undef _EXECUTE
 142#undef __EXECUTE
 143#undef _GATE
 144#undef __GATE
 145#undef _GCC_PLUGIN_CONCAT2
 146#undef _GCC_PLUGIN_CONCAT3
 147#undef _GCC_PLUGIN_STRINGIFY
 148#undef __GCC_PLUGIN_STRINGIFY
 149#undef _HAS_EXECUTE
 150#undef _HAS_GATE
 151#undef _MAKE_PASS_NAME_PASS
 152#undef __MAKE_PASS_NAME_PASS
 153#undef _PASS_NAME_NAME
 154#undef _PASS_NAME_PASS
 155#undef __PASS_NAME_PASS
 156#undef _PASS_NAME_PASS_DATA
 157#undef __PASS_NAME_PASS_DATA
 158
 159#endif /* PASS_NAME */
 160