LCOV - code coverage report
Current view: top level - gcc/analyzer - region-model-manager.h Coverage Total Hit
Test: gcc.info Lines: 100.0 % 17 17
Test Date: 2026-02-28 14:20:25 Functions: - 0 0
Legend: Lines:     hit not hit

            Line data    Source code
       1              : /* Consolidation of svalues and regions.
       2              :    Copyright (C) 2020-2026 Free Software Foundation, Inc.
       3              :    Contributed by David Malcolm <dmalcolm@redhat.com>.
       4              : 
       5              : This file is part of GCC.
       6              : 
       7              : GCC is free software; you can redistribute it and/or modify it
       8              : under the terms of the GNU General Public License as published by
       9              : the Free Software Foundation; either version 3, or (at your option)
      10              : any later version.
      11              : 
      12              : GCC is distributed in the hope that it will be useful, but
      13              : WITHOUT ANY WARRANTY; without even the implied warranty of
      14              : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
      15              : General Public License for more details.
      16              : 
      17              : You should have received a copy of the GNU General Public License
      18              : along with GCC; see the file COPYING3.  If not see
      19              : <http://www.gnu.org/licenses/>.  */
      20              : 
      21              : #ifndef GCC_ANALYZER_REGION_MODEL_MANAGER_H
      22              : #define GCC_ANALYZER_REGION_MODEL_MANAGER_H
      23              : 
      24              : namespace ana {
      25              : 
      26              : /* A class responsible for owning and consolidating region and svalue
      27              :    instances.
      28              :    region and svalue instances are immutable as far as clients are
      29              :    concerned, so they are provided as "const" ptrs.  */
      30              : 
      31              : class region_model_manager
      32              : {
      33              : public:
      34              :   region_model_manager (logger *logger = nullptr);
      35              :   ~region_model_manager ();
      36              : 
      37              :   unsigned get_num_symbols () const { return m_next_symbol_id; }
      38       390304 :   unsigned alloc_symbol_id () { return m_next_symbol_id++; }
      39              : 
      40              :   /* call_string consolidation.  */
      41        13500 :   const call_string &get_empty_call_string () const
      42              :   {
      43        10071 :     return m_empty_call_string;
      44              :   }
      45              : 
      46              :   /* svalue consolidation.  */
      47              :   const svalue *get_or_create_constant_svalue (tree type, tree cst_expr);
      48              :   const svalue *get_or_create_constant_svalue (tree cst_expr);
      49              :   const svalue *get_or_create_int_cst (tree type, const poly_wide_int_ref &cst);
      50              :   const svalue *get_or_create_null_ptr (tree pointer_type);
      51              :   const svalue *get_or_create_unknown_svalue (tree type);
      52              :   const svalue *get_or_create_setjmp_svalue (const setjmp_record &r,
      53              :                                              tree type);
      54              :   const svalue *get_or_create_poisoned_svalue (enum poison_kind kind,
      55              :                                                tree type);
      56              :   const svalue *get_or_create_initial_value (const region *reg,
      57              :                                              bool check_poisoned = true);
      58              :   const svalue *get_ptr_svalue (tree ptr_type, const region *pointee);
      59              :   const svalue *get_or_create_unaryop (tree type, enum tree_code op,
      60              :                                        const svalue *arg);
      61              :   const svalue *get_or_create_cast (tree type, const svalue *arg);
      62              :   const svalue *get_or_create_binop (tree type,
      63              :                                      enum tree_code op,
      64              :                                      const svalue *arg0, const svalue *arg1);
      65              :   const svalue *get_or_create_sub_svalue (tree type,
      66              :                                           const svalue *parent_svalue,
      67              :                                           const region *subregion);
      68              :   const svalue *get_or_create_repeated_svalue (tree type,
      69              :                                                const svalue *outer_size,
      70              :                                                const svalue *inner_svalue);
      71              :   const svalue *get_or_create_bits_within (tree type,
      72              :                                            const bit_range &bits,
      73              :                                            const svalue *inner_svalue);
      74              :   const svalue *get_or_create_unmergeable (const svalue *arg);
      75              :   const svalue *get_or_create_widening_svalue (tree type,
      76              :                                                const supernode *snode,
      77              :                                                const svalue *base_svalue,
      78              :                                                const svalue *iter_svalue);
      79              :   const svalue *get_or_create_compound_svalue (tree type,
      80              :                                                const binding_map &map);
      81              :   const svalue *get_or_create_conjured_svalue (tree type, const gimple *stmt,
      82              :                                                const region *id_reg,
      83              :                                                const conjured_purge &p,
      84              :                                                unsigned idx = 0);
      85              :   const svalue *
      86              :   get_or_create_asm_output_svalue (tree type,
      87              :                                    const gasm *asm_stmt,
      88              :                                    unsigned output_idx,
      89              :                                    const vec<const svalue *> &inputs);
      90              :   const svalue *
      91              :   get_or_create_asm_output_svalue (tree type,
      92              :                                    const char *asm_string,
      93              :                                    unsigned output_idx,
      94              :                                    unsigned num_outputs,
      95              :                                    const vec<const svalue *> &inputs);
      96              :   const svalue *
      97              :   get_or_create_const_fn_result_svalue (tree type,
      98              :                                         tree fndecl,
      99              :                                         const vec<const svalue *> &inputs);
     100              : 
     101              :   const svalue *maybe_get_char_from_cst (tree data_cst,
     102              :                                          tree byte_offset_cst);
     103              :   const svalue *maybe_get_char_from_string_cst (tree string_cst,
     104              :                                                 tree byte_offset_cst);
     105              :   const svalue *maybe_get_char_from_raw_data_cst (tree raw_data_cst,
     106              :                                                   tree byte_offset_cst);
     107              : 
     108              :   /* Dynamically-allocated svalue instances.
     109              :      The number of these within the analysis can grow arbitrarily.
     110              :      They are still owned by the manager.  */
     111              :   const svalue *create_unique_svalue (tree type);
     112              : 
     113              :   /* region consolidation.  */
     114         6754 :   const root_region *get_root_region () const { return &m_root_region; }
     115            4 :   const stack_region * get_stack_region () const { return &m_stack_region; }
     116            4 :   const heap_region *get_heap_region () const { return &m_heap_region; }
     117            4 :   const code_region *get_code_region () const { return &m_code_region; }
     118            4 :   const globals_region *get_globals_region () const
     119              :   {
     120            4 :     return &m_globals_region;
     121              :   }
     122          913 :   const errno_region *get_errno_region () const { return &m_errno_region; }
     123              :   const function_region *get_region_for_fndecl (tree fndecl);
     124              :   const label_region *get_region_for_label (tree label);
     125              :   const decl_region *get_region_for_global (tree expr);
     126              :   const region *get_field_region (const region *parent, tree field);
     127              :   const region *get_element_region (const region *parent,
     128              :                                     tree element_type,
     129              :                                     const svalue *index);
     130              :   const region *get_offset_region (const region *parent,
     131              :                                    tree type,
     132              :                                    const svalue *byte_offset);
     133              :   const region *get_sized_region (const region *parent,
     134              :                                   tree type,
     135              :                                   const svalue *byte_size_sval);
     136              :   const region *get_cast_region (const region *original_region,
     137              :                                  tree type);
     138              :   const frame_region *get_frame_region (const frame_region *calling_frame,
     139              :                                         const function &fun);
     140              :   const region *get_symbolic_region (const svalue *sval);
     141              :   const string_region *get_region_for_string (tree string_cst);
     142              :   const region *get_bit_range (const region *parent, tree type,
     143              :                                const bit_range &bits);
     144              :   const var_arg_region *get_var_arg_region (const frame_region *parent,
     145              :                                             unsigned idx);
     146              : 
     147              :   const region *get_unknown_symbolic_region (tree region_type);
     148              : 
     149              :   const region *
     150              :   get_region_for_unexpected_tree_code (region_model_context *ctxt,
     151              :                                        tree t,
     152              :                                        const dump_location_t &loc);
     153              : 
     154      5740091 :   store_manager *get_store_manager () { return &m_store_mgr; }
     155        20937 :   bounded_ranges_manager *get_range_manager () const { return m_range_mgr; }
     156              : 
     157       354308 :   known_function_manager *get_known_function_manager ()
     158              :   {
     159       354308 :     return &m_known_fn_mgr;
     160              :   }
     161              : 
     162              :   /* Dynamically-allocated region instances.
     163              :      The number of these within the analysis can grow arbitrarily.
     164              :      They are still owned by the manager.  */
     165              :   const region *
     166              :   get_or_create_region_for_heap_alloc (const bitmap &base_regs_in_use);
     167              :   const region *create_region_for_alloca (const frame_region *frame);
     168              : 
     169              :   void log_stats (logger *logger, bool show_objs) const;
     170              : 
     171         6371 :   void begin_checking_feasibility (void) { m_checking_feasibility = true; }
     172         6371 :   void end_checking_feasibility (void) { m_checking_feasibility = false; }
     173              : 
     174       357919 :   logger *get_logger () const { return m_logger; }
     175              : 
     176              :   void dump_untracked_regions () const;
     177              : 
     178              :   const svalue *maybe_fold_binop (tree type, enum tree_code op,
     179              :                                   const svalue *arg0, const svalue *arg1);
     180              : private:
     181              :   bool too_complex_p (const complexity &c) const;
     182              :   bool reject_if_too_complex (svalue *sval);
     183              : 
     184              :   const svalue *maybe_fold_unaryop (tree type, enum tree_code op,
     185              :                                     const svalue *arg);
     186              :   const svalue *maybe_fold_sub_svalue (tree type,
     187              :                                        const svalue *parent_svalue,
     188              :                                        const region *subregion);
     189              :   const svalue *maybe_fold_repeated_svalue (tree type,
     190              :                                             const svalue *outer_size,
     191              :                                             const svalue *inner_svalue);
     192              :   const svalue *maybe_fold_bits_within_svalue (tree type,
     193              :                                                const bit_range &bits,
     194              :                                                const svalue *inner_svalue);
     195              :   const svalue *maybe_undo_optimize_bit_field_compare (tree type,
     196              :                                                        const compound_svalue *compound_sval,
     197              :                                                        tree cst, const svalue *arg1);
     198              :   const svalue *maybe_fold_asm_output_svalue (tree type,
     199              :                                               const vec<const svalue *> &inputs);
     200              : 
     201              :   logger *m_logger;
     202              : 
     203              :   unsigned m_next_symbol_id;
     204              : 
     205              :   const call_string m_empty_call_string;
     206              : 
     207              :   root_region m_root_region;
     208              :   stack_region m_stack_region;
     209              :   heap_region m_heap_region;
     210              : 
     211              :   /* svalue consolidation.  */
     212              :   typedef hash_map<constant_svalue::key_t, constant_svalue *> constants_map_t;
     213              :   constants_map_t m_constants_map;
     214              : 
     215              :   typedef hash_map<tree, unknown_svalue *> unknowns_map_t;
     216              :   unknowns_map_t m_unknowns_map;
     217              :   const unknown_svalue *m_unknown_NULL;
     218              : 
     219              :   typedef hash_map<poisoned_svalue::key_t,
     220              :                    poisoned_svalue *> poisoned_values_map_t;
     221              :   poisoned_values_map_t m_poisoned_values_map;
     222              : 
     223              :   typedef hash_map<setjmp_svalue::key_t,
     224              :                    setjmp_svalue *> setjmp_values_map_t;
     225              :   setjmp_values_map_t m_setjmp_values_map;
     226              : 
     227              :   typedef hash_map<const region *, initial_svalue *> initial_values_map_t;
     228              :   initial_values_map_t m_initial_values_map;
     229              : 
     230              :   typedef hash_map<region_svalue::key_t, region_svalue *> pointer_values_map_t;
     231              :   pointer_values_map_t m_pointer_values_map;
     232              : 
     233              :   typedef hash_map<unaryop_svalue::key_t,
     234              :                    unaryop_svalue *> unaryop_values_map_t;
     235              :   unaryop_values_map_t m_unaryop_values_map;
     236              : 
     237              :   typedef hash_map<binop_svalue::key_t, binop_svalue *> binop_values_map_t;
     238              :   binop_values_map_t m_binop_values_map;
     239              : 
     240              :   typedef hash_map<sub_svalue::key_t, sub_svalue *> sub_values_map_t;
     241              :   sub_values_map_t m_sub_values_map;
     242              : 
     243              :   typedef hash_map<repeated_svalue::key_t,
     244              :                    repeated_svalue *> repeated_values_map_t;
     245              :   repeated_values_map_t m_repeated_values_map;
     246              : 
     247              :   typedef hash_map<bits_within_svalue::key_t,
     248              :                    bits_within_svalue *> bits_within_values_map_t;
     249              :   bits_within_values_map_t m_bits_within_values_map;
     250              : 
     251              :   typedef hash_map<const svalue *,
     252              :                    unmergeable_svalue *> unmergeable_values_map_t;
     253              :   unmergeable_values_map_t m_unmergeable_values_map;
     254              : 
     255              :   typedef hash_map<widening_svalue::key_t,
     256              :                    widening_svalue */*,
     257              :                    widening_svalue::key_t::hash_map_traits*/>
     258              :     widening_values_map_t;
     259              :   widening_values_map_t m_widening_values_map;
     260              : 
     261              :   typedef hash_map<compound_svalue::key_t,
     262              :                    compound_svalue *> compound_values_map_t;
     263              :   compound_values_map_t m_compound_values_map;
     264              : 
     265              :   typedef hash_map<conjured_svalue::key_t,
     266              :                    conjured_svalue *> conjured_values_map_t;
     267              :   conjured_values_map_t m_conjured_values_map;
     268              : 
     269              :   typedef hash_map<asm_output_svalue::key_t,
     270              :                    asm_output_svalue *> asm_output_values_map_t;
     271              :   asm_output_values_map_t m_asm_output_values_map;
     272              : 
     273              :   typedef hash_map<const_fn_result_svalue::key_t,
     274              :                    const_fn_result_svalue *> const_fn_result_values_map_t;
     275              :   const_fn_result_values_map_t m_const_fn_result_values_map;
     276              : 
     277              :   bool m_checking_feasibility;
     278              : 
     279              :   /* "Dynamically-allocated" svalue instances.
     280              :      The number of these within the analysis can grow arbitrarily.
     281              :      They are still owned by the manager.  */
     282              :   auto_delete_vec<svalue> m_managed_dynamic_svalues;
     283              : 
     284              :   /* Maximum complexity of svalues that weren't rejected.  */
     285              :   complexity m_max_complexity;
     286              : 
     287              :   /* region consolidation.  */
     288              : 
     289              :   code_region m_code_region;
     290              :   typedef hash_map<tree, function_region *> fndecls_map_t;
     291              :   typedef fndecls_map_t::iterator fndecls_iterator_t;
     292              :   fndecls_map_t m_fndecls_map;
     293              : 
     294              :   typedef hash_map<tree, label_region *> labels_map_t;
     295              :   typedef labels_map_t::iterator labels_iterator_t;
     296              :   labels_map_t m_labels_map;
     297              : 
     298              :   globals_region m_globals_region;
     299              :   typedef hash_map<tree, decl_region *> globals_map_t;
     300              :   typedef globals_map_t::iterator globals_iterator_t;
     301              :   globals_map_t m_globals_map;
     302              : 
     303              :   thread_local_region m_thread_local_region;
     304              :   errno_region m_errno_region;
     305              : 
     306              :   consolidation_map<field_region> m_field_regions;
     307              :   consolidation_map<element_region> m_element_regions;
     308              :   consolidation_map<offset_region> m_offset_regions;
     309              :   consolidation_map<sized_region> m_sized_regions;
     310              :   consolidation_map<cast_region> m_cast_regions;
     311              :   consolidation_map<frame_region> m_frame_regions;
     312              :   consolidation_map<symbolic_region> m_symbolic_regions;
     313              : 
     314              :   typedef hash_map<tree, string_region *> string_map_t;
     315              :   string_map_t m_string_map;
     316              : 
     317              :   consolidation_map<bit_range_region> m_bit_range_regions;
     318              :   consolidation_map<var_arg_region> m_var_arg_regions;
     319              : 
     320              :   store_manager m_store_mgr;
     321              : 
     322              :   bounded_ranges_manager *m_range_mgr;
     323              : 
     324              :   known_function_manager m_known_fn_mgr;
     325              : 
     326              :   /* "Dynamically-allocated" region instances.
     327              :      The number of these within the analysis can grow arbitrarily.
     328              :      They are still owned by the manager.  */
     329              :   auto_delete_vec<region> m_managed_dynamic_regions;
     330              : };
     331              : 
     332              : } // namespace ana
     333              : 
     334              : #endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */
        

Generated by: LCOV version 2.4-beta

LCOV profile is generated on x86_64 machine using following configure options: configure --disable-bootstrap --enable-coverage=opt --enable-languages=c,c++,fortran,go,jit,lto,rust,m2 --enable-host-shared. GCC test suite is run with the built compiler.