1 /* Consolidation of svalues and regions.
2 Copyright (C) 2020-2022 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, poly_int64);
46 const svalue *get_or_create_unknown_svalue (tree type);
47 const svalue *get_or_create_setjmp_svalue (const setjmp_record &r,
49 const svalue *get_or_create_poisoned_svalue (enum poison_kind kind,
51 const svalue *get_or_create_initial_value (const region *reg);
52 const svalue *get_ptr_svalue (tree ptr_type, const region *pointee);
53 const svalue *get_or_create_unaryop (tree type, enum tree_code op,
55 const svalue *get_or_create_cast (tree type, const svalue *arg);
56 const svalue *get_or_create_binop (tree type,
58 const svalue *arg0, const svalue *arg1);
59 const svalue *get_or_create_sub_svalue (tree type,
60 const svalue *parent_svalue,
61 const region *subregion);
62 const svalue *get_or_create_repeated_svalue (tree type,
63 const svalue *outer_size,
64 const svalue *inner_svalue);
65 const svalue *get_or_create_bits_within (tree type,
66 const bit_range &bits,
67 const svalue *inner_svalue);
68 const svalue *get_or_create_unmergeable (const svalue *arg);
69 const svalue *get_or_create_widening_svalue (tree type,
70 const function_point &point,
71 const svalue *base_svalue,
72 const svalue *iter_svalue);
73 const svalue *get_or_create_compound_svalue (tree type,
74 const binding_map &map);
75 const svalue *get_or_create_conjured_svalue (tree type, const gimple *stmt,
77 const conjured_purge &p);
79 get_or_create_asm_output_svalue (tree type,
82 const vec<const svalue *> &inputs);
84 get_or_create_asm_output_svalue (tree type,
85 const char *asm_string,
88 const vec<const svalue *> &inputs);
90 get_or_create_const_fn_result_svalue (tree type,
92 const vec<const svalue *> &inputs);
94 const svalue *maybe_get_char_from_string_cst (tree string_cst,
95 tree byte_offset_cst);
97 /* Dynamically-allocated svalue instances.
98 The number of these within the analysis can grow arbitrarily.
99 They are still owned by the manager. */
100 const svalue *create_unique_svalue (tree type);
102 /* region consolidation. */
103 const stack_region * get_stack_region () const { return &m_stack_region; }
104 const heap_region *get_heap_region () const { return &m_heap_region; }
105 const code_region *get_code_region () const { return &m_code_region; }
106 const globals_region *get_globals_region () const
108 return &m_globals_region;
110 const errno_region *get_errno_region () const { return &m_errno_region; }
111 const function_region *get_region_for_fndecl (tree fndecl);
112 const label_region *get_region_for_label (tree label);
113 const decl_region *get_region_for_global (tree expr);
114 const region *get_field_region (const region *parent, tree field);
115 const region *get_element_region (const region *parent,
117 const svalue *index);
118 const region *get_offset_region (const region *parent,
120 const svalue *byte_offset);
121 const region *get_sized_region (const region *parent,
123 const svalue *byte_size_sval);
124 const region *get_cast_region (const region *original_region,
126 const frame_region *get_frame_region (const frame_region *calling_frame,
128 const region *get_symbolic_region (const svalue *sval);
129 const string_region *get_region_for_string (tree string_cst);
130 const region *get_bit_range (const region *parent, tree type,
131 const bit_range &bits);
132 const var_arg_region *get_var_arg_region (const frame_region *parent,
135 const region *get_unknown_symbolic_region (tree region_type);
138 get_region_for_unexpected_tree_code (region_model_context *ctxt,
140 const dump_location_t &loc);
142 unsigned alloc_region_id () { return m_next_region_id++; }
144 store_manager *get_store_manager () { return &m_store_mgr; }
145 bounded_ranges_manager *get_range_manager () const { return m_range_mgr; }
147 known_function_manager *get_known_function_manager ()
149 return &m_known_fn_mgr;
152 /* Dynamically-allocated region instances.
153 The number of these within the analysis can grow arbitrarily.
154 They are still owned by the manager. */
155 const region *create_region_for_heap_alloc ();
156 const region *create_region_for_alloca (const frame_region *frame);
158 void log_stats (logger *logger, bool show_objs) const;
160 void begin_checking_feasibility (void) { m_checking_feasibility = true; }
161 void end_checking_feasibility (void) { m_checking_feasibility = false; }
163 logger *get_logger () const { return m_logger; }
165 void dump_untracked_regions () const;
168 bool too_complex_p (const complexity &c) const;
169 bool reject_if_too_complex (svalue *sval);
171 const svalue *maybe_fold_unaryop (tree type, enum tree_code op,
173 const svalue *maybe_fold_binop (tree type, enum tree_code op,
174 const svalue *arg0, const svalue *arg1);
175 const svalue *maybe_fold_sub_svalue (tree type,
176 const svalue *parent_svalue,
177 const region *subregion);
178 const svalue *maybe_fold_repeated_svalue (tree type,
179 const svalue *outer_size,
180 const svalue *inner_svalue);
181 const svalue *maybe_fold_bits_within_svalue (tree type,
182 const bit_range &bits,
183 const svalue *inner_svalue);
184 const svalue *maybe_undo_optimize_bit_field_compare (tree type,
185 const compound_svalue *compound_sval,
186 tree cst, const svalue *arg1);
187 const svalue *maybe_fold_asm_output_svalue (tree type,
188 const vec<const svalue *> &inputs);
192 const call_string m_empty_call_string;
194 unsigned m_next_region_id;
195 root_region m_root_region;
196 stack_region m_stack_region;
197 heap_region m_heap_region;
199 /* svalue consolidation. */
200 typedef hash_map<tree, constant_svalue *> constants_map_t;
201 constants_map_t m_constants_map;
203 typedef hash_map<tree, unknown_svalue *> unknowns_map_t;
204 unknowns_map_t m_unknowns_map;
205 const unknown_svalue *m_unknown_NULL;
207 typedef hash_map<poisoned_svalue::key_t,
208 poisoned_svalue *> poisoned_values_map_t;
209 poisoned_values_map_t m_poisoned_values_map;
211 typedef hash_map<setjmp_svalue::key_t,
212 setjmp_svalue *> setjmp_values_map_t;
213 setjmp_values_map_t m_setjmp_values_map;
215 typedef hash_map<const region *, initial_svalue *> initial_values_map_t;
216 initial_values_map_t m_initial_values_map;
218 typedef hash_map<region_svalue::key_t, region_svalue *> pointer_values_map_t;
219 pointer_values_map_t m_pointer_values_map;
221 typedef hash_map<unaryop_svalue::key_t,
222 unaryop_svalue *> unaryop_values_map_t;
223 unaryop_values_map_t m_unaryop_values_map;
225 typedef hash_map<binop_svalue::key_t, binop_svalue *> binop_values_map_t;
226 binop_values_map_t m_binop_values_map;
228 typedef hash_map<sub_svalue::key_t, sub_svalue *> sub_values_map_t;
229 sub_values_map_t m_sub_values_map;
231 typedef hash_map<repeated_svalue::key_t,
232 repeated_svalue *> repeated_values_map_t;
233 repeated_values_map_t m_repeated_values_map;
235 typedef hash_map<bits_within_svalue::key_t,
236 bits_within_svalue *> bits_within_values_map_t;
237 bits_within_values_map_t m_bits_within_values_map;
239 typedef hash_map<const svalue *,
240 unmergeable_svalue *> unmergeable_values_map_t;
241 unmergeable_values_map_t m_unmergeable_values_map;
243 typedef hash_map<widening_svalue::key_t,
245 widening_svalue::key_t::hash_map_traits*/>
246 widening_values_map_t;
247 widening_values_map_t m_widening_values_map;
249 typedef hash_map<compound_svalue::key_t,
250 compound_svalue *> compound_values_map_t;
251 compound_values_map_t m_compound_values_map;
253 typedef hash_map<conjured_svalue::key_t,
254 conjured_svalue *> conjured_values_map_t;
255 conjured_values_map_t m_conjured_values_map;
257 typedef hash_map<asm_output_svalue::key_t,
258 asm_output_svalue *> asm_output_values_map_t;
259 asm_output_values_map_t m_asm_output_values_map;
261 typedef hash_map<const_fn_result_svalue::key_t,
262 const_fn_result_svalue *> const_fn_result_values_map_t;
263 const_fn_result_values_map_t m_const_fn_result_values_map;
265 bool m_checking_feasibility;
267 /* "Dynamically-allocated" svalue instances.
268 The number of these within the analysis can grow arbitrarily.
269 They are still owned by the manager. */
270 auto_delete_vec<svalue> m_managed_dynamic_svalues;
272 /* Maximum complexity of svalues that weren't rejected. */
273 complexity m_max_complexity;
275 /* region consolidation. */
277 code_region m_code_region;
278 typedef hash_map<tree, function_region *> fndecls_map_t;
279 typedef fndecls_map_t::iterator fndecls_iterator_t;
280 fndecls_map_t m_fndecls_map;
282 typedef hash_map<tree, label_region *> labels_map_t;
283 typedef labels_map_t::iterator labels_iterator_t;
284 labels_map_t m_labels_map;
286 globals_region m_globals_region;
287 typedef hash_map<tree, decl_region *> globals_map_t;
288 typedef globals_map_t::iterator globals_iterator_t;
289 globals_map_t m_globals_map;
291 thread_local_region m_thread_local_region;
292 errno_region m_errno_region;
294 consolidation_map<field_region> m_field_regions;
295 consolidation_map<element_region> m_element_regions;
296 consolidation_map<offset_region> m_offset_regions;
297 consolidation_map<sized_region> m_sized_regions;
298 consolidation_map<cast_region> m_cast_regions;
299 consolidation_map<frame_region> m_frame_regions;
300 consolidation_map<symbolic_region> m_symbolic_regions;
302 typedef hash_map<tree, string_region *> string_map_t;
303 string_map_t m_string_map;
305 consolidation_map<bit_range_region> m_bit_range_regions;
306 consolidation_map<var_arg_region> m_var_arg_regions;
308 store_manager m_store_mgr;
310 bounded_ranges_manager *m_range_mgr;
312 known_function_manager m_known_fn_mgr;
314 /* "Dynamically-allocated" region instances.
315 The number of these within the analysis can grow arbitrarily.
316 They are still owned by the manager. */
317 auto_delete_vec<region> m_managed_dynamic_regions;
322 #endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */