@@ -225,7 +225,8 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
225225 // to a tagged address so further memory reads originating from it benefit
226226 // from the file-cache optimization.
227227 swift::remote::RemoteAbsolutePointer process_pointer{
228- swift::remote::RemoteAddress{readValue, address.getAddressSpace ()}};
228+ swift::remote::RemoteAddress{
229+ readValue, swift::remote::RemoteAddress::DefaultAddressSpace}};
229230
230231 if (!readMetadataFromFileCacheEnabled ()) {
231232 assert (address.getAddressSpace () ==
@@ -314,6 +315,13 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
314315
315316bool LLDBMemoryReader::readBytes (swift::remote::RemoteAddress address,
316317 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) {
317325 Log *log = GetLog (LLDBLog::Types);
318326 if (m_local_buffer) {
319327 bool overflow = false ;
@@ -322,15 +330,15 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
322330 if (overflow) {
323331 LLDB_LOGV (log, " [MemoryReader] address {0:x} + size {1} overflows" , addr,
324332 size);
325- return false ;
333+ return { false , false } ;
326334 }
327335 if (addr >= *m_local_buffer &&
328336 end <= *m_local_buffer + m_local_buffer_size) {
329337 // If this crashes, the assumptions stated in
330338 // GetDynamicTypeAndAddress_Protocol() most likely no longer
331339 // hold.
332340 memcpy (dest, (void *)addr, size);
333- return true ;
341+ return { true , false } ;
334342 }
335343 }
336344
@@ -345,7 +353,7 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
345353 if (!maybeAddr) {
346354 LLDB_LOGV (log, " [MemoryReader] could not resolve address {0:x}" ,
347355 address.getRawAddress ());
348- return false ;
356+ return { false , false } ;
349357 }
350358 auto addr = *maybeAddr;
351359 if (addr.IsSectionOffset ()) {
@@ -354,30 +362,34 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
354362 if (object_file->GetType () == ObjectFile::Type::eTypeDebugInfo) {
355363 LLDB_LOGV (log, " [MemoryReader] Reading memory from symbol rich binary" );
356364
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 };
359368 }
360369 }
361370
362371 if (size > m_max_read_amount) {
363372 LLDB_LOGV (log, " [MemoryReader] memory read exceeds maximum allowed size" );
364- return false ;
373+ return { false , false } ;
365374 }
366375 Target &target (m_process.GetTarget ());
367376 Status error;
368377 // We only want to allow the file-cache optimization if we resolved the
369378 // address to section + offset.
370379 const bool force_live_memory =
371380 !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)) {
373385 LLDB_LOGV (log,
374386 " [MemoryReader] memory read returned fewer bytes than asked for" );
375- return false ;
387+ return { false , did_read_live_memory} ;
376388 }
377389 if (error.Fail ()) {
378390 LLDB_LOGV (log, " [MemoryReader] memory read returned error: {0}" ,
379391 error.AsCString ());
380- return false ;
392+ return { false , did_read_live_memory} ;
381393 }
382394
383395 auto format_data = [](auto dest, auto size) {
@@ -391,7 +403,7 @@ bool LLDBMemoryReader::readBytes(swift::remote::RemoteAddress address,
391403 LLDB_LOGV (log, " [MemoryReader] memory read returned data: {0}" ,
392404 format_data (dest, size));
393405
394- return true ;
406+ return { true , did_read_live_memory} ;
395407}
396408
397409bool LLDBMemoryReader::readString (swift::remote::RemoteAddress address,
@@ -596,6 +608,32 @@ LLDBMemoryReader::getFileAddressAndModuleForTaggedAddress(
596608 return {{file_address, module }};
597609}
598610
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+
599637std::optional<swift::reflection::RemoteAddress>
600638LLDBMemoryReader::resolveRemoteAddress (
601639 swift::reflection::RemoteAddress address) const {
@@ -730,11 +768,6 @@ LLDBMemoryReader::resolveRemoteAddressFromSymbolObjectFile(
730768}
731769
732770bool 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 ();
739772}
740773} // namespace lldb_private
0 commit comments