@@ -225,7 +225,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
225
225
// to a tagged address so further memory reads originating from it benefit
226
226
// from the file-cache optimization.
227
227
swift::remote::RemoteAbsolutePointer process_pointer{
228
- swift::remote::RemoteAddress{readValue, address.getAddressSpace ()}};
228
+ swift::remote::RemoteAddress{
229
+ readValue, swift::remote::RemoteAddress::DefaultAddressSpace}};
229
230
230
231
if (!readMetadataFromFileCacheEnabled ()) {
231
232
assert (address.getAddressSpace () ==
@@ -314,6 +315,13 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
314
315
315
316
bool LLDBMemoryReader::readBytes (swift::remote::RemoteAddress address,
316
317
uint8_t *dest, uint64_t size) {
318
+ auto [success, _] = readBytesImpl (address, dest, size);
319
+ return success;
320
+ }
321
+
322
+ std::pair<bool , bool >
323
+ LLDBMemoryReader::readBytesImpl (swift::remote::RemoteAddress address,
324
+ uint8_t *dest, uint64_t size) {
317
325
Log *log = GetLog (LLDBLog::Types);
318
326
if (m_local_buffer) {
319
327
bool overflow = false ;
@@ -322,15 +330,15 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
322
330
if (overflow) {
323
331
LLDB_LOGV (log, " [MemoryReader] address {0:x} + size {1} overflows" , addr,
324
332
size);
325
- return false ;
333
+ return { false , false } ;
326
334
}
327
335
if (addr >= *m_local_buffer &&
328
336
end <= *m_local_buffer + m_local_buffer_size) {
329
337
// If this crashes, the assumptions stated in
330
338
// GetDynamicTypeAndAddress_Protocol() most likely no longer
331
339
// hold.
332
340
memcpy (dest, (void *)addr, size);
333
- return true ;
341
+ return { true , false } ;
334
342
}
335
343
}
336
344
@@ -345,7 +353,7 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
345
353
if (!maybeAddr) {
346
354
LLDB_LOGV (log, " [MemoryReader] could not resolve address {0:x}" ,
347
355
address.getRawAddress ());
348
- return false ;
356
+ return { false , false } ;
349
357
}
350
358
auto addr = *maybeAddr;
351
359
if (addr.IsSectionOffset ()) {
@@ -354,30 +362,34 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
354
362
if (object_file->GetType () == ObjectFile::Type::eTypeDebugInfo) {
355
363
LLDB_LOGV (log, " [MemoryReader] Reading memory from symbol rich binary" );
356
364
357
- return object_file->ReadSectionData (section.get (), addr.GetOffset (), dest,
358
- size);
365
+ bool success = object_file->ReadSectionData (section.get (),
366
+ addr.GetOffset (), dest, size);
367
+ return {success, false };
359
368
}
360
369
}
361
370
362
371
if (size > m_max_read_amount) {
363
372
LLDB_LOGV (log, " [MemoryReader] memory read exceeds maximum allowed size" );
364
- return false ;
373
+ return { false , false } ;
365
374
}
366
375
Target &target (m_process.GetTarget ());
367
376
Status error;
368
377
// We only want to allow the file-cache optimization if we resolved the
369
378
// address to section + offset.
370
379
const bool force_live_memory =
371
380
!readMetadataFromFileCacheEnabled () || !addr.IsSectionOffset ();
372
- if (size > target.ReadMemory (addr, dest, size, error, force_live_memory)) {
381
+ bool did_read_live_memory = false ;
382
+ if (size > target.ReadMemory (addr, dest, size, error, force_live_memory,
383
+ /* load_addr_ptr=*/ nullptr ,
384
+ &did_read_live_memory)) {
373
385
LLDB_LOGV (log,
374
386
" [MemoryReader] memory read returned fewer bytes than asked for" );
375
- return false ;
387
+ return { false , did_read_live_memory} ;
376
388
}
377
389
if (error.Fail ()) {
378
390
LLDB_LOGV (log, " [MemoryReader] memory read returned error: {0}" ,
379
391
error.AsCString ());
380
- return false ;
392
+ return { false , did_read_live_memory} ;
381
393
}
382
394
383
395
auto format_data = [](auto dest, auto size) {
@@ -391,7 +403,7 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
391
403
LLDB_LOGV (log, " [MemoryReader] memory read returned data: {0}" ,
392
404
format_data (dest, size));
393
405
394
- return true ;
406
+ return { true , did_read_live_memory} ;
395
407
}
396
408
397
409
bool LLDBMemoryReader::readString (swift::remote::RemoteAddress address,
@@ -596,6 +608,32 @@ LLDBMemoryReader::getFileAddressAndModuleForTaggedAddress(
596
608
return {{file_address, module }};
597
609
}
598
610
611
+ bool LLDBMemoryReader::readRemoteAddressImpl (
612
+ swift::remote::RemoteAddress address, swift::remote::RemoteAddress &out,
613
+ std::size_t size) {
614
+ assert ((size == 4 || size == 8 ) &&
615
+ " Only 32 or 64 bit architectures are supported!" );
616
+ auto *dest = (uint8_t *)std::malloc (size);
617
+ auto defer = llvm::make_scope_exit ([&] { free (dest); });
618
+
619
+ auto [success, did_read_live_memory] = readBytesImpl (address, dest, size);
620
+ if (!success)
621
+ return false ;
622
+
623
+ uint8_t addressSpace = did_read_live_memory
624
+ ? swift::remote::RemoteAddress::DefaultAddressSpace
625
+ : LLDBAddressSpace;
626
+ if (size == 4 )
627
+ out = swift::remote::RemoteAddress (*reinterpret_cast <uint32_t *>(dest),
628
+ addressSpace);
629
+ else if (size == 8 )
630
+ out = swift::remote::RemoteAddress (*reinterpret_cast <uint64_t *>(dest),
631
+ addressSpace);
632
+ else
633
+ return false ;
634
+ return true ;
635
+ }
636
+
599
637
std::optional<swift::reflection::RemoteAddress>
600
638
LLDBMemoryReader::resolveRemoteAddress (
601
639
swift::reflection::RemoteAddress address) const {
@@ -730,11 +768,6 @@ LLDBMemoryReader::resolveRemoteAddressFromSymbolObjectFile(
730
768
}
731
769
732
770
bool LLDBMemoryReader::readMetadataFromFileCacheEnabled () const {
733
- auto &triple = m_process.GetTarget ().GetArchitecture ().GetTriple ();
734
-
735
- // 32 doesn't have a flag bit we can reliably use, so reading from filecache
736
- // is disabled on it.
737
- return m_process.GetTarget ().GetSwiftReadMetadataFromFileCache () &&
738
- triple.isArch64Bit ();
771
+ return m_process.GetTarget ().GetSwiftReadMetadataFromFileCache ();
739
772
}
740
773
} // namespace lldb_private
0 commit comments