xref: /dragonfly/contrib/gcc-8.0/gcc/cfg.h (revision 38fd1498)
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