Branch data Line data Source code
1 : : // Copyright (C) 2020-2025 Free Software Foundation, Inc.
2 : :
3 : : // This file is part of GCC.
4 : :
5 : : // GCC is free software; you can redistribute it and/or modify it under
6 : : // the terms of the GNU General Public License as published by the Free
7 : : // Software Foundation; either version 3, or (at your option) any later
8 : : // version.
9 : :
10 : : // GCC is distributed in the hope that it will be useful, but WITHOUT ANY
11 : : // WARRANTY; without even the implied warranty of MERCHANTABILITY or
12 : : // FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
13 : : // for more details.
14 : :
15 : : // You should have received a copy of the GNU General Public License
16 : : // along with GCC; see the file COPYING3. If not see
17 : : // <http://www.gnu.org/licenses/>
18 : :
19 : : #ifndef RUST_BIR_FREE_REGION_H
20 : : #define RUST_BIR_FREE_REGION_H
21 : :
22 : : #include "rust-diagnostics.h"
23 : : #include "polonius/rust-polonius-ffi.h"
24 : :
25 : : namespace Rust {
26 : :
27 : : using FreeRegion = size_t;
28 : :
29 : 0 : class FreeRegions
30 : : {
31 : : std::vector<FreeRegion> regions;
32 : :
33 : : public:
34 : : WARN_UNUSED_RESULT bool has_regions () const { return !regions.empty (); }
35 : 0 : decltype (regions)::const_iterator begin () const { return regions.begin (); }
36 : 0 : decltype (regions)::const_iterator end () const { return regions.end (); }
37 : 0 : size_t size () const { return regions.size (); }
38 : 0 : FreeRegion &operator[] (size_t i) { return regions.at (i); }
39 : 0 : const FreeRegion &operator[] (size_t i) const { return regions.at (i); }
40 : : const std::vector<FreeRegion> &get_regions () const { return regions; }
41 : 0 : void set_from (std::vector<Rust::Polonius::Origin> &®ions)
42 : : {
43 : 0 : this->regions.clear ();
44 : 0 : for (auto ®ion : regions)
45 : : {
46 : 0 : this->regions.push_back ({region});
47 : : }
48 : 0 : }
49 : :
50 : 0 : WARN_UNUSED_RESULT FreeRegions prepend (FreeRegion region) const
51 : : {
52 : 0 : std::vector<FreeRegion> new_regions = {region};
53 : 0 : new_regions.insert (new_regions.end (), regions.begin (), regions.end ());
54 : 0 : return FreeRegions (std::move (new_regions));
55 : 0 : }
56 : :
57 : 0 : FreeRegions (std::vector<FreeRegion> &®ions) : regions (regions) {}
58 : :
59 : 0 : WARN_UNUSED_RESULT std::string to_string () const
60 : : {
61 : 0 : std::stringstream result;
62 : 0 : for (auto ®ion : regions)
63 : : {
64 : 0 : result << region;
65 : 0 : result << ", ";
66 : : }
67 : : // Remove the last ", " from the string.
68 : 0 : if (result.tellg () > 2)
69 : 0 : result.seekp (-2, std::ios_base::cur);
70 : :
71 : 0 : return result.str ();
72 : 0 : }
73 : : };
74 : :
75 : : class RegionBinder
76 : : {
77 : : FreeRegion &next_free_region;
78 : :
79 : : public:
80 : 0 : explicit RegionBinder (FreeRegion &next_free_region)
81 : 0 : : next_free_region (next_free_region)
82 : : {}
83 : :
84 : 0 : WARN_UNUSED_RESULT FreeRegion get_next_free_region () const
85 : : {
86 : 0 : return next_free_region++;
87 : : }
88 : :
89 : 0 : FreeRegions bind_regions (std::vector<TyTy::Region> regions,
90 : : FreeRegions parent_free_regions)
91 : : {
92 : 0 : std::vector<FreeRegion> free_regions;
93 : 0 : for (auto ®ion : regions)
94 : : {
95 : 0 : if (region.is_early_bound ())
96 : 0 : free_regions.push_back (parent_free_regions[region.get_index ()]);
97 : 0 : else if (region.is_static ())
98 : 0 : free_regions.push_back (0);
99 : 0 : else if (region.is_anonymous ())
100 : 0 : free_regions.push_back (get_next_free_region ());
101 : 0 : else if (region.is_named ())
102 : 0 : rust_unreachable (); // FIXME
103 : : else
104 : : {
105 : 0 : rust_sorry_at (UNKNOWN_LOCATION, "Unimplemented");
106 : 0 : rust_unreachable ();
107 : : }
108 : : }
109 : : // This is necesarry because of clash of current gcc and gcc4.8.
110 : 0 : FreeRegions free_regions_final{std::move (free_regions)};
111 : 0 : return free_regions_final;
112 : 0 : }
113 : : };
114 : :
115 : : } // namespace Rust
116 : :
117 : : #endif // RUST_BIR_FREE_REGION_H
|