Movatterモバイル変換


[0]ホーム

URL:


LLVM 20.0.0git
AddressRanges.h
Go to the documentation of this file.
1//===- AddressRanges.h ------------------------------------------*- C++ -*-===//
2//
3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6//
7//===----------------------------------------------------------------------===//
8
9#ifndef LLVM_ADT_ADDRESSRANGES_H
10#define LLVM_ADT_ADDRESSRANGES_H
11
12#include "llvm/ADT/STLExtras.h"
13#include "llvm/ADT/SmallVector.h"
14#include <cassert>
15#include <optional>
16#include <stdint.h>
17
18namespacellvm {
19
20/// A class that represents an address range. The range is specified using
21/// a start and an end address: [Start, End).
22classAddressRange {
23public:
24AddressRange() {}
25AddressRange(uint64_t S,uint64_tE) : Start(S), End(E) {
26assert(Start <= End);
27 }
28uint64_tstart() const{return Start; }
29uint64_tend() const{return End; }
30uint64_tsize() const{return End - Start; }
31uint64_tempty() const{returnsize() == 0; }
32boolcontains(uint64_tAddr) const{return Start <=Addr &&Addr < End; }
33boolcontains(constAddressRange &R) const{
34return Start <= R.Start && R.End <= End;
35 }
36boolintersects(constAddressRange &R) const{
37return Start < R.End && R.Start < End;
38 }
39booloperator==(constAddressRange &R) const{
40return Start == R.Start && End == R.End;
41 }
42booloperator!=(constAddressRange &R) const{return !(*this == R); }
43booloperator<(constAddressRange &R) const{
44return std::make_pair(Start, End) < std::make_pair(R.Start, R.End);
45 }
46
47private:
48uint64_t Start = 0;
49uint64_t End = 0;
50};
51
52/// The AddressRangesBase class presents the base functionality for the
53/// normalized address ranges collection. This class keeps a sorted vector
54/// of AddressRange-like objects and can perform searches efficiently.
55/// The address ranges are always sorted and never contain any invalid,
56/// empty or intersected address ranges.
57
58template <typename T>classAddressRangesBase {
59protected:
60usingCollection =SmallVector<T>;
61CollectionRanges;
62
63public:
64voidclear() {Ranges.clear(); }
65boolempty() const{returnRanges.empty(); }
66boolcontains(uint64_tAddr) const{
67returnfind(Addr,Addr + 1) !=Ranges.end();
68 }
69boolcontains(AddressRangeRange) const{
70returnfind(Range.start(),Range.end()) !=Ranges.end();
71 }
72voidreserve(size_t Capacity) {Ranges.reserve(Capacity); }
73size_tsize() const{returnRanges.size(); }
74
75 std::optional<T>getRangeThatContains(uint64_tAddr) const{
76typename Collection::const_iterator It =find(Addr,Addr + 1);
77if (It ==Ranges.end())
78return std::nullopt;
79
80return *It;
81 }
82
83typename Collection::const_iteratorbegin() const{returnRanges.begin(); }
84typename Collection::const_iteratorend() const{returnRanges.end(); }
85
86constT &operator[](size_t i) const{
87assert(i <Ranges.size());
88returnRanges[i];
89 }
90
91booloperator==(constAddressRangesBase<T> &RHS) const{
92returnRanges ==RHS.Ranges;
93 }
94
95protected:
96typename Collection::const_iteratorfind(uint64_t Start,uint64_tEnd) const{
97if (Start >=End)
98returnRanges.end();
99
100auto It =
101 std::partition_point(Ranges.begin(),Ranges.end(), [=](constT &R) {
102 return AddressRange(R).start() <= Start;
103 });
104
105if (It ==Ranges.begin())
106returnRanges.end();
107
108 --It;
109if (End >AddressRange(*It).end())
110returnRanges.end();
111
112return It;
113 }
114};
115
116/// The AddressRanges class helps normalize address range collections.
117/// This class keeps a sorted vector of AddressRange objects and can perform
118/// insertions and searches efficiently. Intersecting([100,200), [150,300))
119/// and adjacent([100,200), [200,300)) address ranges are combined during
120/// insertion.
121classAddressRanges :publicAddressRangesBase<AddressRange> {
122public:
123Collection::const_iteratorinsert(AddressRangeRange) {
124if (Range.empty())
125returnRanges.end();
126
127auto It =llvm::upper_bound(Ranges,Range);
128auto It2 = It;
129while (It2 !=Ranges.end() && It2->start() <=Range.end())
130 ++It2;
131if (It != It2) {
132Range = {Range.start(), std::max(Range.end(), std::prev(It2)->end())};
133 It =Ranges.erase(It, It2);
134 }
135if (It !=Ranges.begin() &&Range.start() <= std::prev(It)->end()) {
136 --It;
137 *It = {It->start(), std::max(It->end(),Range.end())};
138return It;
139 }
140
141returnRanges.insert(It,Range);
142 }
143};
144
145classAddressRangeValuePair {
146public:
147operatorAddressRange() const{returnRange; }
148
149AddressRangeRange;
150 int64_tValue = 0;
151};
152
153inlinebooloperator==(constAddressRangeValuePair &LHS,
154constAddressRangeValuePair &RHS) {
155returnLHS.Range ==RHS.Range &&LHS.Value ==RHS.Value;
156}
157
158/// AddressRangesMap class maps values to the address ranges.
159/// It keeps normalized address ranges and corresponding values.
160/// This class keeps a sorted vector of AddressRangeValuePair objects
161/// and can perform insertions and searches efficiently.
162/// Intersecting([100,200), [150,300)) ranges splitted into non-conflicting
163/// parts([100,200), [200,300)). Adjacent([100,200), [200,300)) address
164/// ranges are not combined during insertion.
165classAddressRangesMap :publicAddressRangesBase<AddressRangeValuePair> {
166public:
167voidinsert(AddressRangeRange, int64_tValue) {
168if (Range.empty())
169return;
170
171// Search for range which is less than or equal incoming Range.
172auto It = std::partition_point(Ranges.begin(),Ranges.end(),
173 [=](constAddressRangeValuePair &R) {
174 return R.Range.start() <= Range.start();
175 });
176
177if (It !=Ranges.begin())
178 It--;
179
180while (!Range.empty()) {
181// Inserted range does not overlap with any range.
182// Store it into the Ranges collection.
183if (It ==Ranges.end() ||Range.end() <= It->Range.start()) {
184Ranges.insert(It, {Range,Value});
185return;
186 }
187
188// Inserted range partially overlaps with current range.
189// Store not overlapped part of inserted range.
190if (Range.start() < It->Range.start()) {
191 It =Ranges.insert(It, {{Range.start(), It->Range.start()},Value});
192 It++;
193Range = {It->Range.start(),Range.end()};
194continue;
195 }
196
197// Inserted range fully overlaps with current range.
198if (Range.end() <= It->Range.end())
199return;
200
201// Inserted range partially overlaps with current range.
202// Remove overlapped part from the inserted range.
203if (Range.start() < It->Range.end())
204Range = {It->Range.end(),Range.end()};
205
206 It++;
207 }
208 }
209};
210
211}// namespace llvm
212
213#endif// LLVM_ADT_ADDRESSRANGES_H
E
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
Addr
uint64_t Addr
Definition:ELFObjHandler.cpp:79
End
bool End
Definition:ELF_riscv.cpp:480
Range
ConstantRange Range(APInt(BitWidth, Low), APInt(BitWidth, High))
assert
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
STLExtras.h
This file contains some templates that are useful if you are working with the STL at all.
SmallVector.h
This file defines the SmallVector class.
RHS
Value * RHS
Definition:X86PartialReduction.cpp:74
LHS
Value * LHS
Definition:X86PartialReduction.cpp:73
T
llvm::AddressRangeValuePair
Definition:AddressRanges.h:145
llvm::AddressRangeValuePair::Range
AddressRange Range
Definition:AddressRanges.h:149
llvm::AddressRange
A class that represents an address range.
Definition:AddressRanges.h:22
llvm::AddressRange::AddressRange
AddressRange(uint64_t S, uint64_t E)
Definition:AddressRanges.h:25
llvm::AddressRange::start
uint64_t start() const
Definition:AddressRanges.h:28
llvm::AddressRange::operator<
bool operator<(const AddressRange &R) const
Definition:AddressRanges.h:43
llvm::AddressRange::empty
uint64_t empty() const
Definition:AddressRanges.h:31
llvm::AddressRange::end
uint64_t end() const
Definition:AddressRanges.h:29
llvm::AddressRange::contains
bool contains(const AddressRange &R) const
Definition:AddressRanges.h:33
llvm::AddressRange::intersects
bool intersects(const AddressRange &R) const
Definition:AddressRanges.h:36
llvm::AddressRange::operator!=
bool operator!=(const AddressRange &R) const
Definition:AddressRanges.h:42
llvm::AddressRange::AddressRange
AddressRange()
Definition:AddressRanges.h:24
llvm::AddressRange::contains
bool contains(uint64_t Addr) const
Definition:AddressRanges.h:32
llvm::AddressRange::operator==
bool operator==(const AddressRange &R) const
Definition:AddressRanges.h:39
llvm::AddressRange::size
uint64_t size() const
Definition:AddressRanges.h:30
llvm::AddressRangesBase
The AddressRangesBase class presents the base functionality for the normalized address ranges collect...
Definition:AddressRanges.h:58
llvm::AddressRangesBase::operator[]
const T & operator[](size_t i) const
Definition:AddressRanges.h:86
llvm::AddressRangesBase::reserve
void reserve(size_t Capacity)
Definition:AddressRanges.h:72
llvm::AddressRangesBase::contains
bool contains(uint64_t Addr) const
Definition:AddressRanges.h:66
llvm::AddressRangesBase::operator==
bool operator==(const AddressRangesBase< T > &RHS) const
Definition:AddressRanges.h:91
llvm::AddressRangesBase::Ranges
Collection Ranges
Definition:AddressRanges.h:61
llvm::AddressRangesBase::clear
void clear()
Definition:AddressRanges.h:64
llvm::AddressRangesBase::Collection
SmallVector< T > Collection
Definition:AddressRanges.h:60
llvm::AddressRangesBase::find
Collection::const_iterator find(uint64_t Start, uint64_t End) const
Definition:AddressRanges.h:96
llvm::AddressRangesBase::getRangeThatContains
std::optional< T > getRangeThatContains(uint64_t Addr) const
Definition:AddressRanges.h:75
llvm::AddressRangesBase::empty
bool empty() const
Definition:AddressRanges.h:65
llvm::AddressRangesBase::contains
bool contains(AddressRange Range) const
Definition:AddressRanges.h:69
llvm::AddressRangesBase::end
Collection::const_iterator end() const
Definition:AddressRanges.h:84
llvm::AddressRangesBase::begin
Collection::const_iterator begin() const
Definition:AddressRanges.h:83
llvm::AddressRangesBase::size
size_t size() const
Definition:AddressRanges.h:73
llvm::AddressRangesMap
AddressRangesMap class maps values to the address ranges.
Definition:AddressRanges.h:165
llvm::AddressRangesMap::insert
void insert(AddressRange Range, int64_t Value)
Definition:AddressRanges.h:167
llvm::AddressRanges
The AddressRanges class helps normalize address range collections.
Definition:AddressRanges.h:121
llvm::AddressRanges::insert
Collection::const_iterator insert(AddressRange Range)
Definition:AddressRanges.h:123
llvm::SmallVectorImpl::erase
iterator erase(const_iterator CI)
Definition:SmallVector.h:737
llvm::SmallVectorImpl::insert
iterator insert(iterator I, T &&Elt)
Definition:SmallVector.h:805
llvm::SmallVectorTemplateCommon::end
iterator end()
Definition:SmallVector.h:269
llvm::SmallVectorTemplateCommon::begin
iterator begin()
Definition:SmallVector.h:267
llvm::SmallVector
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Definition:SmallVector.h:1196
llvm::Value
LLVM Value Representation.
Definition:Value.h:74
llvm::Value::Value
Value(Type *Ty, unsigned scid)
Definition:Value.cpp:53
uint64_t
llvm
This is an optimization pass for GlobalISel generic memory operations.
Definition:AddressRanges.h:18
llvm::upper_bound
auto upper_bound(R &&Range, T &&Value)
Provide wrappers to std::upper_bound which take ranges instead of having to pass begin/end explicitly...
Definition:STLExtras.h:1991
llvm::operator==
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
Definition:AddressRanges.h:153

Generated on Thu Jul 17 2025 03:51:50 for LLVM by doxygen 1.9.6
[8]ページ先頭

©2009-2025 Movatter.jp