1 /* Consolidation of svalues and regions.
2 Copyright (C) 2020-2023 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
5 This file is part of GCC.
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)
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.
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/>. */
21 #ifndef GCC_ANALYZER_REGION_MODEL_MANAGER_H
22 #define GCC_ANALYZER_REGION_MODEL_MANAGER_H
26 /* A class responsible for owning and consolidating region and svalue
28 region and svalue instances are immutable as far as clients are
29 concerned, so they are provided as "const" ptrs. */
31 class region_model_manager
34 region_model_manager (logger
*logger
= NULL
);
35 ~region_model_manager ();
37 /* call_string consolidation. */
38 const call_string
&get_empty_call_string () const
40 return m_empty_call_string
;
43 /* svalue consolidation. */
44 const svalue
*get_or_create_constant_svalue (tree cst_expr
);
45 const svalue
*get_or_create_int_cst (tree type
, const poly_wide_int_ref
&cst
);
46 const svalue
*get_or_create_null_ptr (tree pointer_type
);
47 const svalue
*get_or_create_unknown_svalue (tree type
);
48 const svalue
*get_or_create_setjmp_svalue (const setjmp_record
&r
,
50 const svalue
*get_or_create_poisoned_svalue (enum poison_kind kind
,
52 const svalue
*get_or_create_initial_value (const region
*reg
,
53 bool check_poisoned
= true);
54 const svalue
*get_ptr_svalue (tree ptr_type
, const region
*pointee
);
55 const svalue
*get_or_create_unaryop (tree type
, enum tree_code op
,
57 const svalue
*get_or_create_cast (tree type
, const svalue
*arg
);
58 const svalue
*get_or_create_binop (tree type
,
60 const svalue
*arg0
, const svalue
*arg1
);
61 const svalue
*get_or_create_sub_svalue (tree type
,
62 const svalue
*parent_svalue
,
63 const region
*subregion
);
64 const svalue
*get_or_create_repeated_svalue (tree type
,
65 const svalue
*outer_size
,
66 const svalue
*inner_svalue
);
67 const svalue
*get_or_create_bits_within (tree type
,
68 const bit_range
&bits
,
69 const svalue
*inner_svalue
);
70 const svalue
*get_or_create_unmergeable (const svalue
*arg
);
71 const svalue
*get_or_create_widening_svalue (tree type
,
72 const function_point
&point
,
73 const svalue
*base_svalue
,
74 const svalue
*iter_svalue
);
75 const svalue
*get_or_create_compound_svalue (tree type
,
76 const binding_map
&map
);
77 const svalue
*get_or_create_conjured_svalue (tree type
, const gimple
*stmt
,
79 const conjured_purge
&p
);
81 get_or_create_asm_output_svalue (tree type
,
84 const vec
<const svalue
*> &inputs
);
86 get_or_create_asm_output_svalue (tree type
,
87 const char *asm_string
,
90 const vec
<const svalue
*> &inputs
);
92 get_or_create_const_fn_result_svalue (tree type
,
94 const vec
<const svalue
*> &inputs
);
96 const svalue
*maybe_get_char_from_string_cst (tree string_cst
,
97 tree byte_offset_cst
);
99 /* Dynamically-allocated svalue instances.
100 The number of these within the analysis can grow arbitrarily.
101 They are still owned by the manager. */
102 const svalue
*create_unique_svalue (tree type
);
104 /* region consolidation. */
105 unsigned get_num_regions () const { return m_next_region_id
; }
106 const stack_region
* get_stack_region () const { return &m_stack_region
; }
107 const heap_region
*get_heap_region () const { return &m_heap_region
; }
108 const code_region
*get_code_region () const { return &m_code_region
; }
109 const globals_region
*get_globals_region () const
111 return &m_globals_region
;
113 const errno_region
*get_errno_region () const { return &m_errno_region
; }
114 const function_region
*get_region_for_fndecl (tree fndecl
);
115 const label_region
*get_region_for_label (tree label
);
116 const decl_region
*get_region_for_global (tree expr
);
117 const region
*get_field_region (const region
*parent
, tree field
);
118 const region
*get_element_region (const region
*parent
,
120 const svalue
*index
);
121 const region
*get_offset_region (const region
*parent
,
123 const svalue
*byte_offset
);
124 const region
*get_sized_region (const region
*parent
,
126 const svalue
*byte_size_sval
);
127 const region
*get_cast_region (const region
*original_region
,
129 const frame_region
*get_frame_region (const frame_region
*calling_frame
,
131 const region
*get_symbolic_region (const svalue
*sval
);
132 const string_region
*get_region_for_string (tree string_cst
);
133 const region
*get_bit_range (const region
*parent
, tree type
,
134 const bit_range
&bits
);
135 const var_arg_region
*get_var_arg_region (const frame_region
*parent
,
138 const region
*get_unknown_symbolic_region (tree region_type
);
141 get_region_for_unexpected_tree_code (region_model_context
*ctxt
,
143 const dump_location_t
&loc
);
145 unsigned alloc_region_id () { return m_next_region_id
++; }
147 store_manager
*get_store_manager () { return &m_store_mgr
; }
148 bounded_ranges_manager
*get_range_manager () const { return m_range_mgr
; }
150 known_function_manager
*get_known_function_manager ()
152 return &m_known_fn_mgr
;
155 /* Dynamically-allocated region instances.
156 The number of these within the analysis can grow arbitrarily.
157 They are still owned by the manager. */
159 get_or_create_region_for_heap_alloc (const bitmap
&base_regs_in_use
);
160 const region
*create_region_for_alloca (const frame_region
*frame
);
162 void log_stats (logger
*logger
, bool show_objs
) const;
164 void begin_checking_feasibility (void) { m_checking_feasibility
= true; }
165 void end_checking_feasibility (void) { m_checking_feasibility
= false; }
167 logger
*get_logger () const { return m_logger
; }
169 void dump_untracked_regions () const;
172 bool too_complex_p (const complexity
&c
) const;
173 bool reject_if_too_complex (svalue
*sval
);
175 const svalue
*maybe_fold_unaryop (tree type
, enum tree_code op
,
177 const svalue
*maybe_fold_binop (tree type
, enum tree_code op
,
178 const svalue
*arg0
, const svalue
*arg1
);
179 const svalue
*maybe_fold_sub_svalue (tree type
,
180 const svalue
*parent_svalue
,
181 const region
*subregion
);
182 const svalue
*maybe_fold_repeated_svalue (tree type
,
183 const svalue
*outer_size
,
184 const svalue
*inner_svalue
);
185 const svalue
*maybe_fold_bits_within_svalue (tree type
,
186 const bit_range
&bits
,
187 const svalue
*inner_svalue
);
188 const svalue
*maybe_undo_optimize_bit_field_compare (tree type
,
189 const compound_svalue
*compound_sval
,
190 tree cst
, const svalue
*arg1
);
191 const svalue
*maybe_fold_asm_output_svalue (tree type
,
192 const vec
<const svalue
*> &inputs
);
196 const call_string m_empty_call_string
;
198 unsigned m_next_region_id
;
199 root_region m_root_region
;
200 stack_region m_stack_region
;
201 heap_region m_heap_region
;
203 /* svalue consolidation. */
204 typedef hash_map
<tree
, constant_svalue
*> constants_map_t
;
205 constants_map_t m_constants_map
;
207 typedef hash_map
<tree
, unknown_svalue
*> unknowns_map_t
;
208 unknowns_map_t m_unknowns_map
;
209 const unknown_svalue
*m_unknown_NULL
;
211 typedef hash_map
<poisoned_svalue::key_t
,
212 poisoned_svalue
*> poisoned_values_map_t
;
213 poisoned_values_map_t m_poisoned_values_map
;
215 typedef hash_map
<setjmp_svalue::key_t
,
216 setjmp_svalue
*> setjmp_values_map_t
;
217 setjmp_values_map_t m_setjmp_values_map
;
219 typedef hash_map
<const region
*, initial_svalue
*> initial_values_map_t
;
220 initial_values_map_t m_initial_values_map
;
222 typedef hash_map
<region_svalue::key_t
, region_svalue
*> pointer_values_map_t
;
223 pointer_values_map_t m_pointer_values_map
;
225 typedef hash_map
<unaryop_svalue::key_t
,
226 unaryop_svalue
*> unaryop_values_map_t
;
227 unaryop_values_map_t m_unaryop_values_map
;
229 typedef hash_map
<binop_svalue::key_t
, binop_svalue
*> binop_values_map_t
;
230 binop_values_map_t m_binop_values_map
;
232 typedef hash_map
<sub_svalue::key_t
, sub_svalue
*> sub_values_map_t
;
233 sub_values_map_t m_sub_values_map
;
235 typedef hash_map
<repeated_svalue::key_t
,
236 repeated_svalue
*> repeated_values_map_t
;
237 repeated_values_map_t m_repeated_values_map
;
239 typedef hash_map
<bits_within_svalue::key_t
,
240 bits_within_svalue
*> bits_within_values_map_t
;
241 bits_within_values_map_t m_bits_within_values_map
;
243 typedef hash_map
<const svalue
*,
244 unmergeable_svalue
*> unmergeable_values_map_t
;
245 unmergeable_values_map_t m_unmergeable_values_map
;
247 typedef hash_map
<widening_svalue::key_t
,
249 widening_svalue::key_t::hash_map_traits*/
>
250 widening_values_map_t
;
251 widening_values_map_t m_widening_values_map
;
253 typedef hash_map
<compound_svalue::key_t
,
254 compound_svalue
*> compound_values_map_t
;
255 compound_values_map_t m_compound_values_map
;
257 typedef hash_map
<conjured_svalue::key_t
,
258 conjured_svalue
*> conjured_values_map_t
;
259 conjured_values_map_t m_conjured_values_map
;
261 typedef hash_map
<asm_output_svalue::key_t
,
262 asm_output_svalue
*> asm_output_values_map_t
;
263 asm_output_values_map_t m_asm_output_values_map
;
265 typedef hash_map
<const_fn_result_svalue::key_t
,
266 const_fn_result_svalue
*> const_fn_result_values_map_t
;
267 const_fn_result_values_map_t m_const_fn_result_values_map
;
269 bool m_checking_feasibility
;
271 /* "Dynamically-allocated" svalue instances.
272 The number of these within the analysis can grow arbitrarily.
273 They are still owned by the manager. */
274 auto_delete_vec
<svalue
> m_managed_dynamic_svalues
;
276 /* Maximum complexity of svalues that weren't rejected. */
277 complexity m_max_complexity
;
279 /* region consolidation. */
281 code_region m_code_region
;
282 typedef hash_map
<tree
, function_region
*> fndecls_map_t
;
283 typedef fndecls_map_t::iterator fndecls_iterator_t
;
284 fndecls_map_t m_fndecls_map
;
286 typedef hash_map
<tree
, label_region
*> labels_map_t
;
287 typedef labels_map_t::iterator labels_iterator_t
;
288 labels_map_t m_labels_map
;
290 globals_region m_globals_region
;
291 typedef hash_map
<tree
, decl_region
*> globals_map_t
;
292 typedef globals_map_t::iterator globals_iterator_t
;
293 globals_map_t m_globals_map
;
295 thread_local_region m_thread_local_region
;
296 errno_region m_errno_region
;
298 consolidation_map
<field_region
> m_field_regions
;
299 consolidation_map
<element_region
> m_element_regions
;
300 consolidation_map
<offset_region
> m_offset_regions
;
301 consolidation_map
<sized_region
> m_sized_regions
;
302 consolidation_map
<cast_region
> m_cast_regions
;
303 consolidation_map
<frame_region
> m_frame_regions
;
304 consolidation_map
<symbolic_region
> m_symbolic_regions
;
306 typedef hash_map
<tree
, string_region
*> string_map_t
;
307 string_map_t m_string_map
;
309 consolidation_map
<bit_range_region
> m_bit_range_regions
;
310 consolidation_map
<var_arg_region
> m_var_arg_regions
;
312 store_manager m_store_mgr
;
314 bounded_ranges_manager
*m_range_mgr
;
316 known_function_manager m_known_fn_mgr
;
318 /* "Dynamically-allocated" region instances.
319 The number of these within the analysis can grow arbitrarily.
320 They are still owned by the manager. */
321 auto_delete_vec
<region
> m_managed_dynamic_regions
;
326 #endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */