Branch data Line data Source code
1 : : /* Symbolic offsets and ranges.
2 : : Copyright (C) 2023-2024 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_RANGES_H
22 : : #define GCC_ANALYZER_RANGES_H
23 : :
24 : : namespace ana {
25 : :
26 : : /* Wrapper around an svalue for a value measured in bytes. */
27 : :
28 : : class symbolic_byte_offset
29 : : {
30 : : public:
31 : : explicit symbolic_byte_offset (int i, region_model_manager &mgr);
32 : : symbolic_byte_offset (const svalue *num_bytes_sval);
33 : : explicit symbolic_byte_offset (region_offset offset,
34 : : region_model_manager &mgr);
35 : :
36 : 736 : const svalue *get_svalue () const { return m_num_bytes_sval; }
37 : : tree maybe_get_constant () const;
38 : :
39 : : void dump_to_pp (pretty_printer *pp, bool) const;
40 : : void dump (bool) const;
41 : :
42 : : std::unique_ptr<json::value> to_json () const;
43 : :
44 : 20 : bool operator== (const symbolic_byte_offset &other) const
45 : : {
46 : 8 : return m_num_bytes_sval == other.m_num_bytes_sval;
47 : : }
48 : :
49 : : private:
50 : : const svalue *m_num_bytes_sval;
51 : : };
52 : :
53 : : /* A range of byte offsets, where both the start and size of the
54 : : range can be symbolic. */
55 : :
56 : : class symbolic_byte_range
57 : : {
58 : : public:
59 : 32 : symbolic_byte_range (symbolic_byte_offset start,
60 : : symbolic_byte_offset size)
61 : 32 : : m_start (start),
62 : 16 : m_size (size)
63 : : {
64 : : }
65 : :
66 : : symbolic_byte_range (region_offset start,
67 : : const svalue *num_bytes,
68 : : region_model_manager &mgr);
69 : :
70 : : void dump_to_pp (pretty_printer *pp,
71 : : bool simple,
72 : : region_model_manager &mgr) const;
73 : : void dump (bool, region_model_manager &mgr) const;
74 : :
75 : : std::unique_ptr<json::value> to_json () const;
76 : :
77 : : bool empty_p () const;
78 : :
79 : 4 : symbolic_byte_offset get_start_byte_offset () const
80 : : {
81 : 4 : return m_start;
82 : : }
83 : : symbolic_byte_offset get_last_byte_offset (region_model_manager &mgr) const;
84 : 8 : symbolic_byte_offset get_size_in_bytes () const
85 : : {
86 : 8 : return m_size;
87 : : }
88 : : symbolic_byte_offset get_next_byte_offset (region_model_manager &mgr) const;
89 : :
90 : : tristate intersection (const symbolic_byte_range &other,
91 : : const region_model &model) const;
92 : :
93 : : private:
94 : : symbolic_byte_offset m_start;
95 : : symbolic_byte_offset m_size;
96 : : };
97 : :
98 : : } // namespace ana
99 : :
100 : : #endif /* GCC_ANALYZER_RANGES_H */
|