Skip to content

Commit bd192c3

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 c038d41 commit bd192c3

File tree

7 files changed

+148
-67
lines changed

7 files changed

+148
-67
lines changed

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

Lines changed: 70 additions & 30 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>
@@ -180,7 +182,7 @@ LLDBMemoryReader::resolvePointerAsSymbol(swift::remote::RemoteAddress address) {
180182
return {};
181183

182184
std::optional<Address> maybeAddr =
183-
resolveRemoteAddress(address.getAddressData());
185+
resolveRemoteAddress(address.getRawAddress());
184186
// This is not an assert, but should never happen.
185187
if (!maybeAddr)
186188
return {};
@@ -191,7 +193,7 @@ LLDBMemoryReader::resolvePointerAsSymbol(swift::remote::RemoteAddress address) {
191193
addr = *maybeAddr;
192194
} else {
193195
// `address` is a real load address.
194-
if (!target.ResolveLoadAddress(address.getAddressData(), addr))
196+
if (!target.ResolveLoadAddress(address.getRawAddress(), addr))
195197
return {};
196198
}
197199

@@ -229,23 +231,24 @@ 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;
236239

237240
// Try to strip the pointer before checking if we have it mapped.
238241
auto strippedPointer = signedPointerStripper(process_pointer);
239242
if (auto resolved = strippedPointer.getResolvedAddress())
240-
readValue = resolved.getAddressData();
243+
readValue = resolved.getRawAddress();
241244

242245
auto &target = m_process.GetTarget();
243246
Address addr;
244247
if (!target.ResolveLoadAddress(readValue, addr)) {
245248
LLDB_LOGV(log,
246249
"[MemoryReader] Could not resolve load address of pointer {0:x} "
247250
"read from {1:x}.",
248-
readValue, address.getAddressData());
251+
readValue, address.getRawAddress());
249252
return process_pointer;
250253
}
251254

@@ -263,7 +266,7 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
263266
LLDB_LOG(log,
264267
"[MemoryReader] Could not resolve find module containing pointer "
265268
"{0:x} read from {1:x}.",
266-
readValue, address.getAddressData());
269+
readValue, address.getRawAddress());
267270
return process_pointer;
268271
}
269272

@@ -290,16 +293,17 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
290293
LLDB_LOG(log,
291294
"[MemoryReader] Pointer {0:x} read from {1:x} resolved to tagged "
292295
"address {2:x}, which is outside its image address space.",
293-
readValue, address.getAddressData(), tagged_address);
296+
readValue, address.getRawAddress(), tagged_address);
294297
return process_pointer;
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()
302-
.getAddressData()) {
306+
.getRawAddress()) {
303307
lldbassert(false &&
304308
"Tagged pointer runs into pointer authentication mask!");
305309
return process_pointer;
@@ -308,7 +312,7 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
308312
LLDB_LOGV(log,
309313
"[MemoryReader] Successfully resolved pointer {0:x} read from "
310314
"{1:x} to tagged address {2:x}.",
311-
readValue, address.getAddressData(), tagged_address);
315+
readValue, address.getRawAddress(), tagged_address);
312316
return tagged_pointer;
313317
}
314318

@@ -317,7 +321,7 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
317321
Log *log = GetLog(LLDBLog::Types);
318322
if (m_local_buffer) {
319323
bool overflow = false;
320-
auto addr = address.getAddressData();
324+
auto addr = address.getRawAddress();
321325
auto end = llvm::SaturatingAdd(addr, size, &overflow);
322326
if (overflow) {
323327
LLDB_LOGV(log, "[MemoryReader] address {0:x} + size {1} overflows", addr,
@@ -335,16 +339,16 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
335339
}
336340

337341
LLDB_LOGV(log, "[MemoryReader] asked to read {0} bytes at address {1:x}",
338-
size, address.getAddressData());
342+
size, address.getRawAddress());
339343
std::optional<Address> maybeAddr =
340-
resolveRemoteAddressFromSymbolObjectFile(address.getAddressData());
344+
resolveRemoteAddressFromSymbolObjectFile(address.getRawAddress());
341345

342346
if (!maybeAddr)
343-
maybeAddr = resolveRemoteAddress(address.getAddressData());
347+
maybeAddr = resolveRemoteAddress(address.getRawAddress());
344348

345349
if (!maybeAddr) {
346350
LLDB_LOGV(log, "[MemoryReader] could not resolve address {0:x}",
347-
address.getAddressData());
351+
address.getRawAddress());
348352
return false;
349353
}
350354
auto addr = *maybeAddr;
@@ -411,17 +415,17 @@ bool LLDBMemoryReader::readString(swift::remote::RemoteAddress address,
411415
return std::string(stream.GetData());
412416
};
413417
LLDB_LOGV(log, "[MemoryReader] asked to read string data at address {0:x}",
414-
address.getAddressData());
418+
address.getRawAddress());
415419

416420
std::optional<Address> maybeAddr =
417-
resolveRemoteAddressFromSymbolObjectFile(address.getAddressData());
421+
resolveRemoteAddressFromSymbolObjectFile(address.getRawAddress());
418422

419423
if (!maybeAddr)
420-
maybeAddr = resolveRemoteAddress(address.getAddressData());
424+
maybeAddr = resolveRemoteAddress(address.getRawAddress());
421425

422426
if (!maybeAddr) {
423427
LLDB_LOGV(log, "[MemoryReader] could not resolve address {0:x}",
424-
address.getAddressData());
428+
address.getRawAddress());
425429
return false;
426430
}
427431
auto addr = *maybeAddr;
@@ -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() != swift::reflection::RemoteAddress::DefaultAddressSpace)
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();
@@ -539,10 +578,11 @@ LLDBMemoryReader::addModuleToAddressMap(ModuleSP module,
539578

540579
if (module_end_address !=
541580
signedPointerStripper(
542-
swift::remote::RemoteAbsolutePointer{
543-
swift::remote::RemoteAddress{module_end_address}})
581+
swift::remote::RemoteAbsolutePointer{swift::remote::RemoteAddress{
582+
module_end_address,
583+
swift::reflection::RemoteAddress::DefaultAddressSpace}})
544584
.getResolvedAddress()
545-
.getAddressData()) {
585+
.getRawAddress()) {
546586
LLDB_LOG(GetLog(LLDBLog::Types),
547587
"[MemoryReader] module to address map ran into pointer "
548588
"authentication mask!");
@@ -615,12 +655,12 @@ std::optional<swift::reflection::RemoteAddress>
615655
LLDBMemoryReader::resolveRemoteAddress(
616656
swift::reflection::RemoteAddress address) const {
617657
std::optional<Address> lldb_address =
618-
LLDBMemoryReader::resolveRemoteAddress(address.getAddressData());
658+
LLDBMemoryReader::resolveRemoteAddress(address.getRawAddress());
619659
if (!lldb_address)
620660
return {};
621661
lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget());
622662
if (addr != LLDB_INVALID_ADDRESS)
623-
return swift::reflection::RemoteAddress(addr);
663+
return swift::reflection::RemoteAddress(addr, swift::reflection::RemoteAddress::DefaultAddressSpace);
624664
return {};
625665
}
626666

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

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,6 @@ class MemoryReaderLocalBufferHolder {
5252
class LLDBMemoryReader : public swift::remote::MemoryReader {
5353
public:
5454

55-
5655
LLDBMemoryReader(Process &p,
5756
std::function<swift::remote::RemoteAbsolutePointer(
5857
swift::remote::RemoteAbsolutePointer)>
@@ -86,6 +85,9 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
8685
bool readString(swift::remote::RemoteAddress address,
8786
std::string &dest) override;
8887

88+
swift::reflection::RemoteAddress
89+
stripSignedPointer(swift::reflection::RemoteAddress P) override;
90+
8991
MemoryReaderLocalBufferHolder pushLocalBuffer(uint64_t local_buffer, uint64_t local_buffer_size);
9092

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

125-
private:
127+
uint64_t getPtrauthMask();
128+
126129
Process &m_process;
127130
size_t m_max_read_amount;
128131

@@ -147,6 +150,9 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
147150
/// object file instead of the main object file.
148151
llvm::SmallSet<lldb::ModuleSP, 8> m_modules_with_metadata_in_symbol_obj_file;
149152

153+
/// The pointer authentication mask.
154+
uint64_t m_ptrauth_mask = 0;
155+
150156
/// The bit used to tag LLDB's virtual addresses as such. See \c
151157
/// m_range_module_map.
152158
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

0 commit comments

Comments
 (0)