Skip to content

Commit 22004c0

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 22004c0

File tree

7 files changed

+105
-67
lines changed

7 files changed

+105
-67
lines changed

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

Lines changed: 35 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;
@@ -539,10 +543,11 @@ LLDBMemoryReader::addModuleToAddressMap(ModuleSP module,
539543

540544
if (module_end_address !=
541545
signedPointerStripper(
542-
swift::remote::RemoteAbsolutePointer{
543-
swift::remote::RemoteAddress{module_end_address}})
546+
swift::remote::RemoteAbsolutePointer{swift::remote::RemoteAddress{
547+
module_end_address,
548+
swift::reflection::RemoteAddress::DefaultAddressSpace}})
544549
.getResolvedAddress()
545-
.getAddressData()) {
550+
.getRawAddress()) {
546551
LLDB_LOG(GetLog(LLDBLog::Types),
547552
"[MemoryReader] module to address map ran into pointer "
548553
"authentication mask!");
@@ -615,12 +620,12 @@ std::optional<swift::reflection::RemoteAddress>
615620
LLDBMemoryReader::resolveRemoteAddress(
616621
swift::reflection::RemoteAddress address) const {
617622
std::optional<Address> lldb_address =
618-
LLDBMemoryReader::resolveRemoteAddress(address.getAddressData());
623+
LLDBMemoryReader::resolveRemoteAddress(address.getRawAddress());
619624
if (!lldb_address)
620625
return {};
621626
lldb::addr_t addr = lldb_address->GetLoadAddress(&m_process.GetTarget());
622627
if (addr != LLDB_INVALID_ADDRESS)
623-
return swift::reflection::RemoteAddress(addr);
628+
return swift::reflection::RemoteAddress(addr, swift::reflection::RemoteAddress::DefaultAddressSpace);
624629
return {};
625630
}
626631

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

Lines changed: 0 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)>
@@ -122,7 +121,6 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
122121
std::optional<Address>
123122
resolveRemoteAddressFromSymbolObjectFile(uint64_t address) const;
124123

125-
private:
126124
Process &m_process;
127125
size_t m_max_read_amount;
128126

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) {

0 commit comments

Comments
 (0)