1*38fd1498Szrj /* Control flow graph manipulation code header file. 2*38fd1498Szrj Copyright (C) 2014-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrj the terms of the GNU General Public License as published by the Free 8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrj for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #ifndef GCC_CFG_H 21*38fd1498Szrj #define GCC_CFG_H 22*38fd1498Szrj 23*38fd1498Szrj #include "dominance.h" 24*38fd1498Szrj 25*38fd1498Szrj /* What sort of profiling information we have. */ 26*38fd1498Szrj enum profile_status_d 27*38fd1498Szrj { 28*38fd1498Szrj PROFILE_ABSENT, 29*38fd1498Szrj PROFILE_GUESSED, 30*38fd1498Szrj PROFILE_READ, 31*38fd1498Szrj PROFILE_LAST /* Last value, used by profile streaming. */ 32*38fd1498Szrj }; 33*38fd1498Szrj 34*38fd1498Szrj /* A structure to group all the per-function control flow graph data. 35*38fd1498Szrj The x_* prefixing is necessary because otherwise references to the 36*38fd1498Szrj fields of this struct are interpreted as the defines for backward 37*38fd1498Szrj source compatibility following the definition of this struct. */ 38*38fd1498Szrj struct GTY(()) control_flow_graph { 39*38fd1498Szrj /* Block pointers for the exit and entry of a function. 40*38fd1498Szrj These are always the head and tail of the basic block list. */ 41*38fd1498Szrj basic_block x_entry_block_ptr; 42*38fd1498Szrj basic_block x_exit_block_ptr; 43*38fd1498Szrj 44*38fd1498Szrj /* Index by basic block number, get basic block struct info. */ 45*38fd1498Szrj vec<basic_block, va_gc> *x_basic_block_info; 46*38fd1498Szrj 47*38fd1498Szrj /* Number of basic blocks in this flow graph. */ 48*38fd1498Szrj int x_n_basic_blocks; 49*38fd1498Szrj 50*38fd1498Szrj /* Number of edges in this flow graph. */ 51*38fd1498Szrj int x_n_edges; 52*38fd1498Szrj 53*38fd1498Szrj /* The first free basic block number. */ 54*38fd1498Szrj int x_last_basic_block; 55*38fd1498Szrj 56*38fd1498Szrj /* UIDs for LABEL_DECLs. */ 57*38fd1498Szrj int last_label_uid; 58*38fd1498Szrj 59*38fd1498Szrj /* Mapping of labels to their associated blocks. At present 60*38fd1498Szrj only used for the gimple CFG. */ 61*38fd1498Szrj vec<basic_block, va_gc> *x_label_to_block_map; 62*38fd1498Szrj 63*38fd1498Szrj enum profile_status_d x_profile_status; 64*38fd1498Szrj 65*38fd1498Szrj /* Whether the dominators and the postdominators are available. */ 66*38fd1498Szrj enum dom_state x_dom_computed[2]; 67*38fd1498Szrj 68*38fd1498Szrj /* Number of basic blocks in the dominance tree. */ 69*38fd1498Szrj unsigned x_n_bbs_in_dom_tree[2]; 70*38fd1498Szrj 71*38fd1498Szrj /* Maximal number of entities in the single jumptable. Used to estimate 72*38fd1498Szrj final flowgraph size. */ 73*38fd1498Szrj int max_jumptable_ents; 74*38fd1498Szrj 75*38fd1498Szrj /* Maximal count of BB in function. */ 76*38fd1498Szrj profile_count count_max; 77*38fd1498Szrj }; 78*38fd1498Szrj 79*38fd1498Szrj 80*38fd1498Szrj extern void init_flow (function *); 81*38fd1498Szrj extern void clear_edges (function *); 82*38fd1498Szrj extern basic_block alloc_block (void); 83*38fd1498Szrj extern void link_block (basic_block, basic_block); 84*38fd1498Szrj extern void unlink_block (basic_block); 85*38fd1498Szrj extern void compact_blocks (void); 86*38fd1498Szrj extern void expunge_block (basic_block); 87*38fd1498Szrj extern edge unchecked_make_edge (basic_block, basic_block, int); 88*38fd1498Szrj extern edge cached_make_edge (sbitmap, basic_block, basic_block, int); 89*38fd1498Szrj extern edge make_edge (basic_block, basic_block, int); 90*38fd1498Szrj extern edge make_single_succ_edge (basic_block, basic_block, int); 91*38fd1498Szrj extern void remove_edge_raw (edge); 92*38fd1498Szrj extern void redirect_edge_succ (edge, basic_block); 93*38fd1498Szrj extern void redirect_edge_pred (edge, basic_block); 94*38fd1498Szrj extern void clear_bb_flags (void); 95*38fd1498Szrj extern void dump_edge_info (FILE *, edge, dump_flags_t, int); 96*38fd1498Szrj extern void debug (edge_def &ref); 97*38fd1498Szrj extern void debug (edge_def *ptr); 98*38fd1498Szrj extern void alloc_aux_for_blocks (int); 99*38fd1498Szrj extern void clear_aux_for_blocks (void); 100*38fd1498Szrj extern void free_aux_for_blocks (void); 101*38fd1498Szrj extern void alloc_aux_for_edge (edge, int); 102*38fd1498Szrj extern void alloc_aux_for_edges (int); 103*38fd1498Szrj extern void clear_aux_for_edges (void); 104*38fd1498Szrj extern void free_aux_for_edges (void); 105*38fd1498Szrj extern void debug_bb (basic_block); 106*38fd1498Szrj extern basic_block debug_bb_n (int); 107*38fd1498Szrj extern void dump_bb_info (FILE *, basic_block, int, dump_flags_t, bool, bool); 108*38fd1498Szrj extern void brief_dump_cfg (FILE *, dump_flags_t); 109*38fd1498Szrj extern void update_bb_profile_for_threading (basic_block, profile_count, edge); 110*38fd1498Szrj extern void scale_bbs_frequencies_profile_count (basic_block *, int, 111*38fd1498Szrj profile_count, profile_count); 112*38fd1498Szrj extern void scale_bbs_frequencies (basic_block *, int, profile_probability); 113*38fd1498Szrj extern void initialize_original_copy_tables (void); 114*38fd1498Szrj extern void reset_original_copy_tables (void); 115*38fd1498Szrj extern void free_original_copy_tables (void); 116*38fd1498Szrj extern bool original_copy_tables_initialized_p (void); 117*38fd1498Szrj extern void set_bb_original (basic_block, basic_block); 118*38fd1498Szrj extern basic_block get_bb_original (basic_block); 119*38fd1498Szrj extern void set_bb_copy (basic_block, basic_block); 120*38fd1498Szrj extern basic_block get_bb_copy (basic_block); 121*38fd1498Szrj void set_loop_copy (struct loop *, struct loop *); 122*38fd1498Szrj struct loop *get_loop_copy (struct loop *); 123*38fd1498Szrj 124*38fd1498Szrj #endif /* GCC_CFG_H */ 125