linux/scripts/gcc-plugins/gcc-generate-ipa-pass.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Generator for 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_GENERATE_SUMMARY
  12 *    NO_READ_SUMMARY
  13 *    NO_WRITE_SUMMARY
  14 *    NO_READ_OPTIMIZATION_SUMMARY
  15 *    NO_WRITE_OPTIMIZATION_SUMMARY
  16 *    NO_STMT_FIXUP
  17 *    NO_FUNCTION_TRANSFORM
  18 *    NO_VARIABLE_TRANSFORM
  19 *    NO_GATE
  20 *    NO_EXECUTE
  21 * 3. before inclusion define PROPERTIES_* and *TODO_FLAGS_* to override
  22 *    the default 0 values
  23 * 4. for convenience, all the above will be undefined after inclusion!
  24 * 5. the only exported name is make_PASS_NAME_pass() to register with gcc
  25 */
  26
  27#ifndef PASS_NAME
  28#error at least PASS_NAME must be defined
  29#else
  30#define __GCC_PLUGIN_STRINGIFY(n)       #n
  31#define _GCC_PLUGIN_STRINGIFY(n)        __GCC_PLUGIN_STRINGIFY(n)
  32#define _GCC_PLUGIN_CONCAT2(x, y)       x ## y
  33#define _GCC_PLUGIN_CONCAT3(x, y, z)    x ## y ## z
  34
  35#define __PASS_NAME_PASS_DATA(n)        _GCC_PLUGIN_CONCAT2(n, _pass_data)
  36#define _PASS_NAME_PASS_DATA            __PASS_NAME_PASS_DATA(PASS_NAME)
  37
  38#define __PASS_NAME_PASS(n)             _GCC_PLUGIN_CONCAT2(n, _pass)
  39#define _PASS_NAME_PASS                 __PASS_NAME_PASS(PASS_NAME)
  40
  41#define _PASS_NAME_NAME                 _GCC_PLUGIN_STRINGIFY(PASS_NAME)
  42
  43#define __MAKE_PASS_NAME_PASS(n)        _GCC_PLUGIN_CONCAT3(make_, n, _pass)
  44#define _MAKE_PASS_NAME_PASS            __MAKE_PASS_NAME_PASS(PASS_NAME)
  45
  46#ifdef NO_GENERATE_SUMMARY
  47#define _GENERATE_SUMMARY NULL
  48#else
  49#define __GENERATE_SUMMARY(n)           _GCC_PLUGIN_CONCAT2(n, _generate_summary)
  50#define _GENERATE_SUMMARY               __GENERATE_SUMMARY(PASS_NAME)
  51#endif
  52
  53#ifdef NO_READ_SUMMARY
  54#define _READ_SUMMARY NULL
  55#else
  56#define __READ_SUMMARY(n)               _GCC_PLUGIN_CONCAT2(n, _read_summary)
  57#define _READ_SUMMARY                   __READ_SUMMARY(PASS_NAME)
  58#endif
  59
  60#ifdef NO_WRITE_SUMMARY
  61#define _WRITE_SUMMARY NULL
  62#else
  63#define __WRITE_SUMMARY(n)              _GCC_PLUGIN_CONCAT2(n, _write_summary)
  64#define _WRITE_SUMMARY                  __WRITE_SUMMARY(PASS_NAME)
  65#endif
  66
  67#ifdef NO_READ_OPTIMIZATION_SUMMARY
  68#define _READ_OPTIMIZATION_SUMMARY NULL
  69#else
  70#define __READ_OPTIMIZATION_SUMMARY(n)  _GCC_PLUGIN_CONCAT2(n, _read_optimization_summary)
  71#define _READ_OPTIMIZATION_SUMMARY      __READ_OPTIMIZATION_SUMMARY(PASS_NAME)
  72#endif
  73
  74#ifdef NO_WRITE_OPTIMIZATION_SUMMARY
  75#define _WRITE_OPTIMIZATION_SUMMARY NULL
  76#else
  77#define __WRITE_OPTIMIZATION_SUMMARY(n) _GCC_PLUGIN_CONCAT2(n, _write_optimization_summary)
  78#define _WRITE_OPTIMIZATION_SUMMARY     __WRITE_OPTIMIZATION_SUMMARY(PASS_NAME)
  79#endif
  80
  81#ifdef NO_STMT_FIXUP
  82#define _STMT_FIXUP NULL
  83#else
  84#define __STMT_FIXUP(n)                 _GCC_PLUGIN_CONCAT2(n, _stmt_fixup)
  85#define _STMT_FIXUP                     __STMT_FIXUP(PASS_NAME)
  86#endif
  87
  88#ifdef NO_FUNCTION_TRANSFORM
  89#define _FUNCTION_TRANSFORM NULL
  90#else
  91#define __FUNCTION_TRANSFORM(n)         _GCC_PLUGIN_CONCAT2(n, _function_transform)
  92#define _FUNCTION_TRANSFORM             __FUNCTION_TRANSFORM(PASS_NAME)
  93#endif
  94
  95#ifdef NO_VARIABLE_TRANSFORM
  96#define _VARIABLE_TRANSFORM NULL
  97#else
  98#define __VARIABLE_TRANSFORM(n)         _GCC_PLUGIN_CONCAT2(n, _variable_transform)
  99#define _VARIABLE_TRANSFORM             __VARIABLE_TRANSFORM(PASS_NAME)
 100#endif
 101
 102#ifdef NO_GATE
 103#define _GATE NULL
 104#define _HAS_GATE false
 105#else
 106#define __GATE(n)                       _GCC_PLUGIN_CONCAT2(n, _gate)
 107#define _GATE                           __GATE(PASS_NAME)
 108#define _HAS_GATE true
 109#endif
 110
 111#ifdef NO_EXECUTE
 112#define _EXECUTE NULL
 113#define _HAS_EXECUTE false
 114#else
 115#define __EXECUTE(n)                    _GCC_PLUGIN_CONCAT2(n, _execute)
 116#define _EXECUTE                        __EXECUTE(PASS_NAME)
 117#define _HAS_EXECUTE true
 118#endif
 119
 120#ifndef PROPERTIES_REQUIRED
 121#define PROPERTIES_REQUIRED 0
 122#endif
 123
 124#ifndef PROPERTIES_PROVIDED
 125#define PROPERTIES_PROVIDED 0
 126#endif
 127
 128#ifndef PROPERTIES_DESTROYED
 129#define PROPERTIES_DESTROYED 0
 130#endif
 131
 132#ifndef TODO_FLAGS_START
 133#define TODO_FLAGS_START 0
 134#endif
 135
 136#ifndef TODO_FLAGS_FINISH
 137#define TODO_FLAGS_FINISH 0
 138#endif
 139
 140#ifndef FUNCTION_TRANSFORM_TODO_FLAGS_START
 141#define FUNCTION_TRANSFORM_TODO_FLAGS_START 0
 142#endif
 143
 144namespace {
 145static const pass_data _PASS_NAME_PASS_DATA = {
 146                .type                   = IPA_PASS,
 147                .name                   = _PASS_NAME_NAME,
 148                .optinfo_flags          = OPTGROUP_NONE,
 149#if BUILDING_GCC_VERSION >= 5000
 150#elif BUILDING_GCC_VERSION == 4009
 151                .has_gate               = _HAS_GATE,
 152                .has_execute            = _HAS_EXECUTE,
 153#else
 154                .gate                   = _GATE,
 155                .execute                = _EXECUTE,
 156                .sub                    = NULL,
 157                .next                   = NULL,
 158                .static_pass_number     = 0,
 159#endif
 160                .tv_id                  = TV_NONE,
 161                .properties_required    = PROPERTIES_REQUIRED,
 162                .properties_provided    = PROPERTIES_PROVIDED,
 163                .properties_destroyed   = PROPERTIES_DESTROYED,
 164                .todo_flags_start       = TODO_FLAGS_START,
 165                .todo_flags_finish      = TODO_FLAGS_FINISH,
 166};
 167
 168class _PASS_NAME_PASS : public ipa_opt_pass_d {
 169public:
 170        _PASS_NAME_PASS() : ipa_opt_pass_d(_PASS_NAME_PASS_DATA,
 171                         g,
 172                         _GENERATE_SUMMARY,
 173                         _WRITE_SUMMARY,
 174                         _READ_SUMMARY,
 175                         _WRITE_OPTIMIZATION_SUMMARY,
 176                         _READ_OPTIMIZATION_SUMMARY,
 177                         _STMT_FIXUP,
 178                         FUNCTION_TRANSFORM_TODO_FLAGS_START,
 179                         _FUNCTION_TRANSFORM,
 180                         _VARIABLE_TRANSFORM) {}
 181
 182#ifndef NO_GATE
 183#if BUILDING_GCC_VERSION >= 5000
 184        virtual bool gate(function *) { return _GATE(); }
 185#else
 186        virtual bool gate(void) { return _GATE(); }
 187#endif
 188
 189        virtual opt_pass *clone() { return new _PASS_NAME_PASS(); }
 190
 191#ifndef NO_EXECUTE
 192#if BUILDING_GCC_VERSION >= 5000
 193        virtual unsigned int execute(function *) { return _EXECUTE(); }
 194#else
 195        virtual unsigned int execute(void) { return _EXECUTE(); }
 196#endif
 197#endif
 198};
 199}
 200
 201opt_pass *_MAKE_PASS_NAME_PASS(void)
 202{
 203        return new _PASS_NAME_PASS();
 204}
 205#else
 206struct opt_pass *_MAKE_PASS_NAME_PASS(void)
 207{
 208        return &_PASS_NAME_PASS.pass;
 209}
 210#endif
 211
 212/* clean up user provided defines */
 213#undef PASS_NAME
 214#undef NO_GENERATE_SUMMARY
 215#undef NO_WRITE_SUMMARY
 216#undef NO_READ_SUMMARY
 217#undef NO_WRITE_OPTIMIZATION_SUMMARY
 218#undef NO_READ_OPTIMIZATION_SUMMARY
 219#undef NO_STMT_FIXUP
 220#undef NO_FUNCTION_TRANSFORM
 221#undef NO_VARIABLE_TRANSFORM
 222#undef NO_GATE
 223#undef NO_EXECUTE
 224
 225#undef FUNCTION_TRANSFORM_TODO_FLAGS_START
 226#undef PROPERTIES_DESTROYED
 227#undef PROPERTIES_PROVIDED
 228#undef PROPERTIES_REQUIRED
 229#undef TODO_FLAGS_FINISH
 230#undef TODO_FLAGS_START
 231
 232/* clean up generated defines */
 233#undef _EXECUTE
 234#undef __EXECUTE
 235#undef _FUNCTION_TRANSFORM
 236#undef __FUNCTION_TRANSFORM
 237#undef _GATE
 238#undef __GATE
 239#undef _GCC_PLUGIN_CONCAT2
 240#undef _GCC_PLUGIN_CONCAT3
 241#undef _GCC_PLUGIN_STRINGIFY
 242#undef __GCC_PLUGIN_STRINGIFY
 243#undef _GENERATE_SUMMARY
 244#undef __GENERATE_SUMMARY
 245#undef _HAS_EXECUTE
 246#undef _HAS_GATE
 247#undef _MAKE_PASS_NAME_PASS
 248#undef __MAKE_PASS_NAME_PASS
 249#undef _PASS_NAME_NAME
 250#undef _PASS_NAME_PASS
 251#undef __PASS_NAME_PASS
 252#undef _PASS_NAME_PASS_DATA
 253#undef __PASS_NAME_PASS_DATA
 254#undef _READ_OPTIMIZATION_SUMMARY
 255#undef __READ_OPTIMIZATION_SUMMARY
 256#undef _READ_SUMMARY
 257#undef __READ_SUMMARY
 258#undef _STMT_FIXUP
 259#undef __STMT_FIXUP
 260#undef _VARIABLE_TRANSFORM
 261#undef __VARIABLE_TRANSFORM
 262#undef _WRITE_OPTIMIZATION_SUMMARY
 263#undef __WRITE_OPTIMIZATION_SUMMARY
 264#undef _WRITE_SUMMARY
 265#undef __WRITE_SUMMARY
 266
 267#endif /* PASS_NAME */
 268