Line data Source code
1 : /* Symbolic offsets and ranges.
2 : Copyright (C) 2023-2026 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 */
|