This is the mail archive of the
gcc@gcc.gnu.org
mailing list for the GCC project.
[RFC] CFG hooks for rtl/tree specificities
- From: Pop Sébastian <pop at gauvain dot u-strasbg dot fr>
- To: gcc at gcc dot gnu dot org
- Date: Tue, 1 Apr 2003 16:50:07 +0200
- Subject: [RFC] CFG hooks for rtl/tree specificities
Hi,
I would like to have your opinion on the following reorganization of the CFG functions.
I propose to keep all the functions that deal with IR specificities into a hook structure
a little bit the same way we handle the specificities of a language front-end in langhooks.
These functions are initialized during the CFG construction. This would allow the CFG
analyzers and optimizers to work at both the RTL and the tree levels.
cfghooks.h will contain something like:
----
/* Initializations specific to either the tree or the rtl level. */
extern void tree_register_cfg_hooks PARAMS ((void));
extern void rtl_register_cfg_hooks PARAMS ((void));
struct cfg_hooks
{
basic_block (*cfgh_split_edge) PARAMS ((edge));
void (*cfgh_cfg_layout_initialize) PARAMS ((struct loops *));
void (*cfgh_cfg_layout_finalize) PARAMS ((void));
void (*cfgh_verify_flow_info) PARAMS ((void));
};
/* The following macros act either at the tree level or at the rtl level. */
#define split_edge(e) cfg_hooks.cfgh_split_edge (e)
#define cfg_layout_initialize(l) cfg_hooks.cfgh_cfg_layout_initialize (l)
#define cfg_layout_finalize() cfg_hooks.cfgh_cfg_layout_finalize ()
#define verify_flow_info() cfg_hooks.cfgh_verify_flow_info ()
extern struct cfg_hooks cfg_hooks;
----
cfghooks.c looks like:
----
struct cfg_hooks cfg_hooks;
/* Static declarations. */
static void cfgh_do_nothing PARAMS ((void));
static void cfgh_do_nothing_loops PARAMS ((struct loops *));
/* Initialization of functions specific to the tree IR. */
void
tree_register_cfg_hooks ()
{
cfg_hooks.cfgh_split_edge = &tree_split_edge;
cfg_hooks.cfgh_cfg_layout_initialize = &cfgh_do_nothing_loops;
cfg_hooks.cfgh_cfg_layout_finalize = &cfgh_do_nothing;
cfg_hooks.cfgh_verify_flow_info = &cfgh_do_nothing;
}
/* Initialization of functions specific to the rtl IR. */
void
rtl_register_cfg_hooks ()
{
cfg_hooks.cfgh_split_edge = &rtl_split_edge;
cfg_hooks.cfgh_cfg_layout_initialize = &rtl_cfg_layout_initialize;
cfg_hooks.cfgh_cfg_layout_finalize = &rtl_cfg_layout_finalize;
cfg_hooks.cfgh_verify_flow_info = &rtl_verify_flow_info;
}
/* Do-nothing functions. */
static void
cfgh_do_nothing ()
{
}
static void
cfgh_do_nothing_loops (l)
struct loops *l ATTRIBUTE_UNUSED;
{
}
----