(root)/
gcc-13.2.0/
gcc/
cfg.h
       1  /* Control flow graph manipulation code header file.
       2     Copyright (C) 2014-2023 Free Software Foundation, Inc.
       3  
       4  This file is part of GCC.
       5  
       6  GCC is free software; you can redistribute it and/or modify it under
       7  the terms of the GNU General Public License as published by the Free
       8  Software Foundation; either version 3, or (at your option) any later
       9  version.
      10  
      11  GCC is distributed in the hope that it will be useful, but WITHOUT ANY
      12  WARRANTY; without even the implied warranty of MERCHANTABILITY or
      13  FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
      14  for more details.
      15  
      16  You should have received a copy of the GNU General Public License
      17  along with GCC; see the file COPYING3.  If not see
      18  <http://www.gnu.org/licenses/>.  */
      19  
      20  #ifndef GCC_CFG_H
      21  #define GCC_CFG_H
      22  
      23  #include "dominance.h"
      24  
      25  /* What sort of profiling information we have.  */
      26  enum profile_status_d
      27  {
      28    PROFILE_ABSENT,
      29    PROFILE_GUESSED,
      30    PROFILE_READ,
      31    PROFILE_LAST	/* Last value, used by profile streaming.  */
      32  };
      33  
      34  /* A structure to group all the per-function control flow graph data.
      35     The x_* prefixing is necessary because otherwise references to the
      36     fields of this struct are interpreted as the defines for backward
      37     source compatibility following the definition of this struct.  */
      38  struct GTY(()) control_flow_graph {
      39    /* Block pointers for the exit and entry of a function.
      40       These are always the head and tail of the basic block list.  */
      41    basic_block x_entry_block_ptr;
      42    basic_block x_exit_block_ptr;
      43  
      44    /* Index by basic block number, get basic block struct info.  */
      45    vec<basic_block, va_gc> *x_basic_block_info;
      46  
      47    /* Number of basic blocks in this flow graph.  */
      48    int x_n_basic_blocks;
      49  
      50    /* Number of edges in this flow graph.  */
      51    int x_n_edges;
      52  
      53    /* The first free basic block number.  */
      54    int x_last_basic_block;
      55  
      56    /* UIDs for LABEL_DECLs.  */
      57    int last_label_uid;
      58  
      59    /* Mapping of labels to their associated blocks.  At present
      60       only used for the gimple CFG.  */
      61    vec<basic_block, va_gc> *x_label_to_block_map;
      62  
      63    enum profile_status_d x_profile_status;
      64  
      65    /* Whether the dominators and the postdominators are available.  */
      66    enum dom_state x_dom_computed[2];
      67  
      68    /* Number of basic blocks in the dominance tree.  */
      69    unsigned x_n_bbs_in_dom_tree[2];
      70  
      71    /* Maximal number of entities in the single jumptable.  Used to estimate
      72       final flowgraph size.  */
      73    int max_jumptable_ents;
      74  
      75    /* Maximal count of BB in function.  */
      76    profile_count count_max;
      77  
      78    /* Dynamically allocated edge/bb flags.  */
      79    int edge_flags_allocated;
      80    int bb_flags_allocated;
      81  };
      82  
      83  
      84  extern void init_flow (function *);
      85  extern void free_cfg (function *);
      86  extern basic_block alloc_block (void);
      87  extern void link_block (basic_block, basic_block);
      88  extern void unlink_block (basic_block);
      89  extern void compact_blocks (void);
      90  extern void expunge_block (basic_block);
      91  extern edge unchecked_make_edge (basic_block, basic_block, int);
      92  extern edge cached_make_edge (sbitmap, basic_block, basic_block, int);
      93  extern edge make_edge (basic_block, basic_block, int);
      94  extern edge make_single_succ_edge (basic_block, basic_block, int);
      95  extern void remove_edge_raw (edge);
      96  extern void redirect_edge_succ (edge, basic_block);
      97  extern void redirect_edge_pred (edge, basic_block);
      98  extern void clear_bb_flags (void);
      99  extern void dump_edge_info (FILE *, edge, dump_flags_t, int);
     100  extern void debug (edge_def &ref);
     101  extern void debug (edge_def *ptr);
     102  extern void alloc_aux_for_blocks (int);
     103  extern void clear_aux_for_blocks (void);
     104  extern void free_aux_for_blocks (void);
     105  extern void alloc_aux_for_edge (edge, int);
     106  extern void alloc_aux_for_edges (int);
     107  extern void clear_aux_for_edges (void);
     108  extern void free_aux_for_edges (void);
     109  extern void debug_bb (basic_block);
     110  extern basic_block debug_bb_n (int);
     111  extern void debug_bb (basic_block, dump_flags_t);
     112  extern basic_block debug_bb_n (int, dump_flags_t);
     113  extern void dump_bb_info (FILE *, basic_block, int, dump_flags_t, bool, bool);
     114  extern void brief_dump_cfg (FILE *, dump_flags_t);
     115  extern void update_bb_profile_for_threading (basic_block, profile_count, edge);
     116  extern void scale_bbs_frequencies_profile_count (basic_block *, int,
     117  					     profile_count, profile_count);
     118  extern void scale_bbs_frequencies (basic_block *, int, profile_probability);
     119  extern void initialize_original_copy_tables (void);
     120  extern void reset_original_copy_tables (void);
     121  extern void free_original_copy_tables (void);
     122  extern bool original_copy_tables_initialized_p (void);
     123  extern void set_bb_original (basic_block, basic_block);
     124  extern basic_block get_bb_original (basic_block);
     125  extern void set_bb_copy (basic_block, basic_block);
     126  extern basic_block get_bb_copy (basic_block);
     127  void set_loop_copy (class loop *, class loop *);
     128  class loop *get_loop_copy (class loop *);
     129  
     130  /* Generic RAII class to allocate a bit from storage of integer type T.
     131     The allocated bit is accessible as mask with the single bit set
     132     via the conversion operator to T.  */
     133  
     134  template <class T>
     135  class auto_flag
     136  {
     137  public:
     138    /* static assert T is integer type of max HOST_WIDE_INT precision.  */
     139    auto_flag (T *sptr)
     140      {
     141        m_sptr = sptr;
     142        int free_bit = ffs_hwi (~*sptr);
     143        /* If there are no unset bits... */
     144        if (free_bit == 0)
     145  	gcc_unreachable ();
     146        m_flag = HOST_WIDE_INT_1U << (free_bit - 1);
     147        /* ...or if T is signed and thus the complement is sign-extended,
     148           check if we ran out of bits.  We could spare us this bit
     149  	 if we could use C++11 std::make_unsigned<T>::type to pass
     150  	 ~*sptr to ffs_hwi.  */
     151        if (m_flag == 0)
     152  	gcc_unreachable ();
     153        gcc_checking_assert ((*sptr & m_flag) == 0);
     154        *sptr |= m_flag;
     155      }
     156    ~auto_flag ()
     157      {
     158        gcc_checking_assert ((*m_sptr & m_flag) == m_flag);
     159        *m_sptr &= ~m_flag;
     160      }
     161    operator T () const { return m_flag; }
     162  private:
     163    T *m_sptr;
     164    T m_flag;
     165  };
     166  
     167  /* RAII class to allocate an edge flag for temporary use.  You have
     168     to clear the flag from all edges when you are finished using it.  */
     169  
     170  class auto_edge_flag : public auto_flag<int>
     171  {
     172  public:
     173    auto_edge_flag (function *fun)
     174      : auto_flag<int> (&fun->cfg->edge_flags_allocated) {}
     175  };
     176  
     177  /* RAII class to allocate a bb flag for temporary use.  You have
     178     to clear the flag from all edges when you are finished using it.  */
     179  class auto_bb_flag : public auto_flag<int>
     180  {
     181  public:
     182    auto_bb_flag (function *fun)
     183      : auto_flag<int> (&fun->cfg->bb_flags_allocated) {}
     184  };
     185  
     186  #endif /* GCC_CFG_H */