mirror of
https://github.com/apple/swift.git
synced 2025-12-14 20:36:38 +01:00
[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 commit58df5534d2) (cherry picked from commit8f3862b5e7)
This commit is contained in:
@@ -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);
|
||||
}
|
||||
|
||||
@@ -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)
|
||||
|
||||
Reference in New Issue
Block a user