16b90bd4bSEmese Revfy /*
26b90bd4bSEmese Revfy  * Generator for GIMPLE pass related boilerplate code/data
36b90bd4bSEmese Revfy  *
46b90bd4bSEmese Revfy  * Supports gcc 4.5-6
56b90bd4bSEmese Revfy  *
66b90bd4bSEmese Revfy  * Usage:
76b90bd4bSEmese Revfy  *
86b90bd4bSEmese Revfy  * 1. before inclusion define PASS_NAME
96b90bd4bSEmese Revfy  * 2. before inclusion define NO_* for unimplemented callbacks
106b90bd4bSEmese Revfy  *    NO_GATE
116b90bd4bSEmese Revfy  *    NO_EXECUTE
126b90bd4bSEmese Revfy  * 3. before inclusion define PROPERTIES_* and TODO_FLAGS_* to override
136b90bd4bSEmese Revfy  *    the default 0 values
146b90bd4bSEmese Revfy  * 4. for convenience, all the above will be undefined after inclusion!
156b90bd4bSEmese Revfy  * 5. the only exported name is make_PASS_NAME_pass() to register with gcc
166b90bd4bSEmese Revfy  */
176b90bd4bSEmese Revfy 
186b90bd4bSEmese Revfy #ifndef PASS_NAME
196b90bd4bSEmese Revfy #error at least PASS_NAME must be defined
206b90bd4bSEmese Revfy #else
216b90bd4bSEmese Revfy #define __GCC_PLUGIN_STRINGIFY(n)	#n
226b90bd4bSEmese Revfy #define _GCC_PLUGIN_STRINGIFY(n)	__GCC_PLUGIN_STRINGIFY(n)
236b90bd4bSEmese Revfy #define _GCC_PLUGIN_CONCAT2(x, y)	x ## y
246b90bd4bSEmese Revfy #define _GCC_PLUGIN_CONCAT3(x, y, z)	x ## y ## z
256b90bd4bSEmese Revfy 
266b90bd4bSEmese Revfy #define __PASS_NAME_PASS_DATA(n)	_GCC_PLUGIN_CONCAT2(n, _pass_data)
276b90bd4bSEmese Revfy #define _PASS_NAME_PASS_DATA		__PASS_NAME_PASS_DATA(PASS_NAME)
286b90bd4bSEmese Revfy 
296b90bd4bSEmese Revfy #define __PASS_NAME_PASS(n)		_GCC_PLUGIN_CONCAT2(n, _pass)
306b90bd4bSEmese Revfy #define _PASS_NAME_PASS			__PASS_NAME_PASS(PASS_NAME)
316b90bd4bSEmese Revfy 
326b90bd4bSEmese Revfy #define _PASS_NAME_NAME			_GCC_PLUGIN_STRINGIFY(PASS_NAME)
336b90bd4bSEmese Revfy 
346b90bd4bSEmese Revfy #define __MAKE_PASS_NAME_PASS(n)	_GCC_PLUGIN_CONCAT3(make_, n, _pass)
356b90bd4bSEmese Revfy #define _MAKE_PASS_NAME_PASS		__MAKE_PASS_NAME_PASS(PASS_NAME)
366b90bd4bSEmese Revfy 
376b90bd4bSEmese Revfy #ifdef NO_GATE
386b90bd4bSEmese Revfy #define _GATE NULL
396b90bd4bSEmese Revfy #define _HAS_GATE false
406b90bd4bSEmese Revfy #else
416b90bd4bSEmese Revfy #define __GATE(n)			_GCC_PLUGIN_CONCAT2(n, _gate)
426b90bd4bSEmese Revfy #define _GATE				__GATE(PASS_NAME)
436b90bd4bSEmese Revfy #define _HAS_GATE true
446b90bd4bSEmese Revfy #endif
456b90bd4bSEmese Revfy 
466b90bd4bSEmese Revfy #ifdef NO_EXECUTE
476b90bd4bSEmese Revfy #define _EXECUTE NULL
486b90bd4bSEmese Revfy #define _HAS_EXECUTE false
496b90bd4bSEmese Revfy #else
506b90bd4bSEmese Revfy #define __EXECUTE(n)			_GCC_PLUGIN_CONCAT2(n, _execute)
516b90bd4bSEmese Revfy #define _EXECUTE			__EXECUTE(PASS_NAME)
526b90bd4bSEmese Revfy #define _HAS_EXECUTE true
536b90bd4bSEmese Revfy #endif
546b90bd4bSEmese Revfy 
556b90bd4bSEmese Revfy #ifndef PROPERTIES_REQUIRED
566b90bd4bSEmese Revfy #define PROPERTIES_REQUIRED 0
576b90bd4bSEmese Revfy #endif
586b90bd4bSEmese Revfy 
596b90bd4bSEmese Revfy #ifndef PROPERTIES_PROVIDED
606b90bd4bSEmese Revfy #define PROPERTIES_PROVIDED 0
616b90bd4bSEmese Revfy #endif
626b90bd4bSEmese Revfy 
636b90bd4bSEmese Revfy #ifndef PROPERTIES_DESTROYED
646b90bd4bSEmese Revfy #define PROPERTIES_DESTROYED 0
656b90bd4bSEmese Revfy #endif
666b90bd4bSEmese Revfy 
676b90bd4bSEmese Revfy #ifndef TODO_FLAGS_START
686b90bd4bSEmese Revfy #define TODO_FLAGS_START 0
696b90bd4bSEmese Revfy #endif
706b90bd4bSEmese Revfy 
716b90bd4bSEmese Revfy #ifndef TODO_FLAGS_FINISH
726b90bd4bSEmese Revfy #define TODO_FLAGS_FINISH 0
736b90bd4bSEmese Revfy #endif
746b90bd4bSEmese Revfy 
756b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4009
766b90bd4bSEmese Revfy namespace {
776b90bd4bSEmese Revfy static const pass_data _PASS_NAME_PASS_DATA = {
786b90bd4bSEmese Revfy #else
796b90bd4bSEmese Revfy static struct gimple_opt_pass _PASS_NAME_PASS = {
806b90bd4bSEmese Revfy 	.pass = {
816b90bd4bSEmese Revfy #endif
826b90bd4bSEmese Revfy 		.type			= GIMPLE_PASS,
836b90bd4bSEmese Revfy 		.name			= _PASS_NAME_NAME,
846b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4008
856b90bd4bSEmese Revfy 		.optinfo_flags		= OPTGROUP_NONE,
866b90bd4bSEmese Revfy #endif
876b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000
886b90bd4bSEmese Revfy #elif BUILDING_GCC_VERSION == 4009
896b90bd4bSEmese Revfy 		.has_gate		= _HAS_GATE,
906b90bd4bSEmese Revfy 		.has_execute		= _HAS_EXECUTE,
916b90bd4bSEmese Revfy #else
926b90bd4bSEmese Revfy 		.gate			= _GATE,
936b90bd4bSEmese Revfy 		.execute		= _EXECUTE,
946b90bd4bSEmese Revfy 		.sub			= NULL,
956b90bd4bSEmese Revfy 		.next			= NULL,
966b90bd4bSEmese Revfy 		.static_pass_number	= 0,
976b90bd4bSEmese Revfy #endif
986b90bd4bSEmese Revfy 		.tv_id			= TV_NONE,
996b90bd4bSEmese Revfy 		.properties_required	= PROPERTIES_REQUIRED,
1006b90bd4bSEmese Revfy 		.properties_provided	= PROPERTIES_PROVIDED,
1016b90bd4bSEmese Revfy 		.properties_destroyed	= PROPERTIES_DESTROYED,
1026b90bd4bSEmese Revfy 		.todo_flags_start	= TODO_FLAGS_START,
1036b90bd4bSEmese Revfy 		.todo_flags_finish	= TODO_FLAGS_FINISH,
1046b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION < 4009
1056b90bd4bSEmese Revfy 	}
1066b90bd4bSEmese Revfy #endif
1076b90bd4bSEmese Revfy };
1086b90bd4bSEmese Revfy 
1096b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 4009
1106b90bd4bSEmese Revfy class _PASS_NAME_PASS : public gimple_opt_pass {
1116b90bd4bSEmese Revfy public:
1126b90bd4bSEmese Revfy 	_PASS_NAME_PASS() : gimple_opt_pass(_PASS_NAME_PASS_DATA, g) {}
1136b90bd4bSEmese Revfy 
1146b90bd4bSEmese Revfy #ifndef NO_GATE
1156b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000
1166b90bd4bSEmese Revfy 	virtual bool gate(function *) { return _GATE(); }
1176b90bd4bSEmese Revfy #else
1186b90bd4bSEmese Revfy 	virtual bool gate(void) { return _GATE(); }
1196b90bd4bSEmese Revfy #endif
1206b90bd4bSEmese Revfy #endif
1216b90bd4bSEmese Revfy 
1226b90bd4bSEmese Revfy 	virtual opt_pass * clone () { return new _PASS_NAME_PASS(); }
1236b90bd4bSEmese Revfy 
1246b90bd4bSEmese Revfy #ifndef NO_EXECUTE
1256b90bd4bSEmese Revfy #if BUILDING_GCC_VERSION >= 5000
1266b90bd4bSEmese Revfy 	virtual unsigned int execute(function *) { return _EXECUTE(); }
1276b90bd4bSEmese Revfy #else
1286b90bd4bSEmese Revfy 	virtual unsigned int execute(void) { return _EXECUTE(); }
1296b90bd4bSEmese Revfy #endif
1306b90bd4bSEmese Revfy #endif
1316b90bd4bSEmese Revfy };
1326b90bd4bSEmese Revfy }
1336b90bd4bSEmese Revfy 
1346b90bd4bSEmese Revfy opt_pass *_MAKE_PASS_NAME_PASS(void)
1356b90bd4bSEmese Revfy {
1366b90bd4bSEmese Revfy 	return new _PASS_NAME_PASS();
1376b90bd4bSEmese Revfy }
1386b90bd4bSEmese Revfy #else
1396b90bd4bSEmese Revfy struct opt_pass *_MAKE_PASS_NAME_PASS(void)
1406b90bd4bSEmese Revfy {
1416b90bd4bSEmese Revfy 	return &_PASS_NAME_PASS.pass;
1426b90bd4bSEmese Revfy }
1436b90bd4bSEmese Revfy #endif
1446b90bd4bSEmese Revfy 
1456b90bd4bSEmese Revfy /* clean up user provided defines */
1466b90bd4bSEmese Revfy #undef PASS_NAME
1476b90bd4bSEmese Revfy #undef NO_GATE
1486b90bd4bSEmese Revfy #undef NO_EXECUTE
1496b90bd4bSEmese Revfy 
1506b90bd4bSEmese Revfy #undef PROPERTIES_DESTROYED
1516b90bd4bSEmese Revfy #undef PROPERTIES_PROVIDED
1526b90bd4bSEmese Revfy #undef PROPERTIES_REQUIRED
1536b90bd4bSEmese Revfy #undef TODO_FLAGS_FINISH
1546b90bd4bSEmese Revfy #undef TODO_FLAGS_START
1556b90bd4bSEmese Revfy 
1566b90bd4bSEmese Revfy /* clean up generated defines */
1576b90bd4bSEmese Revfy #undef _EXECUTE
1586b90bd4bSEmese Revfy #undef __EXECUTE
1596b90bd4bSEmese Revfy #undef _GATE
1606b90bd4bSEmese Revfy #undef __GATE
1616b90bd4bSEmese Revfy #undef _GCC_PLUGIN_CONCAT2
1626b90bd4bSEmese Revfy #undef _GCC_PLUGIN_CONCAT3
1636b90bd4bSEmese Revfy #undef _GCC_PLUGIN_STRINGIFY
1646b90bd4bSEmese Revfy #undef __GCC_PLUGIN_STRINGIFY
1656b90bd4bSEmese Revfy #undef _HAS_EXECUTE
1666b90bd4bSEmese Revfy #undef _HAS_GATE
1676b90bd4bSEmese Revfy #undef _MAKE_PASS_NAME_PASS
1686b90bd4bSEmese Revfy #undef __MAKE_PASS_NAME_PASS
1696b90bd4bSEmese Revfy #undef _PASS_NAME_NAME
1706b90bd4bSEmese Revfy #undef _PASS_NAME_PASS
1716b90bd4bSEmese Revfy #undef __PASS_NAME_PASS
1726b90bd4bSEmese Revfy #undef _PASS_NAME_PASS_DATA
1736b90bd4bSEmese Revfy #undef __PASS_NAME_PASS_DATA
1746b90bd4bSEmese Revfy 
1756b90bd4bSEmese Revfy #endif /* PASS_NAME */
176