Branch data Line data Source code
1 : : /* Support routines for vrange storage.
2 : : Copyright (C) 2022-2024 Free Software Foundation, Inc.
3 : : Contributed by Aldy Hernandez <aldyh@redhat.com>.
4 : :
5 : : This file is part of GCC.
6 : :
7 : : GCC is free software; you can redistribute it and/or modify
8 : : it 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,
13 : : but WITHOUT ANY WARRANTY; without even the implied warranty of
14 : : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 : : GNU 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_VALUE_RANGE_STORAGE_H
22 : : #define GCC_VALUE_RANGE_STORAGE_H
23 : :
24 : : // This class is used to allocate chunks of memory that can store
25 : : // ranges as memory efficiently as possible.
26 : :
27 : : class vrange_allocator
28 : : {
29 : : public:
30 : : // Use GC memory when GC is true, otherwise use obstacks.
31 : : vrange_allocator (bool gc = false);
32 : : ~vrange_allocator ();
33 : : class vrange_storage *clone (const vrange &r);
34 : : vrange_storage *clone_varying (tree type);
35 : : vrange_storage *clone_undefined (tree type);
36 : : void *alloc (size_t size);
37 : : void free (void *);
38 : : private:
39 : : DISABLE_COPY_AND_ASSIGN (vrange_allocator);
40 : : class vrange_internal_alloc *m_alloc;
41 : : };
42 : :
43 : : // Efficient memory storage for a vrange.
44 : : //
45 : : // The GTY marker here does nothing but get gengtype to generate the
46 : : // ggc_test_and_set_mark calls. We ignore the derived classes, since
47 : : // they don't contain any pointers.
48 : :
49 : : class GTY(()) vrange_storage
50 : : {
51 : : public:
52 : : static vrange_storage *alloc (vrange_internal_alloc &, const vrange &);
53 : : void get_vrange (vrange &r, tree type) const;
54 : : void set_vrange (const vrange &r);
55 : : bool fits_p (const vrange &r) const;
56 : : bool equal_p (const vrange &r) const;
57 : : protected:
58 : : // Stack initialization disallowed.
59 : 276461868 : vrange_storage () { }
60 : : };
61 : :
62 : : // Efficient memory storage for an irange.
63 : :
64 : : class irange_storage : public vrange_storage
65 : : {
66 : : public:
67 : : static irange_storage *alloc (vrange_internal_alloc &, const irange &);
68 : : void set_irange (const irange &r);
69 : : void get_irange (irange &r, tree type) const;
70 : : bool equal_p (const irange &r) const;
71 : : bool fits_p (const irange &r) const;
72 : : void dump () const;
73 : : private:
74 : : DISABLE_COPY_AND_ASSIGN (irange_storage);
75 : : static size_t size (const irange &r);
76 : : const unsigned short *lengths_address () const;
77 : : unsigned short *write_lengths_address ();
78 : : friend void gt_ggc_mx_irange_storage (void *);
79 : : friend void gt_pch_p_14irange_storage (void *, void *,
80 : : gt_pointer_operator, void *);
81 : : friend void gt_pch_nx_irange_storage (void *);
82 : :
83 : : // The shared precision of each number.
84 : : unsigned short m_precision;
85 : :
86 : : // The max number of sub-ranges that fit in this storage.
87 : : const unsigned char m_max_ranges;
88 : :
89 : : // The number of stored sub-ranges.
90 : : unsigned char m_num_ranges;
91 : :
92 : : enum value_range_kind m_kind : 3;
93 : :
94 : : // The length of this is m_num_ranges * 2 + 2 to accomodate the bitmask.
95 : : HOST_WIDE_INT m_val[1];
96 : :
97 : : // Another variable-length part of the structure following the HWIs.
98 : : // This is the length of each wide_int in m_val.
99 : : //
100 : : // unsigned short m_len[];
101 : :
102 : : irange_storage (const irange &r);
103 : : };
104 : :
105 : : // Efficient memory storage for an frange.
106 : :
107 : : class frange_storage : public vrange_storage
108 : : {
109 : : public:
110 : : static frange_storage *alloc (vrange_internal_alloc &, const frange &r);
111 : : void set_frange (const frange &r);
112 : : void get_frange (frange &r, tree type) const;
113 : : bool equal_p (const frange &r) const;
114 : : bool fits_p (const frange &) const;
115 : : private:
116 : 11255520 : frange_storage (const frange &r) { set_frange (r); }
117 : : DISABLE_COPY_AND_ASSIGN (frange_storage);
118 : :
119 : : enum value_range_kind m_kind;
120 : : REAL_VALUE_TYPE m_min;
121 : : REAL_VALUE_TYPE m_max;
122 : : bool m_pos_nan;
123 : : bool m_neg_nan;
124 : : };
125 : :
126 : : extern vrange_storage *ggc_alloc_vrange_storage (tree type);
127 : : extern vrange_storage *ggc_alloc_vrange_storage (const vrange &);
128 : :
129 : : #endif // GCC_VALUE_RANGE_STORAGE_H
|