LLVM: include/llvm/ADT/AddressRanges.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9#ifndef LLVM_ADT_ADDRESSRANGES_H
10#define LLVM_ADT_ADDRESSRANGES_H
11
14#include
15#include
16#include <stdint.h>
17
19
20
21
23public:
32 bool contains(uint64_t Addr) const { return Start <= Addr && Addr < End; }
34 return Start <= R.Start && R.End <= End;
35 }
37 return Start < R.End && R.Start < End;
38 }
40 return Start == R.Start && End == R.End;
41 }
44 return std::make_pair(Start, End) < std::make_pair(R.Start, R.End);
45 }
46
47private:
50};
51
52
53
54
55
56
57
59protected:
62
63public:
67 return find(Addr, Addr + 1) != Ranges.end();
68 }
72 void reserve(size_t Capacity) { Ranges.reserve(Capacity); }
74
76 typename Collection::const_iterator It = find(Addr, Addr + 1);
77 if (It == Ranges.end())
78 return std::nullopt;
79
80 return *It;
81 }
82
83 typename Collection::const_iterator begin() const { return Ranges.begin(); }
84 typename Collection::const_iterator end() const { return Ranges.end(); }
85
90
94
95protected:
97 if (Start >= End)
99
102
103 if (It == Ranges.begin())
105
106 --It;
109
110 return It;
111 }
112};
113
114
115
116
117
118
120public:
122 if (Range.empty())
124
126 auto It2 = It;
127 while (It2 != Ranges.end() && It2->start() <= Range.end())
128 ++It2;
129 if (It != It2) {
130 Range = {Range.start(), std::max(Range.end(), std::prev(It2)->end())};
131 It = Ranges.erase(It, It2);
132 }
133 if (It != Ranges.begin() && Range.start() <= std::prev(It)->end()) {
134 --It;
135 *It = {It->start(), std::max(It->end(), Range.end())};
136 return It;
137 }
138
140 }
141};
142
150
153 return LHS.Range == RHS.Range && LHS.Value == RHS.Value;
154}
155
156
157
158
159
160
161
162
164public:
166 if (Range.empty())
167 return;
168
169
170 auto It =
172 return R.Range.start() <= Range.start();
173 });
174
175 if (It != Ranges.begin())
176 It--;
177
178 while (.empty()) {
179
180
181 if (It == Ranges.end() || Range.end() <= It->Range.start()) {
183 return;
184 }
185
186
187
188 if (Range.start() < It->Range.start()) {
189 It = Ranges.insert(It, {{Range.start(), It->Range.start()}, Value});
190 It++;
191 Range = {It->Range.start(), Range.end()};
192 continue;
193 }
194
195
196 if (Range.end() <= It->Range.end())
197 return;
198
199
200
201 if (Range.start() < It->Range.end())
202 Range = {It->Range.end(), Range.end()};
203
204 It++;
205 }
206 }
207};
208
209}
210
211#endif
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
This file defines the SmallVector class.
Definition AddressRanges.h:143
AddressRange Range
Definition AddressRanges.h:147
int64_t Value
Definition AddressRanges.h:148
A class that represents an address range.
Definition AddressRanges.h:22
AddressRange(uint64_t S, uint64_t E)
Definition AddressRanges.h:25
uint64_t start() const
Definition AddressRanges.h:28
bool operator<(const AddressRange &R) const
Definition AddressRanges.h:43
uint64_t empty() const
Definition AddressRanges.h:31
uint64_t end() const
Definition AddressRanges.h:29
bool contains(const AddressRange &R) const
Definition AddressRanges.h:33
bool intersects(const AddressRange &R) const
Definition AddressRanges.h:36
bool operator!=(const AddressRange &R) const
Definition AddressRanges.h:42
bool contains(uint64_t Addr) const
Definition AddressRanges.h:32
bool operator==(const AddressRange &R) const
Definition AddressRanges.h:39
uint64_t size() const
Definition AddressRanges.h:30
The AddressRangesBase class presents the base functionality for the normalized address ranges collect...
Definition AddressRanges.h:58
void reserve(size_t Capacity)
Definition AddressRanges.h:72
bool contains(uint64_t Addr) const
Definition AddressRanges.h:66
Collection Ranges
Definition AddressRanges.h:61
void clear()
Definition AddressRanges.h:64
SmallVector< T > Collection
Definition AddressRanges.h:60
Collection::const_iterator find(uint64_t Start, uint64_t End) const
Definition AddressRanges.h:96
const T & operator[](size_t I) const
Definition AddressRanges.h:86
std::optional< T > getRangeThatContains(uint64_t Addr) const
Definition AddressRanges.h:75
bool empty() const
Definition AddressRanges.h:65
bool contains(AddressRange Range) const
Definition AddressRanges.h:69
Collection::const_iterator end() const
Definition AddressRanges.h:84
Collection::const_iterator begin() const
Definition AddressRanges.h:83
size_t size() const
Definition AddressRanges.h:73
bool operator==(const AddressRangesBase &RHS) const
Definition AddressRanges.h:91
AddressRangesMap class maps values to the address ranges.
Definition AddressRanges.h:163
void insert(AddressRange Range, int64_t Value)
Definition AddressRanges.h:165
The AddressRanges class helps normalize address range collections.
Definition AddressRanges.h:119
Collection::const_iterator insert(AddressRange Range)
Definition AddressRanges.h:121
typename SuperClass::const_iterator const_iterator
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
LLVM Value Representation.
This is an optimization pass for GlobalISel generic memory operations.
Definition AddressRanges.h:18
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
Definition AddressRanges.h:151