[NFC][RemoteInspection] Add an opaque AddressSpace field to RemoteAddress

Add an extra opaque field to AddressSpace, which can be used by clients
of RemoteInspection to distinguish between different address spaces.

LLDB employs an optimization where it reads memory from files instead of
the running process whenever it can to speed up memory reads (these can
be slow when debugging something over a network). To do this, it needs
to keep track whether an address originated from a process or a file. It
currently distinguishes addresses by setting an unused high bit on the
address, but because of pointer authentication this is not a reliable
solution. In order to keep this optimization working, this patch adds an
extra opaque AddressSpace field to RemoteAddress, which LLDB can use on
its own implementation of MemoryReader to distinguish between addresses.

This patch is NFC for the other RemoteInspection clients, as it adds
extra information to RemoteAddress, which is entirely optional and if
unused should not change the behavior of the library.

Although this patch is quite big the changes are largely mechanical,
replacing threading StoredPointer with RemoteAddress.

rdar://148361743
(cherry picked from commit 58df5534d2)
(cherry picked from commit 8f3862b5e7)
This commit is contained in:
Augusto Noronha
2025-07-09 14:52:42 -07:00
parent 9e85b88d9d
commit e2c8b761cd
18 changed files with 970 additions and 708 deletions

View File

@@ -35,5 +35,5 @@ RemoteAddress InProcessMemoryReader::getSymbolAddress(const std::string &name) {
#else
auto pointer = dlsym(RTLD_DEFAULT, name.c_str());
#endif
return RemoteAddress(pointer);
return RemoteAddress((uint64_t)pointer, RemoteAddress::DefaultAddressSpace);
}

View File

@@ -53,7 +53,7 @@ using irgen::Alignment;
using irgen::Size;
static inline RemoteAddress operator+(RemoteAddress address, Size offset) {
return RemoteAddress(address.getAddressData() + offset.getValue());
return address + offset.getValue();
}
namespace {
@@ -437,15 +437,14 @@ public:
Result<Type> getTypeForRemoteTypeMetadata(RemoteAddress metadata,
bool skipArtificial) override {
if (auto result = Reader.readTypeFromMetadata(metadata.getAddressData(),
skipArtificial))
if (auto result = Reader.readTypeFromMetadata(metadata, skipArtificial))
return result;
return getFailure<Type>();
}
Result<MetadataKind>
getKindForRemoteTypeMetadata(RemoteAddress metadata) override {
auto result = Reader.readKindFromMetadata(metadata.getAddressData());
auto result = Reader.readKindFromMetadata(metadata);
if (result)
return *result;
return getFailure<MetadataKind>();
@@ -453,8 +452,7 @@ public:
Result<NominalTypeDecl*>
getDeclForRemoteNominalTypeDescriptor(RemoteAddress descriptor) override {
if (auto result =
Reader.readNominalTypeFromDescriptor(descriptor.getAddressData()))
if (auto result = Reader.readNominalTypeFromDescriptor(descriptor))
return dyn_cast<NominalTypeDecl>((GenericTypeDecl *) result);
return getFailure<NominalTypeDecl*>();
}
@@ -468,8 +466,7 @@ public:
getOffsetOfTupleElementFromMetadata(RemoteAddress metadata,
unsigned index) override {
typename Runtime::StoredSize offset;
if (Reader.readTupleElementOffset(metadata.getAddressData(),
index, &offset))
if (Reader.readTupleElementOffset(metadata, index, &offset))
return uint64_t(offset);
return getFailure<uint64_t>();
}
@@ -484,17 +481,18 @@ public:
Result<RemoteAddress>
getHeapMetadataForObject(RemoteAddress object) override {
auto result = Reader.readMetadataFromInstance(object.getAddressData());
auto result = Reader.readMetadataFromInstance(object);
if (result) return RemoteAddress(*result);
return getFailure<RemoteAddress>();
}
Result<OpenedExistential>
getDynamicTypeAndAddressClassExistential(RemoteAddress object) {
auto pointerval = Reader.readResolvedPointerValue(object.getAddressData());
auto pointerval = Reader.readResolvedPointerValue(object);
if (!pointerval)
return getFailure<OpenedExistential>();
auto result = Reader.readMetadataFromInstance(*pointerval);
;
if (!result)
return getFailure<OpenedExistential>();
auto typeResult = Reader.readTypeFromMetadata(result.value());
@@ -508,7 +506,7 @@ public:
getDynamicTypeAndAddressErrorExistential(RemoteAddress object,
bool dereference=true) {
if (dereference) {
auto pointerval = Reader.readResolvedPointerValue(object.getAddressData());
auto pointerval = Reader.readResolvedPointerValue(object);
if (!pointerval)
return getFailure<OpenedExistential>();
object = RemoteAddress(*pointerval);
@@ -519,8 +517,7 @@ public:
if (!result)
return getFailure<OpenedExistential>();
auto typeResult =
Reader.readTypeFromMetadata(result->MetadataAddress.getAddressData());
auto typeResult = Reader.readTypeFromMetadata(result->MetadataAddress);
if (!typeResult)
return getFailure<OpenedExistential>();
@@ -531,8 +528,7 @@ public:
auto payloadAddress = result->PayloadAddress;
if (!result->IsBridgedError &&
typeResult->getClassOrBoundGenericClass()) {
auto pointerval = Reader.readResolvedPointerValue(
payloadAddress.getAddressData());
auto pointerval = Reader.readResolvedPointerValue(payloadAddress);
if (!pointerval)
return getFailure<OpenedExistential>();
@@ -549,8 +545,7 @@ public:
if (!result)
return getFailure<OpenedExistential>();
auto typeResult =
Reader.readTypeFromMetadata(result->MetadataAddress.getAddressData());
auto typeResult = Reader.readTypeFromMetadata(result->MetadataAddress);
if (!typeResult)
return getFailure<OpenedExistential>();
@@ -559,8 +554,7 @@ public:
// of the reference.
auto payloadAddress = result->PayloadAddress;
if (typeResult->getClassOrBoundGenericClass()) {
auto pointerval = Reader.readResolvedPointerValue(
payloadAddress.getAddressData());
auto pointerval = Reader.readResolvedPointerValue(payloadAddress);
if (!pointerval)
return getFailure<OpenedExistential>();
@@ -578,7 +572,7 @@ public:
// 1) Loading a pointer from the input address
// 2) Reading it as metadata and resolving the type
// 3) Wrapping the resolved type in an existential metatype.
auto pointerval = Reader.readResolvedPointerValue(object.getAddressData());
auto pointerval = Reader.readResolvedPointerValue(object);
if (!pointerval)
return getFailure<OpenedExistential>();
auto typeResult = Reader.readTypeFromMetadata(*pointerval);
@@ -634,7 +628,7 @@ public:
unsigned ordinal) override {
auto underlyingType = Reader
.readUnderlyingTypeForOpaqueTypeDescriptor(
opaqueDescriptor.getAddressData(), ordinal)
opaqueDescriptor, ordinal)
.getType();
if (!underlyingType)