ada: Fix wrong resolution for hidden discriminant in predicate
[official-gcc.git] / gcc / analyzer / region-model-manager.h
blobff5333bf07c47aaa05bbe3fb4cfb9c1f335a902f
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)
10 any later version.
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
24 namespace ana {
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. */
31 class region_model_manager
33 public:
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,
49 tree type);
50 const svalue *get_or_create_poisoned_svalue (enum poison_kind kind,
51 tree type);
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,
56 const svalue *arg);
57 const svalue *get_or_create_cast (tree type, const svalue *arg);
58 const svalue *get_or_create_binop (tree type,
59 enum tree_code op,
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,
78 const region *id_reg,
79 const conjured_purge &p);
80 const svalue *
81 get_or_create_asm_output_svalue (tree type,
82 const gasm *asm_stmt,
83 unsigned output_idx,
84 const vec<const svalue *> &inputs);
85 const svalue *
86 get_or_create_asm_output_svalue (tree type,
87 const char *asm_string,
88 unsigned output_idx,
89 unsigned num_outputs,
90 const vec<const svalue *> &inputs);
91 const svalue *
92 get_or_create_const_fn_result_svalue (tree type,
93 tree fndecl,
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,
119 tree element_type,
120 const svalue *index);
121 const region *get_offset_region (const region *parent,
122 tree type,
123 const svalue *byte_offset);
124 const region *get_sized_region (const region *parent,
125 tree type,
126 const svalue *byte_size_sval);
127 const region *get_cast_region (const region *original_region,
128 tree type);
129 const frame_region *get_frame_region (const frame_region *calling_frame,
130 function *fun);
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,
136 unsigned idx);
138 const region *get_unknown_symbolic_region (tree region_type);
140 const region *
141 get_region_for_unexpected_tree_code (region_model_context *ctxt,
142 tree t,
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. */
158 const region *
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;
171 private:
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,
176 const svalue *arg);
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);
194 logger *m_logger;
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,
248 widening_svalue */*,
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;
324 } // namespace ana
326 #endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */