00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #ifndef GCC_CFGHOOKS_H
00023 #define GCC_CFGHOOKS_H
00024
00025 struct cfg_hooks
00026 {
00027
00028 const char *name;
00029
00030
00031 int (*verify_flow_info) (void);
00032 void (*dump_bb) (basic_block, FILE *, int);
00033
00034
00035
00036
00037 basic_block (*create_basic_block) (void *head, void *end, basic_block after);
00038
00039
00040
00041
00042
00043 edge (*redirect_edge_and_branch) (edge e, basic_block b);
00044
00045
00046
00047
00048 basic_block (*redirect_edge_and_branch_force) (edge, basic_block);
00049
00050
00051 void (*delete_basic_block) (basic_block);
00052
00053
00054
00055 basic_block (*split_block) (basic_block b, void * i);
00056
00057
00058 bool (*move_block_after) (basic_block b, basic_block a);
00059
00060
00061 bool (*can_merge_blocks_p) (basic_block a, basic_block b);
00062
00063
00064 void (*merge_blocks) (basic_block a, basic_block b);
00065
00066
00067 void (*predict_edge) (edge e, enum br_predictor predictor, int probability);
00068
00069
00070
00071 bool (*predicted_by_p) (basic_block bb, enum br_predictor predictor);
00072
00073
00074 bool (*can_duplicate_block_p) (basic_block a);
00075
00076
00077 basic_block (*duplicate_block) (basic_block a);
00078
00079
00080
00081 basic_block (*split_edge) (edge);
00082 void (*make_forwarder_block) (edge);
00083
00084
00085 void (*tidy_fallthru_edge) (edge);
00086
00087
00088
00089 bool (*block_ends_with_call_p) (basic_block);
00090
00091
00092
00093 bool (*block_ends_with_condjump_p) (basic_block);
00094
00095
00096
00097
00098
00099
00100
00101
00102 int (*flow_call_edges_add) (sbitmap);
00103
00104
00105
00106 void (*execute_on_growing_pred) (edge);
00107
00108
00109
00110 void (*execute_on_shrinking_pred) (edge);
00111
00112
00113
00114 bool (*cfg_hook_duplicate_loop_to_header_edge) (struct loop *loop, edge e,
00115 struct loops *loops,
00116 unsigned int ndupl,
00117 sbitmap wont_exit,
00118 edge orig, edge *to_remove,
00119 unsigned int *n_to_remove,
00120 int flags);
00121
00122
00123
00124 void (*lv_add_condition_to_bb) (basic_block, basic_block, basic_block,
00125 void *);
00126
00127 void (*lv_adjust_loop_header_phi) (basic_block, basic_block,
00128 basic_block, edge);
00129
00130
00131
00132 void (*extract_cond_bb_edges) (basic_block, edge *, edge *);
00133
00134
00135
00136
00137 void (*flush_pending_stmts) (edge);
00138 };
00139
00140 extern void verify_flow_info (void);
00141 extern void dump_bb (basic_block, FILE *, int);
00142 extern edge redirect_edge_and_branch (edge, basic_block);
00143 extern basic_block redirect_edge_and_branch_force (edge, basic_block);
00144 extern edge split_block (basic_block, void *);
00145 extern edge split_block_after_labels (basic_block);
00146 extern bool move_block_after (basic_block, basic_block);
00147 extern void delete_basic_block (basic_block);
00148 extern basic_block split_edge (edge);
00149 extern basic_block create_basic_block (void *, void *, basic_block);
00150 extern basic_block create_empty_bb (basic_block);
00151 extern bool can_merge_blocks_p (basic_block, basic_block);
00152 extern void merge_blocks (basic_block, basic_block);
00153 extern edge make_forwarder_block (basic_block, bool (*)(edge),
00154 void (*) (basic_block));
00155 extern void tidy_fallthru_edge (edge);
00156 extern void tidy_fallthru_edges (void);
00157 extern void predict_edge (edge e, enum br_predictor predictor, int probability);
00158 extern bool predicted_by_p (basic_block bb, enum br_predictor predictor);
00159 extern bool can_duplicate_block_p (basic_block);
00160 extern basic_block duplicate_block (basic_block, edge, basic_block);
00161 extern bool block_ends_with_call_p (basic_block bb);
00162 extern bool block_ends_with_condjump_p (basic_block bb);
00163 extern int flow_call_edges_add (sbitmap);
00164 extern void execute_on_growing_pred (edge);
00165 extern void execute_on_shrinking_pred (edge);
00166 extern bool cfg_hook_duplicate_loop_to_header_edge (struct loop *loop, edge,
00167 struct loops *loops,
00168 unsigned int ndupl,
00169 sbitmap wont_exit,
00170 edge orig, edge *to_remove,
00171 unsigned int *n_to_remove,
00172 int flags);
00173
00174 extern void lv_flush_pending_stmts (edge);
00175 extern void extract_cond_bb_edges (basic_block, edge *, edge*);
00176 extern void lv_adjust_loop_header_phi (basic_block, basic_block, basic_block,
00177 edge);
00178 extern void lv_add_condition_to_bb (basic_block, basic_block, basic_block,
00179 void *);
00180
00181
00182 extern struct cfg_hooks tree_cfg_hooks;
00183 extern struct cfg_hooks rtl_cfg_hooks;
00184 extern struct cfg_hooks cfg_layout_rtl_cfg_hooks;
00185
00186
00187 extern int ir_type (void);
00188 extern void rtl_register_cfg_hooks (void);
00189 extern void cfg_layout_rtl_register_cfg_hooks (void);
00190 extern void tree_register_cfg_hooks (void);
00191
00192 #endif