@@ -315,11 +315,11 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
315
315
316
316
bool LLDBMemoryReader::readBytes (swift::remote::RemoteAddress address,
317
317
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 ;
320
320
}
321
321
322
- std::pair< bool , bool >
322
+ LLDBMemoryReader::ReadBytesResult
323
323
LLDBMemoryReader::readBytesImpl (swift::remote::RemoteAddress address,
324
324
uint8_t *dest, uint64_t size) {
325
325
Log *log = GetLog (LLDBLog::Types);
@@ -330,15 +330,15 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
330
330
if (overflow) {
331
331
LLDB_LOGV (log, " [MemoryReader] address {0:x} + size {1} overflows" , addr,
332
332
size);
333
- return { false , false } ;
333
+ return ReadBytesResult::fail ;
334
334
}
335
335
if (addr >= *m_local_buffer &&
336
336
end <= *m_local_buffer + m_local_buffer_size) {
337
337
// If this crashes, the assumptions stated in
338
338
// GetDynamicTypeAndAddress_Protocol() most likely no longer
339
339
// hold.
340
340
memcpy (dest, (void *)addr, size);
341
- return { true , false } ;
341
+ return ReadBytesResult::success_from_file ;
342
342
}
343
343
}
344
344
@@ -353,7 +353,7 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
353
353
if (!maybeAddr) {
354
354
LLDB_LOGV (log, " [MemoryReader] could not resolve address {0:x}" ,
355
355
address.getRawAddress ());
356
- return { false , false } ;
356
+ return ReadBytesResult::fail ;
357
357
}
358
358
auto addr = *maybeAddr;
359
359
if (addr.IsSectionOffset ()) {
@@ -362,15 +362,16 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
362
362
if (object_file->GetType () == ObjectFile::Type::eTypeDebugInfo) {
363
363
LLDB_LOGV (log, " [MemoryReader] Reading memory from symbol rich binary" );
364
364
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;
368
369
}
369
370
}
370
371
371
372
if (size > m_max_read_amount) {
372
373
LLDB_LOGV (log, " [MemoryReader] memory read exceeds maximum allowed size" );
373
- return { false , false } ;
374
+ return ReadBytesResult::fail ;
374
375
}
375
376
Target &target (m_process.GetTarget ());
376
377
Status error;
@@ -384,12 +385,12 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
384
385
&did_read_live_memory)) {
385
386
LLDB_LOGV (log,
386
387
" [MemoryReader] memory read returned fewer bytes than asked for" );
387
- return { false , did_read_live_memory} ;
388
+ return ReadBytesResult::fail ;
388
389
}
389
390
if (error.Fail ()) {
390
391
LLDB_LOGV (log, " [MemoryReader] memory read returned error: {0}" ,
391
392
error.AsCString ());
392
- return { false , did_read_live_memory} ;
393
+ return ReadBytesResult::fail ;
393
394
}
394
395
395
396
auto format_data = [](auto dest, auto size) {
@@ -403,7 +404,8 @@ LLDBMemoryReader::readBytesImpl(swift::remote::RemoteAddress address,
403
404
LLDB_LOGV (log, " [MemoryReader] memory read returned data: {0}" ,
404
405
format_data (dest, size));
405
406
406
- return {true , did_read_live_memory};
407
+ return did_read_live_memory ? ReadBytesResult::success_from_memory
408
+ : ReadBytesResult::success_from_file;
407
409
}
408
410
409
411
bool LLDBMemoryReader::readString (swift::remote::RemoteAddress address,
@@ -613,24 +615,31 @@ bool LLDBMemoryReader::readRemoteAddressImpl(
613
615
std::size_t size) {
614
616
assert ((size == 4 || size == 8 ) &&
615
617
" 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 )
621
619
return false ;
622
620
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:
633
634
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);
634
643
return true ;
635
644
}
636
645
0 commit comments