summaryrefslogtreecommitdiffstats
path: root/contrib/gcc/cfghooks.h
diff options
context:
space:
mode:
Diffstat (limited to 'contrib/gcc/cfghooks.h')
-rw-r--r--contrib/gcc/cfghooks.h83
1 files changed, 83 insertions, 0 deletions
diff --git a/contrib/gcc/cfghooks.h b/contrib/gcc/cfghooks.h
new file mode 100644
index 0000000..5ef3b1f
--- /dev/null
+++ b/contrib/gcc/cfghooks.h
@@ -0,0 +1,83 @@
+/* Hooks for cfg representation specific functions.
+ Copyright (C) 2003 Free Software Foundation, Inc.
+ Contributed by Sebastian Pop <s.pop@laposte.net>
+
+This file is part of GCC.
+
+GCC is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GCC is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GCC; see the file COPYING. If not, write to
+the Free Software Foundation, 59 Temple Place - Suite 330,
+Boston, MA 02111-1307, USA. */
+
+#ifndef GCC_CFGHOOKS_H
+#define GCC_CFGHOOKS_H
+
+struct cfg_hooks
+{
+ /* Debugging. Do not use macros to hook these so they can be called from
+ debugger! */
+ int (*cfgh_verify_flow_info) (void);
+ void (*dump_bb) (basic_block, FILE *);
+
+ /* Basic CFG manipulation. */
+
+ /* Return new basic block. */
+ basic_block (*create_basic_block) (void *head, void *end, basic_block after);
+
+ /* Redirect edge E to the given basic block B and update underlying program
+ representation. Returns false when edge is not easily redirectable for
+ whatever reason. */
+ bool (*redirect_edge_and_branch) (edge e, basic_block b);
+
+ /* Same as the above but allows redirecting of fallthru edges. In that case
+ newly created forwarder basic block is returned. It aborts when called
+ on abnormal edge. */
+ basic_block (*redirect_edge_and_branch_force) (edge, basic_block);
+
+ /* Remove given basic block and all edges possibly pointing into it. */
+ void (*delete_block) (basic_block);
+
+ /* Split basic block B after specified instruction I. */
+ edge (*split_block) (basic_block b, void * i);
+
+ /* Return true when blocks A and B can be merged into single basic block. */
+ bool (*can_merge_blocks_p) (basic_block a, basic_block b);
+
+ /* Merge blocks A and B. */
+ void (*merge_blocks) (basic_block a, basic_block b);
+
+ /* Higher level functions representable by primitive operations above if
+ we didn't have some oddities in RTL and Tree representations. */
+ basic_block (*cfgh_split_edge) (edge);
+};
+
+#define redirect_edge_and_branch(e,b) cfg_hooks->redirect_edge_and_branch (e,b)
+#define redirect_edge_and_branch_force(e,b) cfg_hooks->redirect_edge_and_branch_force (e,b)
+#define split_block(e,i) cfg_hooks->split_block (e,i)
+#define delete_block(b) cfg_hooks->delete_block (b)
+#define split_edge(e) cfg_hooks->cfgh_split_edge (e)
+#define create_basic_block(h,e,a) cfg_hooks->create_basic_block (h,e,a)
+#define can_merge_blocks_p(a,b) cfg_hooks->can_merge_blocks_p (a,b)
+#define merge_blocks(a,b) cfg_hooks->merge_blocks (a,b)
+
+/* Hooks containers. */
+extern struct cfg_hooks rtl_cfg_hooks;
+
+/* A pointer to one of the hooks containers. */
+extern struct cfg_hooks *cfg_hooks;
+
+/* Declarations. */
+extern void rtl_register_cfg_hooks (void);
+extern void cfg_layout_rtl_register_cfg_hooks (void);
+
+#endif /* GCC_CFGHOOKS_H */
OpenPOWER on IntegriCloud