@@ -315,11 +315,11 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
315315
316316bool LLDBMemoryReader::readBytes (swift::remote::RemoteAddress address,
317317 uint8_t *dest, uint64_t size) {
318- auto [success, _] = readBytesImpl (address, dest, size);
319- return success ;
318+ auto read_bytes_result = readBytesImpl (address, dest, size);
319+ return read_bytes_result != ReadBytesResult::fail ;
320320}
321321
322- std::pair< bool , bool >
322+ LLDBMemoryReader::ReadBytesResult
323323LLDBMemoryReader::readBytesImpl (swift::remote::RemoteAddress address,
324324 uint8_t *dest, uint64_t size) {
325325 Log *log = GetLog (LLDBLog::Types);
@@ -330,15 +330,15 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
330330 if (overflow) {
331331 LLDB_LOGV (log, " [MemoryReader] address {0:x} + size {1} overflows" , addr,
332332 size);
333- return { false , false } ;
333+ return ReadBytesResult::fail ;
334334 }
335335 if (addr >= *m_local_buffer &&
336336 end <= *m_local_buffer + m_local_buffer_size) {
337337 // If this crashes, the assumptions stated in
338338 // GetDynamicTypeAndAddress_Protocol() most likely no longer
339339 // hold.
340340 memcpy (dest, (void *)addr, size);
341- return { true , false } ;
341+ return ReadBytesResult::success_from_file ;
342342 }
343343 }
344344
@@ -353,7 +353,7 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
353353 if (!maybeAddr) {
354354 LLDB_LOGV (log, " [MemoryReader] could not resolve address {0:x}" ,
355355 address.getRawAddress ());
356- return { false , false } ;
356+ return ReadBytesResult::fail ;
357357 }
358358 auto addr = *maybeAddr;
359359 if (addr.IsSectionOffset ()) {
@@ -362,15 +362,16 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
362362 if (object_file->GetType () == ObjectFile::Type::eTypeDebugInfo) {
363363 LLDB_LOGV (log, " [MemoryReader] Reading memory from symbol rich binary" );
364364
365- bool success = object_file->ReadSectionData (section.get (),
366- addr.GetOffset (), dest, size);
367- return {success, false };
365+ if (object_file->ReadSectionData (section.get (), addr.GetOffset (), dest,
366+ size))
367+ return ReadBytesResult::success_from_file;
368+ return ReadBytesResult::fail;
368369 }
369370 }
370371
371372 if (size > m_max_read_amount) {
372373 LLDB_LOGV (log, " [MemoryReader] memory read exceeds maximum allowed size" );
373- return { false , false } ;
374+ return ReadBytesResult::fail ;
374375 }
375376 Target &target (m_process.GetTarget ());
376377 Status error;
@@ -384,12 +385,12 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
384385 &did_read_live_memory)) {
385386 LLDB_LOGV (log,
386387 " [MemoryReader] memory read returned fewer bytes than asked for" );
387- return { false , did_read_live_memory} ;
388+ return ReadBytesResult::fail ;
388389 }
389390 if (error.Fail ()) {
390391 LLDB_LOGV (log, " [MemoryReader] memory read returned error: {0}" ,
391392 error.AsCString ());
392- return { false , did_read_live_memory} ;
393+ return ReadBytesResult::fail ;
393394 }
394395
395396 auto format_data = [](auto dest, auto size) {
@@ -403,7 +404,8 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
403404 LLDB_LOGV (log, " [MemoryReader] memory read returned data: {0}" ,
404405 format_data (dest, size));
405406
406- return {true , did_read_live_memory};
407+ return did_read_live_memory ? ReadBytesResult::success_from_memory
408+ : ReadBytesResult::success_from_file;
407409}
408410
409411bool LLDBMemoryReader::readString (swift::remote::RemoteAddress address,
@@ -613,24 +615,31 @@ bool LLDBMemoryReader::readRemoteAddressImpl(
613615 std::size_t size) {
614616 assert ((size == 4 || size == 8 ) &&
615617 " 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)
618+ if (size != 4 && size != 8 )
621619 return false ;
622620
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
621+ uint64_t buf;
622+ auto read_bytes_result =
623+ readBytesImpl (address, reinterpret_cast <uint8_t *>(&buf), size);
624+
625+ uint8_t addressSpace;
626+ switch (read_bytes_result) {
627+ case ReadBytesResult::success_from_file:
628+ addressSpace = LLDBAddressSpace;
629+ break ;
630+ case ReadBytesResult::success_from_memory:
631+ addressSpace = swift::remote::RemoteAddress::DefaultAddressSpace;
632+ break ;
633+ case ReadBytesResult::fail:
633634 return false ;
635+ }
636+ ByteOrder byte_order = m_process.GetTarget ().GetArchitecture ().GetByteOrder ();
637+ uint32_t byte_size =
638+ m_process.GetTarget ().GetArchitecture ().GetAddressByteSize ();
639+ DataExtractor extractor ((const void *)&buf, size, byte_order, byte_size);
640+ lldb::offset_t offset = 0 ;
641+ auto data = extractor.GetMaxU64 (&offset, size);
642+ out = swift::remote::RemoteAddress (data, addressSpace);
634643 return true ;
635644}
636645
0 commit comments