Skip to content

Commit b8da06d

Browse files
authored
Merge pull request #83123 from augusto2112/virtual-read-remote-addr-6.2
[NFC][RemoteInspection] Make MemoryReader::readRemoteAddress virtual
2 parents 61157cd + 2ec8f05 commit b8da06d

File tree

3 files changed

+57
-24
lines changed

3 files changed

+57
-24
lines changed

include/swift/Remote/MemoryReader.h

Lines changed: 38 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -64,12 +64,10 @@ class MemoryReader {
6464
/// Returns false if the operator failed.
6565
template <typename IntegerType>
6666
bool readRemoteAddress(RemoteAddress address, RemoteAddress &out) {
67-
IntegerType buf;
68-
if (!readInteger(address, &buf))
69-
return false;
70-
71-
out = RemoteAddress((uint64_t)buf, address.getAddressSpace());
72-
return true;
67+
constexpr std::size_t integerSize = sizeof(IntegerType);
68+
static_assert((integerSize == 4 || integerSize == 8) &&
69+
"Only 32 or 64 bit architectures are supported!");
70+
return readRemoteAddressImpl(address, out, integerSize);
7371
}
7472

7573
/// Attempts to read an integer from the given address in the remote
@@ -280,6 +278,40 @@ class MemoryReader {
280278
}
281279

282280
virtual ~MemoryReader() = default;
281+
282+
protected:
283+
/// Implementation detail of remoteRemoteAddress. This exists because
284+
/// templated functions cannot be virtual.
285+
///
286+
/// Attempts to read a remote address of a given size from the given address
287+
/// in the remote process.
288+
///
289+
/// Returns false if the operator failed.
290+
virtual bool readRemoteAddressImpl(RemoteAddress address, RemoteAddress &out,
291+
std::size_t integerSize) {
292+
assert((integerSize == 4 || integerSize == 8) &&
293+
"Only 32 or 64 bit architectures are supported!");
294+
auto Buf = std::malloc(integerSize);
295+
if (!Buf)
296+
return false;
297+
298+
// Free Buf when this function return.
299+
ReadBytesResult Result(
300+
Buf, [](const void *ptr) { free(const_cast<void *>(ptr)); });
301+
if (!readBytes(address, reinterpret_cast<uint8_t *>(Buf), integerSize))
302+
return false;
303+
304+
if (integerSize == 4)
305+
out = RemoteAddress(*reinterpret_cast<uint32_t *>(Buf),
306+
address.getAddressSpace());
307+
else if (integerSize == 8)
308+
out = RemoteAddress(*reinterpret_cast<uint64_t *>(Buf),
309+
address.getAddressSpace());
310+
else
311+
return false;
312+
313+
return true;
314+
}
283315
};
284316

285317
} // end namespace remote

include/swift/Remote/MetadataReader.h

Lines changed: 18 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -801,8 +801,8 @@ class MetadataReader {
801801
// Non-inline (box'ed) representation.
802802
// The first word of the container stores the address to the box.
803803
RemoteAddress BoxAddress;
804-
if (!Reader->readRemoteAddress<StoredPointer>(ExistentialAddress,
805-
BoxAddress))
804+
if (!Reader->template readRemoteAddress<StoredPointer>(ExistentialAddress,
805+
BoxAddress))
806806
return std::nullopt;
807807

808808
auto AlignmentMask = VWT->getAlignmentMask();
@@ -1694,7 +1694,7 @@ class MetadataReader {
16941694
StoredPointer tag) -> std::optional<RemoteAddress> {
16951695
RemoteAddress addr = base + tag * sizeof(StoredPointer);
16961696
RemoteAddress isa;
1697-
if (!Reader->readRemoteAddress<StoredPointer>(addr, isa))
1697+
if (!Reader->template readRemoteAddress<StoredPointer>(addr, isa))
16981698
return std::nullopt;
16991699
return isa;
17001700
};
@@ -1724,7 +1724,7 @@ class MetadataReader {
17241724
return readMetadataFromTaggedPointer(objectAddress);
17251725

17261726
RemoteAddress isa;
1727-
if (!Reader->readRemoteAddress<StoredPointer>(objectAddress, isa))
1727+
if (!Reader->template readRemoteAddress<StoredPointer>(objectAddress, isa))
17281728
return std::nullopt;
17291729

17301730
switch (getIsaEncoding()) {
@@ -1773,8 +1773,8 @@ class MetadataReader {
17731773
RemoteAddress(IndexedClassesPointer
17741774
+ classIndex * sizeof(StoredPointer));
17751775
RemoteAddress metadataPointer;
1776-
if (!Reader->readRemoteAddress<StoredPointer>(eltPointer,
1777-
metadataPointer))
1776+
if (!Reader->template readRemoteAddress<StoredPointer>(eltPointer,
1777+
metadataPointer))
17781778
return std::nullopt;
17791779

17801780
return metadataPointer;
@@ -1922,7 +1922,7 @@ class MetadataReader {
19221922

19231923
case TypeReferenceKind::IndirectObjCClass: {
19241924
RemoteAddress classRef;
1925-
if (!Reader->readRemoteAddress<StoredPointer>(ref, classRef))
1925+
if (!Reader->template readRemoteAddress<StoredPointer>(ref, classRef))
19261926
return std::nullopt;
19271927

19281928
auto metadata = readMetadata(classRef);
@@ -1970,8 +1970,8 @@ class MetadataReader {
19701970
return std::nullopt;
19711971

19721972
RemoteAddress genericArgAddress;
1973-
if (!Reader->readRemoteAddress<StoredPointer>(addressOfGenericArgAddress,
1974-
genericArgAddress))
1973+
if (!Reader->template readRemoteAddress<StoredPointer>(
1974+
addressOfGenericArgAddress, genericArgAddress))
19751975
return std::nullopt;
19761976

19771977
return genericArgAddress;
@@ -2107,8 +2107,8 @@ class MetadataReader {
21072107

21082108
// Read the name pointer.
21092109
RemoteAddress namePtr;
2110-
if (!Reader->readRemoteAddress<StoredPointer>(roDataPtr + OffsetToName,
2111-
namePtr))
2110+
if (!Reader->template readRemoteAddress<StoredPointer>(
2111+
roDataPtr + OffsetToName, namePtr))
21122112
return false;
21132113

21142114
// If the name pointer is null, treat that as an error.
@@ -2172,8 +2172,8 @@ class MetadataReader {
21722172
// the generalization arguments are.
21732173
RemoteAddress shapeAddress = address + sizeof(StoredPointer);
21742174
RemoteAddress signedShapePtr;
2175-
if (!Reader->readRemoteAddress<StoredPointer>(shapeAddress,
2176-
signedShapePtr))
2175+
if (!Reader->template readRemoteAddress<StoredPointer>(shapeAddress,
2176+
signedShapePtr))
21772177
return nullptr;
21782178
auto shapePtr = stripSignedPointer(signedShapePtr);
21792179

@@ -2637,8 +2637,8 @@ class MetadataReader {
26372637
// Low bit set in the offset indicates that the offset leads to the absolute
26382638
// address in memory.
26392639
if (indirect) {
2640-
if (!Reader->readRemoteAddress<StoredPointer>(resultAddress,
2641-
resultAddress))
2640+
if (!Reader->template readRemoteAddress<StoredPointer>(resultAddress,
2641+
resultAddress))
26422642
return RemoteAddress();
26432643
}
26442644

@@ -3152,7 +3152,8 @@ class MetadataReader {
31523152
--numGenericArgs;
31533153

31543154
RemoteAddress arg;
3155-
if (!Reader->readRemoteAddress<StoredPointer>(genericArgsAddr, arg)) {
3155+
if (!Reader->template readRemoteAddress<StoredPointer>(
3156+
genericArgsAddr, arg)) {
31563157
return {};
31573158
}
31583159
genericArgsAddr += sizeof(StoredPointer);
@@ -3281,7 +3282,7 @@ class MetadataReader {
32813282

32823283
#if SWIFT_OBJC_INTEROP
32833284
RemoteAddress dataPtr;
3284-
if (!Reader->readRemoteAddress<StoredPointer>(
3285+
if (!Reader->template readRemoteAddress<StoredPointer>(
32853286
classAddress + TargetClassMetadataObjCInterop::offsetToData(),
32863287
dataPtr))
32873288
return RemoteAddress();

include/swift/Remote/RemoteAddress.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ class RemoteAddress {
5656
}
5757

5858
bool inRange(const RemoteAddress &begin, const RemoteAddress &end) const {
59-
assert(begin.AddressSpace != end.AddressSpace &&
59+
assert(begin.AddressSpace == end.AddressSpace &&
6060
"Unexpected address spaces");
6161
if (AddressSpace != begin.AddressSpace)
6262
return false;

0 commit comments

Comments
 (0)