linux/scripts/gcc-plugins/gcc-generate-rtl-pass.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2/*
   3 * Generator for RTL 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                   = RTL_PASS,
  79                .name                   = _PASS_NAME_NAME,
  80                .optinfo_flags          = OPTGROUP_NONE,
  81                .tv_id                  = TV_NONE,
  82                .properties_required    = PROPERTIES_REQUIRED,
  83                .properties_provided    = PROPERTIES_PROVIDED,
  84                .properties_destroyed   = PROPERTIES_DESTROYED,
  85                .todo_flags_start       = TODO_FLAGS_START,
  86                .todo_flags_finish      = TODO_FLAGS_FINISH,
  87};
  88
  89class _PASS_NAME_PASS : public rtl_opt_pass {
  90public:
  91        _PASS_NAME_PASS() : rtl_opt_pass(_PASS_NAME_PASS_DATA, g) {}
  92
  93#ifndef NO_GATE
  94        virtual bool gate(function *) { return _GATE(); }
  95#endif
  96
  97        virtual opt_pass *clone() { return new _PASS_NAME_PASS(); }
  98
  99#ifndef NO_EXECUTE
 100        virtual unsigned int execute(function *) { return _EXECUTE(); }
 101#endif
 102};
 103}
 104
 105opt_pass *_MAKE_PASS_NAME_PASS(void)
 106{
 107        return new _PASS_NAME_PASS();
 108}
 109
 110/* clean up user provided defines */
 111#undef PASS_NAME
 112#undef NO_GATE
 113#undef NO_EXECUTE
 114
 115#undef PROPERTIES_DESTROYED
 116#undef PROPERTIES_PROVIDED
 117#undef PROPERTIES_REQUIRED
 118#undef TODO_FLAGS_FINISH
 119#undef TODO_FLAGS_START
 120
 121/* clean up generated defines */
 122#undef _EXECUTE
 123#undef __EXECUTE
 124#undef _GATE
 125#undef __GATE
 126#undef _GCC_PLUGIN_CONCAT2
 127#undef _GCC_PLUGIN_CONCAT3
 128#undef _GCC_PLUGIN_STRINGIFY
 129#undef __GCC_PLUGIN_STRINGIFY
 130#undef _HAS_EXECUTE
 131#undef _HAS_GATE
 132#undef _MAKE_PASS_NAME_PASS
 133#undef __MAKE_PASS_NAME_PASS
 134#undef _PASS_NAME_NAME
 135#undef _PASS_NAME_PASS
 136#undef __PASS_NAME_PASS
 137#undef _PASS_NAME_PASS_DATA
 138#undef __PASS_NAME_PASS_DATA
 139
 140#endif /* PASS_NAME */
 141