analyzer: start adding support for errno
[platform/upstream/gcc.git] / gcc / analyzer / region-model-manager.h
1 /* Consolidation of svalues and regions.
2    Copyright (C) 2020-2022 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_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 *
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 *
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   }
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,
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
167 private:
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
291   thread_local_region m_thread_local_region;
292   errno_region m_errno_region;
293
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 */