]> git.ipfire.org Git - thirdparty/gcc.git/blob - gcc/analyzer/region-model-manager.h
Update copyright years.
[thirdparty/gcc.git] / gcc / analyzer / region-model-manager.h
1 /* Consolidation of svalues and regions.
2 Copyright (C) 2020-2023 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 = 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_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 const svalue *get_ptr_svalue (tree ptr_type, const region *pointee);
54 const svalue *get_or_create_unaryop (tree type, enum tree_code op,
55 const svalue *arg);
56 const svalue *get_or_create_cast (tree type, const svalue *arg);
57 const svalue *get_or_create_binop (tree type,
58 enum tree_code op,
59 const svalue *arg0, const svalue *arg1);
60 const svalue *get_or_create_sub_svalue (tree type,
61 const svalue *parent_svalue,
62 const region *subregion);
63 const svalue *get_or_create_repeated_svalue (tree type,
64 const svalue *outer_size,
65 const svalue *inner_svalue);
66 const svalue *get_or_create_bits_within (tree type,
67 const bit_range &bits,
68 const svalue *inner_svalue);
69 const svalue *get_or_create_unmergeable (const svalue *arg);
70 const svalue *get_or_create_widening_svalue (tree type,
71 const function_point &point,
72 const svalue *base_svalue,
73 const svalue *iter_svalue);
74 const svalue *get_or_create_compound_svalue (tree type,
75 const binding_map &map);
76 const svalue *get_or_create_conjured_svalue (tree type, const gimple *stmt,
77 const region *id_reg,
78 const conjured_purge &p);
79 const svalue *
80 get_or_create_asm_output_svalue (tree type,
81 const gasm *asm_stmt,
82 unsigned output_idx,
83 const vec<const svalue *> &inputs);
84 const svalue *
85 get_or_create_asm_output_svalue (tree type,
86 const char *asm_string,
87 unsigned output_idx,
88 unsigned num_outputs,
89 const vec<const svalue *> &inputs);
90 const svalue *
91 get_or_create_const_fn_result_svalue (tree type,
92 tree fndecl,
93 const vec<const svalue *> &inputs);
94
95 const svalue *maybe_get_char_from_string_cst (tree string_cst,
96 tree byte_offset_cst);
97
98 /* Dynamically-allocated svalue instances.
99 The number of these within the analysis can grow arbitrarily.
100 They are still owned by the manager. */
101 const svalue *create_unique_svalue (tree type);
102
103 /* region consolidation. */
104 unsigned get_num_regions () const { return m_next_region_id; }
105 const stack_region * get_stack_region () const { return &m_stack_region; }
106 const heap_region *get_heap_region () const { return &m_heap_region; }
107 const code_region *get_code_region () const { return &m_code_region; }
108 const globals_region *get_globals_region () const
109 {
110 return &m_globals_region;
111 }
112 const errno_region *get_errno_region () const { return &m_errno_region; }
113 const function_region *get_region_for_fndecl (tree fndecl);
114 const label_region *get_region_for_label (tree label);
115 const decl_region *get_region_for_global (tree expr);
116 const region *get_field_region (const region *parent, tree field);
117 const region *get_element_region (const region *parent,
118 tree element_type,
119 const svalue *index);
120 const region *get_offset_region (const region *parent,
121 tree type,
122 const svalue *byte_offset);
123 const region *get_sized_region (const region *parent,
124 tree type,
125 const svalue *byte_size_sval);
126 const region *get_cast_region (const region *original_region,
127 tree type);
128 const frame_region *get_frame_region (const frame_region *calling_frame,
129 function *fun);
130 const region *get_symbolic_region (const svalue *sval);
131 const string_region *get_region_for_string (tree string_cst);
132 const region *get_bit_range (const region *parent, tree type,
133 const bit_range &bits);
134 const var_arg_region *get_var_arg_region (const frame_region *parent,
135 unsigned idx);
136
137 const region *get_unknown_symbolic_region (tree region_type);
138
139 const region *
140 get_region_for_unexpected_tree_code (region_model_context *ctxt,
141 tree t,
142 const dump_location_t &loc);
143
144 unsigned alloc_region_id () { return m_next_region_id++; }
145
146 store_manager *get_store_manager () { return &m_store_mgr; }
147 bounded_ranges_manager *get_range_manager () const { return m_range_mgr; }
148
149 known_function_manager *get_known_function_manager ()
150 {
151 return &m_known_fn_mgr;
152 }
153
154 /* Dynamically-allocated region instances.
155 The number of these within the analysis can grow arbitrarily.
156 They are still owned by the manager. */
157 const region *
158 get_or_create_region_for_heap_alloc (const bitmap &base_regs_in_use);
159 const region *create_region_for_alloca (const frame_region *frame);
160
161 void log_stats (logger *logger, bool show_objs) const;
162
163 void begin_checking_feasibility (void) { m_checking_feasibility = true; }
164 void end_checking_feasibility (void) { m_checking_feasibility = false; }
165
166 logger *get_logger () const { return m_logger; }
167
168 void dump_untracked_regions () const;
169
170 private:
171 bool too_complex_p (const complexity &c) const;
172 bool reject_if_too_complex (svalue *sval);
173
174 const svalue *maybe_fold_unaryop (tree type, enum tree_code op,
175 const svalue *arg);
176 const svalue *maybe_fold_binop (tree type, enum tree_code op,
177 const svalue *arg0, const svalue *arg1);
178 const svalue *maybe_fold_sub_svalue (tree type,
179 const svalue *parent_svalue,
180 const region *subregion);
181 const svalue *maybe_fold_repeated_svalue (tree type,
182 const svalue *outer_size,
183 const svalue *inner_svalue);
184 const svalue *maybe_fold_bits_within_svalue (tree type,
185 const bit_range &bits,
186 const svalue *inner_svalue);
187 const svalue *maybe_undo_optimize_bit_field_compare (tree type,
188 const compound_svalue *compound_sval,
189 tree cst, const svalue *arg1);
190 const svalue *maybe_fold_asm_output_svalue (tree type,
191 const vec<const svalue *> &inputs);
192
193 logger *m_logger;
194
195 const call_string m_empty_call_string;
196
197 unsigned m_next_region_id;
198 root_region m_root_region;
199 stack_region m_stack_region;
200 heap_region m_heap_region;
201
202 /* svalue consolidation. */
203 typedef hash_map<tree, constant_svalue *> constants_map_t;
204 constants_map_t m_constants_map;
205
206 typedef hash_map<tree, unknown_svalue *> unknowns_map_t;
207 unknowns_map_t m_unknowns_map;
208 const unknown_svalue *m_unknown_NULL;
209
210 typedef hash_map<poisoned_svalue::key_t,
211 poisoned_svalue *> poisoned_values_map_t;
212 poisoned_values_map_t m_poisoned_values_map;
213
214 typedef hash_map<setjmp_svalue::key_t,
215 setjmp_svalue *> setjmp_values_map_t;
216 setjmp_values_map_t m_setjmp_values_map;
217
218 typedef hash_map<const region *, initial_svalue *> initial_values_map_t;
219 initial_values_map_t m_initial_values_map;
220
221 typedef hash_map<region_svalue::key_t, region_svalue *> pointer_values_map_t;
222 pointer_values_map_t m_pointer_values_map;
223
224 typedef hash_map<unaryop_svalue::key_t,
225 unaryop_svalue *> unaryop_values_map_t;
226 unaryop_values_map_t m_unaryop_values_map;
227
228 typedef hash_map<binop_svalue::key_t, binop_svalue *> binop_values_map_t;
229 binop_values_map_t m_binop_values_map;
230
231 typedef hash_map<sub_svalue::key_t, sub_svalue *> sub_values_map_t;
232 sub_values_map_t m_sub_values_map;
233
234 typedef hash_map<repeated_svalue::key_t,
235 repeated_svalue *> repeated_values_map_t;
236 repeated_values_map_t m_repeated_values_map;
237
238 typedef hash_map<bits_within_svalue::key_t,
239 bits_within_svalue *> bits_within_values_map_t;
240 bits_within_values_map_t m_bits_within_values_map;
241
242 typedef hash_map<const svalue *,
243 unmergeable_svalue *> unmergeable_values_map_t;
244 unmergeable_values_map_t m_unmergeable_values_map;
245
246 typedef hash_map<widening_svalue::key_t,
247 widening_svalue */*,
248 widening_svalue::key_t::hash_map_traits*/>
249 widening_values_map_t;
250 widening_values_map_t m_widening_values_map;
251
252 typedef hash_map<compound_svalue::key_t,
253 compound_svalue *> compound_values_map_t;
254 compound_values_map_t m_compound_values_map;
255
256 typedef hash_map<conjured_svalue::key_t,
257 conjured_svalue *> conjured_values_map_t;
258 conjured_values_map_t m_conjured_values_map;
259
260 typedef hash_map<asm_output_svalue::key_t,
261 asm_output_svalue *> asm_output_values_map_t;
262 asm_output_values_map_t m_asm_output_values_map;
263
264 typedef hash_map<const_fn_result_svalue::key_t,
265 const_fn_result_svalue *> const_fn_result_values_map_t;
266 const_fn_result_values_map_t m_const_fn_result_values_map;
267
268 bool m_checking_feasibility;
269
270 /* "Dynamically-allocated" svalue instances.
271 The number of these within the analysis can grow arbitrarily.
272 They are still owned by the manager. */
273 auto_delete_vec<svalue> m_managed_dynamic_svalues;
274
275 /* Maximum complexity of svalues that weren't rejected. */
276 complexity m_max_complexity;
277
278 /* region consolidation. */
279
280 code_region m_code_region;
281 typedef hash_map<tree, function_region *> fndecls_map_t;
282 typedef fndecls_map_t::iterator fndecls_iterator_t;
283 fndecls_map_t m_fndecls_map;
284
285 typedef hash_map<tree, label_region *> labels_map_t;
286 typedef labels_map_t::iterator labels_iterator_t;
287 labels_map_t m_labels_map;
288
289 globals_region m_globals_region;
290 typedef hash_map<tree, decl_region *> globals_map_t;
291 typedef globals_map_t::iterator globals_iterator_t;
292 globals_map_t m_globals_map;
293
294 thread_local_region m_thread_local_region;
295 errno_region m_errno_region;
296
297 consolidation_map<field_region> m_field_regions;
298 consolidation_map<element_region> m_element_regions;
299 consolidation_map<offset_region> m_offset_regions;
300 consolidation_map<sized_region> m_sized_regions;
301 consolidation_map<cast_region> m_cast_regions;
302 consolidation_map<frame_region> m_frame_regions;
303 consolidation_map<symbolic_region> m_symbolic_regions;
304
305 typedef hash_map<tree, string_region *> string_map_t;
306 string_map_t m_string_map;
307
308 consolidation_map<bit_range_region> m_bit_range_regions;
309 consolidation_map<var_arg_region> m_var_arg_regions;
310
311 store_manager m_store_mgr;
312
313 bounded_ranges_manager *m_range_mgr;
314
315 known_function_manager m_known_fn_mgr;
316
317 /* "Dynamically-allocated" region instances.
318 The number of these within the analysis can grow arbitrarily.
319 They are still owned by the manager. */
320 auto_delete_vec<region> m_managed_dynamic_regions;
321 };
322
323 } // namespace ana
324
325 #endif /* GCC_ANALYZER_REGION_MODEL_MANAGER_H */