cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

gcc-generate-gimple-pass.h (3510B)


      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
     76namespace {
     77static const pass_data _PASS_NAME_PASS_DATA = {
     78		.type			= GIMPLE_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 gimple_opt_pass {
     90public:
     91	_PASS_NAME_PASS() : gimple_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};
    102}
    103
    104opt_pass *_MAKE_PASS_NAME_PASS(void)
    105{
    106	return new _PASS_NAME_PASS();
    107}
    108#else
    109struct opt_pass *_MAKE_PASS_NAME_PASS(void)
    110{
    111	return &_PASS_NAME_PASS.pass;
    112}
    113#endif
    114
    115/* clean up user provided defines */
    116#undef PASS_NAME
    117#undef NO_GATE
    118#undef NO_EXECUTE
    119
    120#undef PROPERTIES_DESTROYED
    121#undef PROPERTIES_PROVIDED
    122#undef PROPERTIES_REQUIRED
    123#undef TODO_FLAGS_FINISH
    124#undef TODO_FLAGS_START
    125
    126/* clean up generated defines */
    127#undef _EXECUTE
    128#undef __EXECUTE
    129#undef _GATE
    130#undef __GATE
    131#undef _GCC_PLUGIN_CONCAT2
    132#undef _GCC_PLUGIN_CONCAT3
    133#undef _GCC_PLUGIN_STRINGIFY
    134#undef __GCC_PLUGIN_STRINGIFY
    135#undef _HAS_EXECUTE
    136#undef _HAS_GATE
    137#undef _MAKE_PASS_NAME_PASS
    138#undef __MAKE_PASS_NAME_PASS
    139#undef _PASS_NAME_NAME
    140#undef _PASS_NAME_PASS
    141#undef __PASS_NAME_PASS
    142#undef _PASS_NAME_PASS_DATA
    143#undef __PASS_NAME_PASS_DATA
    144
    145#endif /* PASS_NAME */