]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/cfghooks.h
Implement late-specified return type using 'auto'.
[thirdparty/gcc.git] / gcc / cfghooks.h
CommitLineData
9ee634e3 1/* Hooks for cfg representation specific functions.
6fb5fa3c 2 Copyright (C) 2003, 2004, 2005, 2006, 2007 Free Software Foundation, Inc.
9ee634e3
JH
3 Contributed by Sebastian Pop <s.pop@laposte.net>
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify
8it under the terms of the GNU General Public License as published by
9dcd6f09 9the Free Software Foundation; either version 3, or (at your option)
9ee634e3
JH
10any later version.
11
12GCC is distributed in the hope that it will be useful,
13but WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15GNU General Public License for more details.
16
17You should have received a copy of the GNU General Public License
9dcd6f09
NC
18along with GCC; see the file COPYING3. If not see
19<http://www.gnu.org/licenses/>. */
9ee634e3
JH
20
21#ifndef GCC_CFGHOOKS_H
22#define GCC_CFGHOOKS_H
23
24struct cfg_hooks
25{
f470c378
ZD
26 /* Name of the corresponding ir. */
27 const char *name;
28
29 /* Debugging. */
30 int (*verify_flow_info) (void);
726a989a 31 void (*dump_bb) (basic_block, FILE *, int, int);
9ee634e3
JH
32
33 /* Basic CFG manipulation. */
34
6614fd40 35 /* Return new basic block. */
f55ade6e 36 basic_block (*create_basic_block) (void *head, void *end, basic_block after);
bc35512f 37
9ee634e3 38 /* Redirect edge E to the given basic block B and update underlying program
6de9cd9a
DN
39 representation. Returns edge representing redirected branch (that may not
40 be equivalent to E in the case of duplicate edges being removed) or NULL
41 if edge is not easily redirectable for whatever reason. */
42 edge (*redirect_edge_and_branch) (edge e, basic_block b);
9ee634e3
JH
43
44 /* Same as the above but allows redirecting of fallthru edges. In that case
0e61db61
NS
45 newly created forwarder basic block is returned. The edge must
46 not be abnormal. */
d329e058 47 basic_block (*redirect_edge_and_branch_force) (edge, basic_block);
9ee634e3 48
14fa2cc0
ZD
49 /* Returns true if it is possible to remove the edge by redirecting it
50 to the destination of the other edge going from its source. */
9678086d 51 bool (*can_remove_branch_p) (const_edge);
14fa2cc0 52
f470c378
ZD
53 /* Remove statements corresponding to a given basic block. */
54 void (*delete_basic_block) (basic_block);
55
56 /* Creates a new basic block just after basic block B by splitting
57 everything after specified instruction I. */
58 basic_block (*split_block) (basic_block b, void * i);
6fb5fa3c 59
f470c378
ZD
60 /* Move block B immediately after block A. */
61 bool (*move_block_after) (basic_block b, basic_block a);
9ee634e3 62
bc35512f 63 /* Return true when blocks A and B can be merged into single basic block. */
b48d0358 64 bool (*can_merge_blocks_p) (basic_block a, basic_block b);
bc35512f
JH
65
66 /* Merge blocks A and B. */
f55ade6e 67 void (*merge_blocks) (basic_block a, basic_block b);
bc35512f 68
6de9cd9a
DN
69 /* Predict edge E using PREDICTOR to given PROBABILITY. */
70 void (*predict_edge) (edge e, enum br_predictor predictor, int probability);
71
72 /* Return true if the one of outgoing edges is already predicted by
73 PREDICTOR. */
9678086d 74 bool (*predicted_by_p) (const_basic_block bb, enum br_predictor predictor);
6de9cd9a
DN
75
76 /* Return true when block A can be duplicated. */
9678086d 77 bool (*can_duplicate_block_p) (const_basic_block a);
6de9cd9a
DN
78
79 /* Duplicate block A. */
80 basic_block (*duplicate_block) (basic_block a);
81
9ee634e3
JH
82 /* Higher level functions representable by primitive operations above if
83 we didn't have some oddities in RTL and Tree representations. */
f470c378
ZD
84 basic_block (*split_edge) (edge);
85 void (*make_forwarder_block) (edge);
86
87 /* Tries to make the edge fallthru. */
88 void (*tidy_fallthru_edge) (edge);
6de9cd9a
DN
89
90 /* Say whether a block ends with a call, possibly followed by some
91 other code that must stay with the call. */
b48d0358 92 bool (*block_ends_with_call_p) (basic_block);
6de9cd9a
DN
93
94 /* Say whether a block ends with a conditional branch. Switches
95 and unconditional branches do not qualify. */
9678086d 96 bool (*block_ends_with_condjump_p) (const_basic_block);
6de9cd9a
DN
97
98 /* Add fake edges to the function exit for any non constant and non noreturn
99 calls, volatile inline assembly in the bitmap of blocks specified by
100 BLOCKS or to the whole CFG if BLOCKS is zero. Return the number of blocks
101 that were split.
102
103 The goal is to expose cases in which entering a basic block does not imply
104 that all subsequent instructions must be executed. */
105 int (*flow_call_edges_add) (sbitmap);
d9d4706f
KH
106
107 /* This function is called immediately after edge E is added to the
108 edge vector E->dest->preds. */
109 void (*execute_on_growing_pred) (edge);
110
111 /* This function is called immediately before edge E is removed from
112 the edge vector E->dest->preds. */
113 void (*execute_on_shrinking_pred) (edge);
1cb7dfc3
MH
114
115 /* A hook for duplicating loop in CFG, currently this is used
116 in loop versioning. */
ee8c1b05
ZD
117 bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *, edge,
118 unsigned, sbitmap,
119 edge, VEC (edge, heap) **,
120 int);
1cb7dfc3 121
0fa2e4df 122 /* Add condition to new basic block and update CFG used in loop
1cb7dfc3
MH
123 versioning. */
124 void (*lv_add_condition_to_bb) (basic_block, basic_block, basic_block,
c22cacf3 125 void *);
1cb7dfc3
MH
126 /* Update the PHI nodes in case of loop versioning. */
127 void (*lv_adjust_loop_header_phi) (basic_block, basic_block,
128 basic_block, edge);
c22cacf3 129
1cb7dfc3
MH
130 /* Given a condition BB extract the true/false taken/not taken edges
131 (depending if we are on tree's or RTL). */
132 void (*extract_cond_bb_edges) (basic_block, edge *, edge *);
133
c22cacf3 134
1cb7dfc3
MH
135 /* Add PHI arguments queued in PENDINT_STMT list on edge E to edge
136 E->dest (only in tree-ssa loop versioning. */
137 void (*flush_pending_stmts) (edge);
9ee634e3
JH
138};
139
f470c378
ZD
140extern void verify_flow_info (void);
141extern void dump_bb (basic_block, FILE *, int);
6de9cd9a 142extern edge redirect_edge_and_branch (edge, basic_block);
f470c378 143extern basic_block redirect_edge_and_branch_force (edge, basic_block);
9678086d 144extern bool can_remove_branch_p (const_edge);
14fa2cc0 145extern void remove_branch (edge);
452ba14d 146extern void remove_edge (edge);
f470c378
ZD
147extern edge split_block (basic_block, void *);
148extern edge split_block_after_labels (basic_block);
149extern bool move_block_after (basic_block, basic_block);
150extern void delete_basic_block (basic_block);
151extern basic_block split_edge (edge);
152extern basic_block create_basic_block (void *, void *, basic_block);
153extern basic_block create_empty_bb (basic_block);
b48d0358 154extern bool can_merge_blocks_p (basic_block, basic_block);
f470c378
ZD
155extern void merge_blocks (basic_block, basic_block);
156extern edge make_forwarder_block (basic_block, bool (*)(edge),
157 void (*) (basic_block));
158extern void tidy_fallthru_edge (edge);
159extern void tidy_fallthru_edges (void);
6de9cd9a 160extern void predict_edge (edge e, enum br_predictor predictor, int probability);
9678086d
KG
161extern bool predicted_by_p (const_basic_block bb, enum br_predictor predictor);
162extern bool can_duplicate_block_p (const_basic_block);
b9a66240 163extern basic_block duplicate_block (basic_block, edge, basic_block);
b48d0358 164extern bool block_ends_with_call_p (basic_block bb);
9678086d 165extern bool block_ends_with_condjump_p (const_basic_block bb);
6de9cd9a 166extern int flow_call_edges_add (sbitmap);
d9d4706f
KH
167extern void execute_on_growing_pred (edge);
168extern void execute_on_shrinking_pred (edge);
1cb7dfc3 169extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge,
1cb7dfc3
MH
170 unsigned int ndupl,
171 sbitmap wont_exit,
ee8c1b05
ZD
172 edge orig,
173 VEC (edge, heap) **to_remove,
1cb7dfc3
MH
174 int flags);
175
176extern void lv_flush_pending_stmts (edge);
177extern void extract_cond_bb_edges (basic_block, edge *, edge*);
178extern void lv_adjust_loop_header_phi (basic_block, basic_block, basic_block,
179 edge);
180extern void lv_add_condition_to_bb (basic_block, basic_block, basic_block,
181 void *);
9ee634e3
JH
182
183/* Hooks containers. */
726a989a 184extern struct cfg_hooks gimple_cfg_hooks;
9ee634e3 185extern struct cfg_hooks rtl_cfg_hooks;
f470c378 186extern struct cfg_hooks cfg_layout_rtl_cfg_hooks;
9ee634e3
JH
187
188/* Declarations. */
52bca999 189extern enum ir_type current_ir_type (void);
d329e058
AJ
190extern void rtl_register_cfg_hooks (void);
191extern void cfg_layout_rtl_register_cfg_hooks (void);
726a989a 192extern void gimple_register_cfg_hooks (void);
9ee634e3
JH
193
194#endif /* GCC_CFGHOOKS_H */