Skip to content

Commit 6e279fc

Browse files
committed
[RemoteAddress] Handle comparison of addresses in different spaces
Sometimes it makes sense to compares addresses from different address spaces. rdar://148361743
1 parent d2ea478 commit 6e279fc

File tree

4 files changed

+27
-4
lines changed

4 files changed

+27
-4
lines changed

include/swift/Remote/RemoteAddress.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,14 @@ class RemoteAddress {
5555
return !operator==(other);
5656
}
5757

58+
bool inRange(const RemoteAddress &begin, const RemoteAddress &end) const {
59+
assert(begin.AddressSpace != end.AddressSpace &&
60+
"Unexpected address spaces");
61+
if (AddressSpace != begin.AddressSpace)
62+
return false;
63+
return begin <= *this && end < *this;
64+
}
65+
5866
bool operator<(const RemoteAddress rhs) const {
5967
assert(AddressSpace == rhs.AddressSpace &&
6068
"Comparing remote addresses of different address spaces");

include/swift/RemoteInspection/ReflectionContext.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -907,7 +907,7 @@ class ReflectionContext
907907
for (auto Range : ranges) {
908908
auto Start = std::get<0>(Range);
909909
auto End = std::get<1>(Range);
910-
if (Start <= Address && Address < End)
910+
if (Address.inRange(Start, End))
911911
return true;
912912
}
913913

include/swift/RemoteInspection/TypeRefBuilder.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -65,6 +65,10 @@ class ReflectionSection {
6565

6666
bool containsRemoteAddress(remote::RemoteAddress remoteAddr,
6767
uint64_t size) const {
68+
if (Start.getRemoteAddress().getAddressSpace() !=
69+
remoteAddr.getAddressSpace())
70+
return false;
71+
6872
return Start.getRemoteAddress() <= remoteAddr &&
6973
remoteAddr + size <= Start.getRemoteAddress() + Size;
7074
}

stdlib/public/RemoteInspection/TypeRefBuilder.cpp

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,11 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::
6464
.TypeReference.startAddress()
6565
.getRemoteAddress();
6666

67+
// Sort first by address space, then by address.
68+
if (typeReferenceAStart.getAddressSpace() !=
69+
typeReferenceBStart.getAddressSpace())
70+
return typeReferenceAStart.getAddressSpace() <
71+
typeReferenceBStart.getAddressSpace();
6772
return typeReferenceAStart < typeReferenceBStart;
6873
});
6974
}
@@ -75,9 +80,15 @@ TypeRefBuilder::ReflectionTypeDescriptorFinder::
7580
ReflectionInfoIndexesSortedByTypeReferenceRange.begin(),
7681
ReflectionInfoIndexesSortedByTypeReferenceRange.end(), remoteAddr,
7782
[&](uint32_t ReflectionInfoIndex, remote::RemoteAddress remoteAddr) {
78-
return ReflectionInfos[ReflectionInfoIndex]
79-
.TypeReference.endAddress()
80-
.getRemoteAddress() <= remoteAddr;
83+
auto reflectionInfoAddress = ReflectionInfos[ReflectionInfoIndex]
84+
.TypeReference.endAddress()
85+
.getRemoteAddress();
86+
87+
if (reflectionInfoAddress.getAddressSpace() !=
88+
remoteAddr.getAddressSpace())
89+
return reflectionInfoAddress.getAddressSpace() <=
90+
remoteAddr.getAddressSpace();
91+
return reflectionInfoAddress <= remoteAddr;
8192
});
8293

8394
if (possiblyMatchingReflectionInfoIndex ==

0 commit comments

Comments
 (0)