Skip to content

Commit cc4ab2c

Browse files
committed
[NFC][lldb] Clean up LLDBMemoryReader changes.
1 parent da5ea3c commit cc4ab2c

File tree

2 files changed

+43
-30
lines changed

2 files changed

+43
-30
lines changed

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

Lines changed: 37 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -315,11 +315,11 @@ LLDBMemoryReader::resolvePointer(swift::remote::RemoteAddress address,
315315

316316
bool 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
323323
LLDBMemoryReader::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

409411
bool 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

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

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,9 @@ class MemoryReaderLocalBufferHolder {
5151

5252
class LLDBMemoryReader : public swift::remote::MemoryReader {
5353
public:
54+
/// Besides address space 0 (the DefaultAddressSpace), subclasses are free to
55+
/// use any address space for their own implementation purposes. LLDB uses
56+
/// this address space to track file addresses it sends to RemoteInspection.
5457
static constexpr uint8_t LLDBAddressSpace = 1;
5558

5659
LLDBMemoryReader(Process &p,
@@ -124,11 +127,12 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
124127
std::optional<Address>
125128
remoteAddressToLLDBAddress(swift::remote::RemoteAddress address) const;
126129

130+
enum class ReadBytesResult { fail, success_from_file, success_from_memory };
127131
/// Implementation detail of readBytes. Returns a pair where the first element
128132
/// indicates whether the memory was read successfully, the second element
129133
/// indicates whether live memory was read.
130-
std::pair<bool, bool> readBytesImpl(swift::remote::RemoteAddress address,
131-
uint8_t *dest, uint64_t size);
134+
ReadBytesResult readBytesImpl(swift::remote::RemoteAddress address,
135+
uint8_t *dest, uint64_t size);
132136

133137
/// Reads memory from the symbol rich binary from the address into dest.
134138
/// \return true if it was able to successfully read memory.

0 commit comments

Comments
 (0)