]> git.ipfire.org Git - thirdparty/gcc.git/blame - gcc/analyzer/region-model-manager.h
analyzer: fix nondeterminism in logs
[thirdparty/gcc.git] / gcc / analyzer / region-model-manager.h
CommitLineData
0167154c
DM
1/* Consolidation of svalues and regions.
2 Copyright (C) 2020-2022 Free Software Foundation, Inc.
3 Contributed by David Malcolm <dmalcolm@redhat.com>.
4
5This file is part of GCC.
6
7GCC is free software; you can redistribute it and/or modify it
8under the terms of the GNU General Public License as published by
9the Free Software Foundation; either version 3, or (at your option)
10any later version.
11
12GCC is distributed in the hope that it will be useful, but
13WITHOUT ANY WARRANTY; without even the implied warranty of
14MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
15General Public License for more details.
16
17You should have received a copy of the GNU General Public License
18along 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
24namespace 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
31class region_model_manager
32{
33public:
34 region_model_manager (logger *logger = NULL);
35 ~region_model_manager ();
36
37 /* call_string consolidation. */
38 const call_string &get_empty_call_string () const
39 {
40 return m_empty_call_string;
41 }
42
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,
48 tree type);
49 const svalue *get_or_create_poisoned_svalue (enum poison_kind kind,
50 tree type);
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,
54 const svalue *arg);
55 const svalue *get_or_create_cast (tree type, const svalue *arg);
56 const svalue *get_or_create_binop (tree type,
57 enum tree_code op,
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,
76 const region *id_reg,
77 const conjured_purge &p);
78 const svalue *
79 get_or_create_asm_output_svalue (tree type,
80 const gasm *asm_stmt,
81 unsigned output_idx,
82 const vec<const svalue *> &inputs);
83 const svalue *
bfca9505
DM
84 get_or_create_asm_output_svalue (tree type,
85 const char *asm_string,
86 unsigned output_idx,
87 unsigned num_outputs,
88 const vec<const svalue *> &inputs);
89 const svalue *
0167154c
DM
90 get_or_create_const_fn_result_svalue (tree type,
91 tree fndecl,
92 const vec<const svalue *> &inputs);
93
94 const svalue *maybe_get_char_from_string_cst (tree string_cst,
95 tree byte_offset_cst);
96
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);
101
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
107 {
108 return &m_globals_region;
109 }
3d2d04cd 110 const errno_region *get_errno_region () const { return &m_errno_region; }
0167154c
DM
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,
116 tree element_type,
117 const svalue *index);
118 const region *get_offset_region (const region *parent,
119 tree type,
120 const svalue *byte_offset);
121 const region *get_sized_region (const region *parent,
122 tree type,
123 const svalue *byte_size_sval);
124 const region *get_cast_region (const region *original_region,
125 tree type);
126 const frame_region *get_frame_region (const frame_region *calling_frame,
127 function *fun);
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,
133 unsigned idx);
134
135 const region *get_unknown_symbolic_region (tree region_type);
136
137 const region *
138 get_region_for_unexpected_tree_code (region_model_context *ctxt,
139 tree t,
140 const dump_location_t &loc);
141
142 unsigned alloc_region_id () { return m_next_region_id++; }
143
144 store_manager *get_store_manager () { return &m_store_mgr; }
145 bounded_ranges_manager *get_range_manager () const { return m_range_mgr; }
146
147 known_function_manager *get_known_function_manager ()
148 {
149 return &m_known_fn_mgr;
150 }
151
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);
157
158 void log_stats (logger *logger, bool show_objs) const;
159
160 void begin_checking_feasibility (void) { m_checking_feasibility = true; }
161 void end_checking_feasibility (void) { m_checking_feasibility = false; }
162
163 logger *get_logger () const { return m_logger; }
164
165 void dump_untracked_regions () const;
166
167private:
168 bool too_complex_p (const complexity &c) const;
169 bool reject_if_too_complex (svalue *sval);
170
171 const svalue *maybe_fold_unaryop (tree type, enum tree_code op,
172 const svalue *arg);
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);
189
190 logger *m_logger;
191
192 const call_string m_empty_call_string;
193
194 unsigned m_next_region_id;
195 root_region m_root_region;
196 stack_region m_stack_region;
197 heap_region m_heap_region;
198
199 /* svalue consolidation. */
200 typedef hash_map<tree, constant_svalue *> constants_map_t;
201 constants_map_t m_constants_map;
202
203 typedef hash_map<tree, unknown_svalue *> unknowns_map_t;
204 unknowns_map_t m_unknowns_map;
205 const unknown_svalue *m_unknown_NULL;
206
207 typedef hash_map<poisoned_svalue::key_t,
208 poisoned_svalue *> poisoned_values_map_t;
209 poisoned_values_map_t m_poisoned_values_map;
210
211 typedef hash_map<setjmp_svalue::key_t,
212 setjmp_svalue *> setjmp_values_map_t;
213 setjmp_values_map_t m_setjmp_values_map;
214
215 typedef hash_map<const region *, initial_svalue *> initial_values_map_t;
216 initial_values_map_t m_initial_values_map;
217
218 typedef hash_map<region_svalue::key_t, region_svalue *> pointer_values_map_t;
219 pointer_values_map_t m_pointer_values_map;
220
221 typedef hash_map<unaryop_svalue::key_t,
222 unaryop_svalue *> unaryop_values_map_t;
223 unaryop_values_map_t m_unaryop_values_map;
224
225 typedef hash_map<binop_svalue::key_t, binop_svalue *> binop_values_map_t;
226 binop_values_map_t m_binop_values_map;
227
228 typedef hash_map<sub_svalue::key_t, sub_svalue *> sub_values_map_t;
229 sub_values_map_t m_sub_values_map;
230
231 typedef hash_map<repeated_svalue::key_t,
232 repeated_svalue *> repeated_values_map_t;
233 repeated_values_map_t m_repeated_values_map;
234
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;
238
239 typedef hash_map<const svalue *,
240 unmergeable_svalue *> unmergeable_values_map_t;
241 unmergeable_values_map_t m_unmergeable_values_map;
242
243 typedef hash_map<widening_svalue::key_t,
244 widening_svalue */*,
245 widening_svalue::key_t::hash_map_traits*/>
246 widening_values_map_t;
247 widening_values_map_t m_widening_values_map;
248
249 typedef hash_map<compound_svalue::key_t,
250 compound_svalue *> compound_values_map_t;
251 compound_values_map_t m_compound_values_map;
252
253 typedef hash_map<conjured_svalue::key_t,
254 conjured_svalue *> conjured_values_map_t;
255 conjured_values_map_t m_conjured_values_map;
256
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;
260
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;
264
265 bool m_checking_feasibility;
266
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;
271
272 /* Maximum complexity of svalues that weren't rejected. */
273 complexity m_max_complexity;
274
275 /* region consolidation. */
276
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;
281
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;
285
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;
290
3d2d04cd
DM
291 thread_local_region m_thread_local_region;
292 errno_region m_errno_region;
293
0167154c
DM
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;
301
302 typedef hash_map<tree, string_region *> string_map_t;
303 string_map_t m_string_map;
304
305 consolidation_map<bit_range_region> m_bit_range_regions;
306 consolidation_map<var_arg_region> m_var_arg_regions;
307
308 store_manager m_store_mgr;
309
310 bounded_ranges_manager *m_range_mgr;
311
312 known_function_manager m_known_fn_mgr;
313
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;
318};
319
320} // namespace ana
321
322#endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */