This is the mail archive of the gcc@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[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;
{
} 

----


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]