Skip to content

Commit 7ebf13b

Browse files
committed
[NFC][lldb] Adapt LLDB to RemoteInspection's RemoteAddress changes
Adapts LLDB to the new field in RemoteAddress. This is an NFC that maintains the current behavior. A follow up patch will be introduced later that takes advantage of the new behavior to fix a bug in reading metadata from files instead of the process. rdar://148361743
1 parent 836371c commit 7ebf13b

File tree

8 files changed

+121
-49
lines changed

8 files changed

+121
-49
lines changed

lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.cpp

Lines changed: 49 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ swift::remote::RemoteAddress
8484
LLDBMemoryReader::getSymbolAddress(const std::string &name) {
8585
lldbassert(!name.empty());
8686
if (name.empty())
87-
return swift::remote::RemoteAddress(nullptr);
87+
return swift::remote::RemoteAddress();
8888

8989
Log *log = GetLog(LLDBLog::Types);
9090

@@ -97,7 +97,7 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
9797
name_cs, lldb::eSymbolTypeAny, sc_list);
9898
if (!sc_list.GetSize()) {
9999
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
100-
return swift::remote::RemoteAddress(nullptr);
100+
return swift::remote::RemoteAddress();
101101
}
102102

103103
SymbolContext sym_ctx;
@@ -118,14 +118,15 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
118118
if (sym_ctx.symbol) {
119119
auto load_addr = sym_ctx.symbol->GetLoadAddress(&m_process.GetTarget());
120120
LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0:x}", load_addr);
121-
return swift::remote::RemoteAddress(load_addr);
121+
return swift::remote::RemoteAddress(
122+
load_addr, swift::remote::RemoteAddress::DefaultAddressSpace);
122123
}
123124
}
124125

125126
// Empty list, resolution failed.
126127
if (sc_list.GetSize() == 0) {
127128
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
128-
return swift::remote::RemoteAddress(nullptr);
129+
return swift::remote::RemoteAddress();
129130
}
130131

131132
// If there's a single symbol, then we're golden. If there's more than
@@ -140,11 +141,12 @@ LLDBMemoryReader::getSymbolAddress(const std::string &name) {
140141
load_addr, m_process.GetAddressByteSize(), 0, error, true);
141142
if (sym_value != other_sym_value) {
142143
LLDB_LOGV(log, "[MemoryReader] symbol resolution failed {0}", name);
143-
return swift::remote::RemoteAddress(nullptr);
144+
return swift::remote::RemoteAddress();
144145
}
145146
}
146147
LLDB_LOGV(log, "[MemoryReader] symbol resolved to {0}", load_addr);
147-
return swift::remote::RemoteAddress(load_addr);
148+
return swift::remote::RemoteAddress(
149+
load_addr, swift::remote::RemoteAddress::DefaultAddressSpace);
148150
}
149151

150152
static std::unique_ptr<swift::SwiftObjectFileFormat>
@@ -229,7 +231,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
229231
// to a tagged address so further memory reads originating from it benefit
230232
// from the file-cache optimization.
231233
swift::remote::RemoteAbsolutePointer process_pointer{
232-
swift::remote::RemoteAddress{readValue}};
234+
swift::remote::RemoteAddress{
235+
readValue, swift::remote::RemoteAddress::DefaultAddressSpace}};
233236

234237
if (!readMetadataFromFileCacheEnabled())
235238
return process_pointer;
@@ -295,7 +298,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
295298
}
296299

297300
swift::remote::RemoteAbsolutePointer tagged_pointer{
298-
swift::remote::RemoteAddress{tagged_address}};
301+
swift::remote::RemoteAddress{
302+
tagged_address, swift::remote::RemoteAddress::DefaultAddressSpace}};
299303

300304
if (tagged_address != (uint64_t)signedPointerStripper(tagged_pointer)
301305
.getResolvedAddress()
@@ -455,6 +459,41 @@ bool LLDBMemoryReader::readString(swift::remote::RemoteAddress address,
455459
return false;
456460
}
457461

462+
uint64_t LLDBMemoryReader::getPtrauthMask() {
463+
auto initializePtrauthMask = [&]() -> uint64_t {
464+
uint8_t pointerSize = 0;
465+
if (!queryDataLayout(DataLayoutQueryType::DLQ_GetPointerSize, nullptr,
466+
&pointerSize))
467+
return ~0ull;
468+
469+
if (pointerSize == 4) {
470+
uint32_t ptrauthMask32 = 0;
471+
if (queryDataLayout(DataLayoutQueryType::DLQ_GetPtrAuthMask, nullptr,
472+
&ptrauthMask32))
473+
return (uint64_t)ptrauthMask32;
474+
} else if (pointerSize == 8) {
475+
uint64_t ptrauthMask64 = 0;
476+
if (queryDataLayout(DataLayoutQueryType::DLQ_GetPtrAuthMask, nullptr,
477+
&ptrauthMask64))
478+
return ptrauthMask64;
479+
}
480+
return ~0ull;
481+
};
482+
if (!m_ptrauth_mask)
483+
m_ptrauth_mask = initializePtrauthMask();
484+
return m_ptrauth_mask;
485+
}
486+
487+
swift::reflection::RemoteAddress
488+
LLDBMemoryReader::stripSignedPointer(swift::reflection::RemoteAddress P) {
489+
// Only virtual addresses are signed.
490+
if (P.getAddressSpace() != 0)
491+
return P;
492+
493+
auto ptrauth_mask = getPtrauthMask();
494+
return P & ptrauth_mask;
495+
}
496+
458497
MemoryReaderLocalBufferHolder::~MemoryReaderLocalBufferHolder() {
459498
if (m_memory_reader)
460499
m_memory_reader->popLocalBuffer();
@@ -540,7 +579,7 @@ LLDBMemoryReader::addModuleToAddressMap(ModuleSP module,
540579
if (module_end_address !=
541580
signedPointerStripper(
542581
swift::remote::RemoteAbsolutePointer{
543-
swift::remote::RemoteAddress{module_end_address}})
582+
swift::remote::RemoteAddress{module_end_address, 0}})
544583
.getResolvedAddress()
545584
.getAddressData()) {
546585
LLDB_LOG(GetLog(LLDBLog::Types),
@@ -620,7 +659,7 @@ LLDBMemoryReader::resolveRemoteAddress(
620659
return {};
621660
lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget());
622661
if (addr != LLDB_INVALID_ADDRESS)
623-
return swift::reflection::RemoteAddress(addr);
662+
return swift::reflection::RemoteAddress(addr, 0);
624663
return {};
625664
}
626665

lldb/source/Plugins/LanguageRuntime/Swift/LLDBMemoryReader.h

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -51,8 +51,6 @@ class MemoryReaderLocalBufferHolder {
5151

5252
class LLDBMemoryReader : public swift::remote::MemoryReader {
5353
public:
54-
55-
5654
LLDBMemoryReader(Process &p,
5755
std::function<swift::remote::RemoteAbsolutePointer(
5856
swift::remote::RemoteAbsolutePointer)>
@@ -86,6 +84,9 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
8684
bool readString(swift::remote::RemoteAddress address,
8785
std::string &dest) override;
8886

87+
swift::reflection::RemoteAddress
88+
stripSignedPointer(swift::reflection::RemoteAddress P) override;
89+
8990
MemoryReaderLocalBufferHolder pushLocalBuffer(uint64_t local_buffer, uint64_t local_buffer_size);
9091

9192
/// Adds the module to the list of modules we're tracking using tagged
@@ -122,7 +123,8 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
122123
std::optional<Address>
123124
resolveRemoteAddressFromSymbolObjectFile(uint64_t address) const;
124125

125-
private:
126+
uint64_t getPtrauthMask();
127+
126128
Process &m_process;
127129
size_t m_max_read_amount;
128130

@@ -147,6 +149,8 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
147149
/// object file instead of the main object file.
148150
llvm::SmallSet<lldb::ModuleSP, 8> m_modules_with_metadata_in_symbol_obj_file;
149151

152+
uint64_t m_ptrauth_mask;
153+
150154
/// The bit used to tag LLDB's virtual addresses as such. See \c
151155
/// m_range_module_map.
152156
const static uint64_t LLDB_FILE_ADDRESS_BIT = 0x2000000000000000;

lldb/source/Plugins/LanguageRuntime/Swift/ReflectionContext.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -223,7 +223,10 @@ class TargetReflectionContext : public ReflectionContextInterface {
223223
lldb::addr_t instance, swift::remote::TypeInfoProvider *provider,
224224
swift::reflection::DescriptorFinder *descriptor_finder) override {
225225
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
226-
auto *ti = m_reflection_ctx.getInstanceTypeInfo(instance, provider);
226+
auto *ti = m_reflection_ctx.getInstanceTypeInfo(
227+
swift::remote::RemoteAddress(
228+
instance, swift::remote::RemoteAddress::DefaultAddressSpace),
229+
provider);
227230
if (!ti)
228231
return llvm::createStringError("could not get instance type info");
229232
return *ti;
@@ -273,7 +276,9 @@ class TargetReflectionContext : public ReflectionContextInterface {
273276
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
274277
// Guard against faulty self-referential metadata.
275278
unsigned limit = 256;
276-
auto md_ptr = m_reflection_ctx.readMetadataFromInstance(pointer);
279+
auto md_ptr =
280+
m_reflection_ctx.readMetadataFromInstance(swift::remote::RemoteAddress(
281+
pointer, swift::remote::RemoteAddress::DefaultAddressSpace));
277282
if (!md_ptr)
278283
return false;
279284

@@ -345,7 +350,10 @@ class TargetReflectionContext : public ReflectionContextInterface {
345350
bool skip_artificial_subclasses) override {
346351
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
347352
if (auto *tr = m_reflection_ctx.readTypeFromMetadata(
348-
metadata_address, skip_artificial_subclasses))
353+
swift::remote::RemoteAddress(
354+
metadata_address,
355+
swift::remote::RemoteAddress::DefaultAddressSpace),
356+
skip_artificial_subclasses))
349357
return *tr;
350358
return llvm::createStringError("could not read type from metadata");
351359
}
@@ -356,7 +364,9 @@ class TargetReflectionContext : public ReflectionContextInterface {
356364
bool skip_artificial_subclasses) override {
357365
auto on_exit = PushDescriptorFinderAndPopOnExit(descriptor_finder);
358366
auto metadata_address =
359-
m_reflection_ctx.readMetadataFromInstance(instance_address);
367+
m_reflection_ctx.readMetadataFromInstance(swift::remote::RemoteAddress(
368+
instance_address,
369+
swift::remote::RemoteAddress::DefaultAddressSpace));
360370
if (!metadata_address)
361371
return llvm::createStringError(
362372
llvm::formatv("could not read heap metadata for object at {0:x}",
@@ -370,7 +380,8 @@ class TargetReflectionContext : public ReflectionContextInterface {
370380

371381
std::optional<swift::remote::RemoteAbsolutePointer>
372382
ReadPointer(lldb::addr_t instance_address) override {
373-
auto ptr = m_reflection_ctx.readPointer(instance_address);
383+
auto ptr = m_reflection_ctx.readPointer(swift::remote::RemoteAddress(
384+
instance_address, swift::remote::RemoteAddress::DefaultAddressSpace));
374385
return ptr;
375386
}
376387

@@ -399,7 +410,9 @@ class TargetReflectionContext : public ReflectionContextInterface {
399410
asyncTaskInfo(lldb::addr_t AsyncTaskPtr, unsigned ChildTaskLimit,
400411
unsigned AsyncBacktraceLimit) override {
401412
auto [error, task_info] = m_reflection_ctx.asyncTaskInfo(
402-
AsyncTaskPtr, ChildTaskLimit, AsyncBacktraceLimit);
413+
swift::remote::RemoteAddress(
414+
AsyncTaskPtr, swift::remote::RemoteAddress::DefaultAddressSpace),
415+
ChildTaskLimit, AsyncBacktraceLimit);
403416
if (error)
404417
return llvm::createStringError(*error);
405418

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntime.cpp

Lines changed: 19 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -584,8 +584,11 @@ bool SwiftLanguageRuntime::AddJitObjectFileToReflectionContext(
584584

585585
auto *Buf = malloc(size);
586586
std::memcpy(Buf, data.begin(), size);
587-
swift::remote::RemoteRef<void> remote_ref(section->GetFileAddress(),
588-
Buf);
587+
swift::remote::RemoteRef<void> remote_ref(
588+
swift::remote::RemoteAddress(
589+
section->GetFileAddress(),
590+
swift::remote::RemoteAddress::DefaultAddressSpace),
591+
Buf);
589592

590593
return {remote_ref, size};
591594
}
@@ -723,7 +726,10 @@ std::optional<uint32_t> SwiftLanguageRuntime::AddObjectFileToReflectionContext(
723726
section_list->GetSectionAtIndex(0)->GetFileAddress();
724727
assert(address <= end_address && "Address outside of range!");
725728

726-
swift::remote::RemoteRef<void> remote_ref(address, Buf);
729+
swift::remote::RemoteRef<void> remote_ref(
730+
swift::remote::RemoteAddress(
731+
address, swift::remote::RemoteAddress::DefaultAddressSpace),
732+
Buf);
727733
return {remote_ref, size};
728734
}
729735
}
@@ -794,18 +800,23 @@ bool SwiftLanguageRuntime::AddModuleToReflectionContext(
794800
const uint8_t *file_data = extractor.GetDataStart();
795801
llvm::sys::MemoryBlock file_buffer((void *)file_data, size);
796802
info_id = m_reflection_ctx->ReadELF(
797-
swift::remote::RemoteAddress(load_ptr),
803+
swift::remote::RemoteAddress(
804+
load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace),
798805
std::optional<llvm::sys::MemoryBlock>(file_buffer),
799806
likely_module_names);
800807
} else if (read_from_file_cache &&
801808
obj_file->GetPluginName() == "mach-o") {
802809
info_id = AddObjectFileToReflectionContext(module_sp, likely_module_names);
803810
if (!info_id)
804-
info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr),
805-
likely_module_names);
811+
info_id = m_reflection_ctx->AddImage(
812+
swift::remote::RemoteAddress(
813+
load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace),
814+
likely_module_names);
806815
} else {
807-
info_id = m_reflection_ctx->AddImage(swift::remote::RemoteAddress(load_ptr),
808-
likely_module_names);
816+
info_id = m_reflection_ctx->AddImage(
817+
swift::remote::RemoteAddress(
818+
load_ptr, swift::remote::RemoteAddress::DefaultAddressSpace),
819+
likely_module_names);
809820
}
810821

811822
if (!info_id) {

lldb/source/Plugins/LanguageRuntime/Swift/SwiftLanguageRuntimeDynamicTypeResolution.cpp

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1438,7 +1438,7 @@ llvm::Expected<std::string> SwiftLanguageRuntime::GetEnumCaseName(
14381438

14391439
auto *eti = llvm::cast<EnumTypeInfo>(ti);
14401440
auto buffer_holder = PushLocalBuffer((int64_t)data.GetDataStart(), data.GetByteSize());
1441-
RemoteAddress addr(data.GetDataStart());
1441+
RemoteAddress addr = RemoteAddress((uint64_t)data.GetDataStart(), 0);
14421442
int case_index;
14431443
if (eti->projectEnumValue(*GetMemoryReader(), addr, &case_index))
14441444
return eti->getCases()[case_index].Name;
@@ -1551,7 +1551,7 @@ SwiftLanguageRuntime::ProjectEnum(ValueObject &valobj) {
15511551
}
15521552
}
15531553

1554-
swift::reflection::RemoteAddress remote_addr(addr);
1554+
auto remote_addr = swift::reflection::RemoteAddress(addr, 0);
15551555
int case_index;
15561556
auto *eti = llvm::cast<swift::reflection::EnumTypeInfo>(ti);
15571557
if (!eti->projectEnumValue(*GetMemoryReader(), remote_addr, &case_index))
@@ -2292,7 +2292,8 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
22922292
existential_address,
22932293
llvm::expectedToOptional(in_value.GetByteSize()).value_or(0));
22942294

2295-
swift::remote::RemoteAddress remote_existential(existential_address);
2295+
auto remote_existential = swift::remote::RemoteAddress(
2296+
existential_address, swift::remote::RemoteAddress::DefaultAddressSpace);
22962297

22972298
ThreadSafeReflectionContext reflection_ctx = GetReflectionContext();
22982299
if (!reflection_ctx)
@@ -2317,7 +2318,7 @@ bool SwiftLanguageRuntime::GetDynamicTypeAndAddress_Existential(
23172318
}
23182319

23192320
const swift::reflection::TypeRef *typeref;
2320-
swift::remote::RemoteAddress out_address(nullptr);
2321+
swift::remote::RemoteAddress out_address;
23212322
std::tie(typeref, out_address) = *pair;
23222323

23232324
auto ts = tss->GetTypeSystemSwiftTypeRef();
@@ -2829,7 +2830,9 @@ Value::ValueType SwiftLanguageRuntime::GetValueType(
28292830

28302831
// Read the value witness table and check if the data is inlined in
28312832
// the existential container or not.
2832-
swift::remote::RemoteAddress remote_existential(existential_address);
2833+
auto remote_existential = swift::remote::RemoteAddress(
2834+
existential_address,
2835+
swift::remote::RemoteAddress::DefaultAddressSpace);
28332836
if (ThreadSafeReflectionContext reflection_ctx = GetReflectionContext()) {
28342837
std::optional<bool> is_inlined =
28352838
reflection_ctx->IsValueInlinedInExistentialContainer(

0 commit comments

Comments
 (0)