1854c3394SAlexey Lapshin //===- llvm/unittest/Support/AddresRangeTest.cpp --------------------------===//
2854c3394SAlexey Lapshin //
3854c3394SAlexey Lapshin // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4854c3394SAlexey Lapshin // See https://llvm.org/LICENSE.txt for license information.
5854c3394SAlexey Lapshin // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6854c3394SAlexey Lapshin //
7854c3394SAlexey Lapshin //===----------------------------------------------------------------------===//
8854c3394SAlexey Lapshin
9854c3394SAlexey Lapshin #include "llvm/ADT/AddressRanges.h"
10854c3394SAlexey Lapshin #include "llvm/Testing/Support/Error.h"
11854c3394SAlexey Lapshin
12854c3394SAlexey Lapshin #include "gmock/gmock.h"
13854c3394SAlexey Lapshin #include "gtest/gtest.h"
14854c3394SAlexey Lapshin
15854c3394SAlexey Lapshin using namespace llvm;
16854c3394SAlexey Lapshin
TEST(AddressRangeTest,TestRanges)17854c3394SAlexey Lapshin TEST(AddressRangeTest, TestRanges) {
18854c3394SAlexey Lapshin // test llvm::AddressRange.
19854c3394SAlexey Lapshin const uint64_t StartAddr = 0x1000;
20854c3394SAlexey Lapshin const uint64_t EndAddr = 0x2000;
21854c3394SAlexey Lapshin // Verify constructor and API to ensure it takes start and end address.
22854c3394SAlexey Lapshin const AddressRange Range(StartAddr, EndAddr);
23854c3394SAlexey Lapshin EXPECT_EQ(Range.size(), EndAddr - StartAddr);
24854c3394SAlexey Lapshin
25854c3394SAlexey Lapshin // Verify llvm::AddressRange::contains().
26854c3394SAlexey Lapshin EXPECT_FALSE(Range.contains(0));
27854c3394SAlexey Lapshin EXPECT_FALSE(Range.contains(StartAddr - 1));
28854c3394SAlexey Lapshin EXPECT_TRUE(Range.contains(StartAddr));
29854c3394SAlexey Lapshin EXPECT_TRUE(Range.contains(EndAddr - 1));
30854c3394SAlexey Lapshin EXPECT_FALSE(Range.contains(EndAddr));
31854c3394SAlexey Lapshin EXPECT_FALSE(Range.contains(UINT64_MAX));
32854c3394SAlexey Lapshin
33854c3394SAlexey Lapshin const AddressRange RangeSame(StartAddr, EndAddr);
34854c3394SAlexey Lapshin const AddressRange RangeDifferentStart(StartAddr + 1, EndAddr);
35854c3394SAlexey Lapshin const AddressRange RangeDifferentEnd(StartAddr, EndAddr + 1);
36854c3394SAlexey Lapshin const AddressRange RangeDifferentStartEnd(StartAddr + 1, EndAddr + 1);
37854c3394SAlexey Lapshin // Test == and != with values that are the same
38854c3394SAlexey Lapshin EXPECT_EQ(Range, RangeSame);
39854c3394SAlexey Lapshin EXPECT_FALSE(Range != RangeSame);
40854c3394SAlexey Lapshin // Test == and != with values that are the different
41854c3394SAlexey Lapshin EXPECT_NE(Range, RangeDifferentStart);
42854c3394SAlexey Lapshin EXPECT_NE(Range, RangeDifferentEnd);
43854c3394SAlexey Lapshin EXPECT_NE(Range, RangeDifferentStartEnd);
44854c3394SAlexey Lapshin EXPECT_FALSE(Range == RangeDifferentStart);
45854c3394SAlexey Lapshin EXPECT_FALSE(Range == RangeDifferentEnd);
46854c3394SAlexey Lapshin EXPECT_FALSE(Range == RangeDifferentStartEnd);
47854c3394SAlexey Lapshin
48854c3394SAlexey Lapshin // Test "bool operator<(const AddressRange &, const AddressRange &)".
49854c3394SAlexey Lapshin EXPECT_FALSE(Range < RangeSame);
50854c3394SAlexey Lapshin EXPECT_FALSE(RangeSame < Range);
51854c3394SAlexey Lapshin EXPECT_LT(Range, RangeDifferentStart);
52854c3394SAlexey Lapshin EXPECT_LT(Range, RangeDifferentEnd);
53854c3394SAlexey Lapshin EXPECT_LT(Range, RangeDifferentStartEnd);
54854c3394SAlexey Lapshin // Test "bool operator<(const AddressRange &, uint64_t)"
55854c3394SAlexey Lapshin EXPECT_LT(Range.start(), StartAddr + 1);
56854c3394SAlexey Lapshin // Test "bool operator<(uint64_t, const AddressRange &)"
57854c3394SAlexey Lapshin EXPECT_LT(StartAddr - 1, Range.start());
58854c3394SAlexey Lapshin
59854c3394SAlexey Lapshin // Verify llvm::AddressRange::isContiguousWith() and
60854c3394SAlexey Lapshin // llvm::AddressRange::intersects().
61854c3394SAlexey Lapshin const AddressRange EndsBeforeRangeStart(0, StartAddr - 1);
62854c3394SAlexey Lapshin const AddressRange EndsAtRangeStart(0, StartAddr);
63854c3394SAlexey Lapshin const AddressRange OverlapsRangeStart(StartAddr - 1, StartAddr + 1);
64854c3394SAlexey Lapshin const AddressRange InsideRange(StartAddr + 1, EndAddr - 1);
65854c3394SAlexey Lapshin const AddressRange OverlapsRangeEnd(EndAddr - 1, EndAddr + 1);
66854c3394SAlexey Lapshin const AddressRange StartsAtRangeEnd(EndAddr, EndAddr + 0x100);
67854c3394SAlexey Lapshin const AddressRange StartsAfterRangeEnd(EndAddr + 1, EndAddr + 0x100);
68854c3394SAlexey Lapshin
69854c3394SAlexey Lapshin EXPECT_FALSE(Range.intersects(EndsBeforeRangeStart));
70854c3394SAlexey Lapshin EXPECT_FALSE(Range.intersects(EndsAtRangeStart));
71854c3394SAlexey Lapshin EXPECT_TRUE(Range.intersects(OverlapsRangeStart));
72854c3394SAlexey Lapshin EXPECT_TRUE(Range.intersects(InsideRange));
73854c3394SAlexey Lapshin EXPECT_TRUE(Range.intersects(OverlapsRangeEnd));
74854c3394SAlexey Lapshin EXPECT_FALSE(Range.intersects(StartsAtRangeEnd));
75854c3394SAlexey Lapshin EXPECT_FALSE(Range.intersects(StartsAfterRangeEnd));
76854c3394SAlexey Lapshin
77854c3394SAlexey Lapshin // Test the functions that maintain address ranges:
78854c3394SAlexey Lapshin // "bool AddressRange::contains(uint64_t Addr) const;"
79854c3394SAlexey Lapshin // "void AddressRanges::insert(const AddressRange &R);"
80854c3394SAlexey Lapshin AddressRanges Ranges;
81854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x2000));
82854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x2000, 0x3000));
83854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x4000, 0x5000));
84854c3394SAlexey Lapshin
85854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(0));
86854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(0x1000 - 1));
87854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x1000));
88854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x2000));
89854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x4000));
90854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x2000 - 1));
91854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x3000 - 1));
92854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(0x3000 + 1));
93854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x5000 - 1));
94854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(0x5000 + 1));
95854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(UINT64_MAX));
96854c3394SAlexey Lapshin
97854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange()));
98854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x1000 - 1, 0x1000)));
99854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x1000, 0x1000)));
100854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x1000 + 1)));
101854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2000)));
1028bb4451aSAlexey Lapshin EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2001)));
103854c3394SAlexey Lapshin EXPECT_TRUE(Ranges.contains(AddressRange(0x2000, 0x3000)));
104854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x2000, 0x3001)));
105854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x3000, 0x3001)));
106854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x1500, 0x4500)));
107854c3394SAlexey Lapshin EXPECT_FALSE(Ranges.contains(AddressRange(0x5000, 0x5001)));
108854c3394SAlexey Lapshin
109854c3394SAlexey Lapshin // Verify that intersecting ranges get combined
110854c3394SAlexey Lapshin Ranges.clear();
111854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x1100, 0x1F00));
112854c3394SAlexey Lapshin // Verify a wholy contained range that is added doesn't do anything.
113854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x1500, 0x1F00));
114854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
115854c3394SAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1100, 0x1F00));
116854c3394SAlexey Lapshin
117854c3394SAlexey Lapshin // Verify a range that starts before and intersects gets combined.
118854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x1000, Ranges[0].start() + 1));
119854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
120854c3394SAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x1F00));
121854c3394SAlexey Lapshin
122854c3394SAlexey Lapshin // Verify a range that starts inside and extends ranges gets combined.
123854c3394SAlexey Lapshin Ranges.insert(AddressRange(Ranges[0].end() - 1, 0x2000));
124854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
125854c3394SAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2000));
126854c3394SAlexey Lapshin
1278bb4451aSAlexey Lapshin // Verify that adjacent ranges get combined
1288bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x2000, 0x2fff));
1298bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
1308bb4451aSAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2fff));
1318bb4451aSAlexey Lapshin
1328bb4451aSAlexey Lapshin // Verify that ranges having 1 byte gap do not get combined
1338bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x3000, 0x4000));
134854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 2u);
1358bb4451aSAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x2fff));
1368bb4451aSAlexey Lapshin EXPECT_EQ(Ranges[1], AddressRange(0x3000, 0x4000));
1378bb4451aSAlexey Lapshin
138854c3394SAlexey Lapshin // Verify if we add an address range that intersects two ranges
139854c3394SAlexey Lapshin // that they get combined
140854c3394SAlexey Lapshin Ranges.insert(AddressRange(Ranges[0].end() - 1, Ranges[1].start() + 1));
141854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
1428bb4451aSAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x4000));
143854c3394SAlexey Lapshin
144854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x3000, 0x4000));
145854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x4000, 0x5000));
146854c3394SAlexey Lapshin Ranges.insert(AddressRange(0x2000, 0x4500));
147854c3394SAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
148854c3394SAlexey Lapshin EXPECT_EQ(Ranges[0], AddressRange(0x1000, 0x5000));
149854c3394SAlexey Lapshin }
1508bb4451aSAlexey Lapshin
TEST(AddressRangeTest,TestRangesRandom)151*1e72920cSAlexey Lapshin TEST(AddressRangeTest, TestRangesRandom) {
152*1e72920cSAlexey Lapshin AddressRanges Ranges;
153*1e72920cSAlexey Lapshin size_t NumElements = 100;
154*1e72920cSAlexey Lapshin
155*1e72920cSAlexey Lapshin std::srand(std::time(nullptr));
156*1e72920cSAlexey Lapshin
157*1e72920cSAlexey Lapshin // Fill ranges.
158*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx < NumElements; Idx++) {
159*1e72920cSAlexey Lapshin uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);
160*1e72920cSAlexey Lapshin uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);
161*1e72920cSAlexey Lapshin Ranges.insert({Start, End});
162*1e72920cSAlexey Lapshin }
163*1e72920cSAlexey Lapshin
164*1e72920cSAlexey Lapshin // Check ranges.
165*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {
166*1e72920cSAlexey Lapshin // Check that ranges are not intersected.
167*1e72920cSAlexey Lapshin EXPECT_FALSE(Ranges[Idx].intersects(Ranges[Idx + 1]));
168*1e72920cSAlexey Lapshin
169*1e72920cSAlexey Lapshin // Check that ranges are sorted and not adjusted.
170*1e72920cSAlexey Lapshin EXPECT_TRUE(Ranges[Idx].end() < Ranges[Idx + 1].start());
171*1e72920cSAlexey Lapshin }
172*1e72920cSAlexey Lapshin }
173*1e72920cSAlexey Lapshin
TEST(AddressRangeTest,TestRangesMap)1748bb4451aSAlexey Lapshin TEST(AddressRangeTest, TestRangesMap) {
175*1e72920cSAlexey Lapshin AddressRangesMap Ranges;
1768bb4451aSAlexey Lapshin
1778bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 0u);
1788bb4451aSAlexey Lapshin EXPECT_TRUE(Ranges.empty());
1798bb4451aSAlexey Lapshin
1808bb4451aSAlexey Lapshin // Add single range.
1818bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x2000), 0xfe);
1828bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
1838bb4451aSAlexey Lapshin EXPECT_FALSE(Ranges.empty());
1848bb4451aSAlexey Lapshin EXPECT_TRUE(Ranges.contains(0x1500));
1858bb4451aSAlexey Lapshin EXPECT_TRUE(Ranges.contains(AddressRange(0x1000, 0x2000)));
1868bb4451aSAlexey Lapshin
187*1e72920cSAlexey Lapshin ///////////////////////////////////////
188*1e72920cSAlexey Lapshin /// Check ranges with the same mapped value.
189*1e72920cSAlexey Lapshin
1908bb4451aSAlexey Lapshin // Clear ranges.
1918bb4451aSAlexey Lapshin Ranges.clear();
1928bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 0u);
1938bb4451aSAlexey Lapshin EXPECT_TRUE(Ranges.empty());
1948bb4451aSAlexey Lapshin
195*1e72920cSAlexey Lapshin // Add range and check mapped value.
196*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x2000), 0x11);
197*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
198*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);
199*1e72920cSAlexey Lapshin
200*1e72920cSAlexey Lapshin // Add adjacent range and check mapped value.
201*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x2000, 0x3000), 0x11);
202*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 2u);
203*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);
204*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x2000)->Value, 0x11);
205*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x2900)->Value, 0x11);
206*1e72920cSAlexey Lapshin EXPECT_FALSE(Ranges.getRangeThatContains(0x3000));
207*1e72920cSAlexey Lapshin
208*1e72920cSAlexey Lapshin // Add intersecting range and check mapped value.
209*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x3000), 0x11);
210*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 2u);
211*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);
212*1e72920cSAlexey Lapshin
213*1e72920cSAlexey Lapshin // Add second range and check mapped values.
214*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x4000, 0x5000), 0x11);
215*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 3u);
216*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Range, AddressRange(0x1000, 0x2000));
217*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x11);
218*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Range, AddressRange(0x2000, 0x3000));
219*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0x11);
220*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Range, AddressRange(0x4000, 0x5000));
221*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0x11);
222*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);
223*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x4000)->Value, 0x11);
224*1e72920cSAlexey Lapshin
225*1e72920cSAlexey Lapshin // Add intersecting range and check mapped value.
226*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x0, 0x6000), 0x11);
227*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 6u);
228*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0x11);
229*1e72920cSAlexey Lapshin
230*1e72920cSAlexey Lapshin // Check that mapped values are correctly preserved for combined ranges.
231*1e72920cSAlexey Lapshin Ranges.clear();
232*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x0, 0xff), 0x11);
233*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x100, 0x1ff), 0x11);
234*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x200, 0x2ff), 0x11);
235*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x500, 0x5ff), 0x11);
236*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x300, 0x3ff), 0x11);
237*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x400, 0x4ff), 0x11);
238*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x600, 0x6ff), 0x11);
239*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 7u);
240*1e72920cSAlexey Lapshin
241*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x150, 0x350), 0x11);
242*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 9u);
243*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));
244*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x11);
245*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));
246*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0x11);
247*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));
248*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0x11);
249*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));
250*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Value, 0x11);
251*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));
252*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Value, 0x11);
253*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));
254*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Value, 0x11);
255*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Range, AddressRange(0x400, 0x4ff));
256*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Value, 0x11);
257*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Range, AddressRange(0x500, 0x5ff));
258*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Value, 0x11);
259*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Range, AddressRange(0x600, 0x6ff));
260*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Value, 0x11);
261*1e72920cSAlexey Lapshin
262*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x3ff, 0x400), 0x11);
263*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 10u);
264*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));
265*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x11);
266*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));
267*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0x11);
268*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));
269*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0x11);
270*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));
271*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Value, 0x11);
272*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));
273*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Value, 0x11);
274*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));
275*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Value, 0x11);
276*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Range, AddressRange(0x3ff, 0x400));
277*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Value, 0x11);
278*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Range, AddressRange(0x400, 0x4ff));
279*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Value, 0x11);
280*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Range, AddressRange(0x500, 0x5ff));
281*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Value, 0x11);
282*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[9].Range, AddressRange(0x600, 0x6ff));
283*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[9].Value, 0x11);
284*1e72920cSAlexey Lapshin
285*1e72920cSAlexey Lapshin /////////////////////////////////////////////
286*1e72920cSAlexey Lapshin /// Check ranges with various mapped values.
287*1e72920cSAlexey Lapshin
288*1e72920cSAlexey Lapshin // Clear ranges.
289*1e72920cSAlexey Lapshin Ranges.clear();
290*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 0u);
291*1e72920cSAlexey Lapshin EXPECT_TRUE(Ranges.empty());
292*1e72920cSAlexey Lapshin
293*1e72920cSAlexey Lapshin // Add range and check mapped value.
2948bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x2000), 0xfe);
2958bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 1u);
296*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);
2978bb4451aSAlexey Lapshin
298*1e72920cSAlexey Lapshin // Add adjacent range and check mapped value.
2998bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x2000, 0x3000), 0xfc);
3008bb4451aSAlexey Lapshin EXPECT_EQ(Ranges.size(), 2u);
301*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);
302*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x2000)->Value, 0xfc);
303*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x2900)->Value, 0xfc);
304*1e72920cSAlexey Lapshin EXPECT_FALSE(Ranges.getRangeThatContains(0x3000));
3058bb4451aSAlexey Lapshin
306*1e72920cSAlexey Lapshin // Add intersecting range and check mapped value.
307*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x1000, 0x3000), 0xff);
308*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 2u);
309*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);
310*1e72920cSAlexey Lapshin
311*1e72920cSAlexey Lapshin // Add one more range and check mapped values.
312*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x4000, 0x5000), 0x0);
313*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 3u);
314*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0xfe);
315*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0xfc);
316*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0x0);
317*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);
318*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x4000)->Value, 0x0);
319*1e72920cSAlexey Lapshin
320*1e72920cSAlexey Lapshin // Add intersecting range and check mapped value.
3218bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x0, 0x6000), 0x1);
322*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 6u);
323*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x1);
324*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0xfe);
325*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0xfc);
326*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Value, 0x1);
327*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Value, 0x0);
328*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Value, 0x1);
329*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.getRangeThatContains(0x1000)->Value, 0xfe);
3308bb4451aSAlexey Lapshin
331*1e72920cSAlexey Lapshin // Check that mapped values are correctly preserved for combined ranges.
3328bb4451aSAlexey Lapshin Ranges.clear();
3338bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x0, 0xff), 0x1);
3348bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x100, 0x1ff), 0x2);
3358bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x200, 0x2ff), 0x3);
3368bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x300, 0x3ff), 0x4);
3378bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x500, 0x5ff), 0x6);
338*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x400, 0x4ff), 0x5);
3398bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x600, 0x6ff), 0x7);
340*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 7u);
3418bb4451aSAlexey Lapshin
3428bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x150, 0x350), 0xff);
343*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 9u);
344*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));
345*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x1);
346*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));
347*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0x2);
348*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));
349*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0xff);
350*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));
351*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Value, 0x3);
352*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));
353*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Value, 0xff);
354*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));
355*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Value, 0x4);
356*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Range, AddressRange(0x400, 0x4ff));
357*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Value, 0x5);
358*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Range, AddressRange(0x500, 0x5ff));
359*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Value, 0x6);
360*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Range, AddressRange(0x600, 0x6ff));
361*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Value, 0x7);
3628bb4451aSAlexey Lapshin
363*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x650, 0x700), 0x8);
3648bb4451aSAlexey Lapshin Ranges.insert(AddressRange(0x3ff, 0x400), 0x5);
365*1e72920cSAlexey Lapshin Ranges.insert(AddressRange(0x0, 0x40), 0xee);
366*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges.size(), 11u);
367*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Range, AddressRange(0x0, 0xff));
368*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[0].Value, 0x1);
369*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Range, AddressRange(0x100, 0x1ff));
370*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[1].Value, 0x2);
371*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Range, AddressRange(0x1ff, 0x200));
372*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[2].Value, 0xff);
373*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Range, AddressRange(0x200, 0x2ff));
374*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[3].Value, 0x3);
375*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Range, AddressRange(0x2ff, 0x300));
376*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[4].Value, 0xff);
377*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Range, AddressRange(0x300, 0x3ff));
378*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[5].Value, 0x4);
379*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Range, AddressRange(0x3ff, 0x400));
380*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[6].Value, 0x5);
381*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Range, AddressRange(0x400, 0x4ff));
382*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[7].Value, 0x5);
383*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Range, AddressRange(0x500, 0x5ff));
384*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[8].Value, 0x6);
385*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[9].Range, AddressRange(0x600, 0x6ff));
386*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[9].Value, 0x7);
387*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[10].Range, AddressRange(0x6ff, 0x700));
388*1e72920cSAlexey Lapshin EXPECT_EQ(Ranges[10].Value, 0x8);
389*1e72920cSAlexey Lapshin }
390*1e72920cSAlexey Lapshin
TEST(AddressRangeTest,TestRangesMapRandom)391*1e72920cSAlexey Lapshin TEST(AddressRangeTest, TestRangesMapRandom) {
392*1e72920cSAlexey Lapshin AddressRangesMap Ranges;
393*1e72920cSAlexey Lapshin size_t NumElements = 100;
394*1e72920cSAlexey Lapshin
395*1e72920cSAlexey Lapshin std::srand(std::time(nullptr));
396*1e72920cSAlexey Lapshin
397*1e72920cSAlexey Lapshin // Fill ranges. Use the same mapped value.
398*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx < NumElements; Idx++) {
399*1e72920cSAlexey Lapshin uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);
400*1e72920cSAlexey Lapshin uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);
401*1e72920cSAlexey Lapshin Ranges.insert({Start, End}, 0xffLL);
402*1e72920cSAlexey Lapshin }
403*1e72920cSAlexey Lapshin
404*1e72920cSAlexey Lapshin // Check ranges.
405*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {
406*1e72920cSAlexey Lapshin // Check that ranges are not intersected.
407*1e72920cSAlexey Lapshin EXPECT_FALSE(Ranges[Idx].Range.intersects(Ranges[Idx + 1].Range));
408*1e72920cSAlexey Lapshin
409*1e72920cSAlexey Lapshin // Check that ranges are sorted and not adjusted.
410*1e72920cSAlexey Lapshin EXPECT_TRUE(Ranges[Idx].Range.end() <= Ranges[Idx + 1].Range.start());
411*1e72920cSAlexey Lapshin }
412*1e72920cSAlexey Lapshin
413*1e72920cSAlexey Lapshin Ranges.clear();
414*1e72920cSAlexey Lapshin // Fill ranges. Use the various mapped value.
415*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx < NumElements; Idx++) {
416*1e72920cSAlexey Lapshin uint64_t Start = static_cast<uint64_t>(std::rand() % 1000);
417*1e72920cSAlexey Lapshin uint64_t End = Start + static_cast<uint64_t>(std::rand() % 1000);
418*1e72920cSAlexey Lapshin int64_t Value = static_cast<int64_t>(std::rand() % 10);
419*1e72920cSAlexey Lapshin Ranges.insert({Start, End}, Value);
420*1e72920cSAlexey Lapshin }
421*1e72920cSAlexey Lapshin
422*1e72920cSAlexey Lapshin // Check ranges.
423*1e72920cSAlexey Lapshin for (size_t Idx = 0; Idx + 1 < Ranges.size(); Idx++) {
424*1e72920cSAlexey Lapshin // Check that ranges are not intersected.
425*1e72920cSAlexey Lapshin EXPECT_FALSE(Ranges[Idx].Range.intersects(Ranges[Idx + 1].Range));
426*1e72920cSAlexey Lapshin
427*1e72920cSAlexey Lapshin // Check that ranges are sorted and not adjusted.
428*1e72920cSAlexey Lapshin EXPECT_TRUE(Ranges[Idx].Range.end() <= Ranges[Idx + 1].Range.start());
429*1e72920cSAlexey Lapshin }
4308bb4451aSAlexey Lapshin }
431