Skip to content

Commit bba436f

Browse files
authored
Merge pull request #11015 from augusto2112/fix-read-remote-address
[lldb] Add an extra optional did_read_live_memory to Target::ReadMemory and [lldb] Implement LLDBMemoryReader::readRemoteAddressImpl
2 parents e410908 + b7ac8fd commit bba436f

File tree

5 files changed

+72
-21
lines changed

5 files changed

+72
-21
lines changed

lldb/include/lldb/Target/Target.h

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1193,11 +1193,14 @@ class Target : public std::enable_shared_from_this<Target>,
11931193
// 2 - if there is a process, then read from memory
11941194
// 3 - if there is no process, then read from the file cache
11951195
//
1196+
// The optional did_read_live_memory parameter will be set true if live memory
1197+
// was read successfully.
1198+
//
11961199
// The method is virtual for mocking in the unit tests.
11971200
virtual size_t ReadMemory(const Address &addr, void *dst, size_t dst_len,
11981201
Status &error, bool force_live_memory = false,
1199-
lldb::addr_t *load_addr_ptr = nullptr);
1200-
1202+
lldb::addr_t *load_addr_ptr = nullptr,
1203+
bool *did_read_live_memory = nullptr);
12011204
size_t ReadCStringFromMemory(const Address &addr, std::string &out_str,
12021205
Status &error, bool force_live_memory = false);
12031206

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

Lines changed: 50 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -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

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

397409
bool 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+
599637
std::optional<swift::reflection::RemoteAddress>
600638
LLDBMemoryReader::resolveRemoteAddress(
601639
swift::reflection::RemoteAddress address) const {
@@ -730,11 +768,6 @@ LLDBMemoryReader::resolveRemoteAddressFromSymbolObjectFile(
730768
}
731769

732770
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();
739772
}
740773
} // namespace lldb_private

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

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,11 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
9898
/// Returns whether the filecache optimization is enabled or not.
9999
bool readMetadataFromFileCacheEnabled() const;
100100

101+
protected:
102+
bool readRemoteAddressImpl(swift::remote::RemoteAddress address,
103+
swift::remote::RemoteAddress &out,
104+
std::size_t integerSize) override;
105+
101106
private:
102107
friend MemoryReaderLocalBufferHolder;
103108

@@ -119,6 +124,12 @@ class LLDBMemoryReader : public swift::remote::MemoryReader {
119124
std::optional<Address>
120125
remoteAddressToLLDBAddress(swift::remote::RemoteAddress address) const;
121126

127+
/// Implementation detail of readBytes. Returns a pair where the first element
128+
/// indicates whether the memory was read successfully, the second element
129+
/// indicates whether live memory was read.
130+
std::pair<bool, bool> readBytesImpl(swift::remote::RemoteAddress address,
131+
uint8_t *dest, uint64_t size);
132+
122133
/// Reads memory from the symbol rich binary from the address into dest.
123134
/// \return true if it was able to successfully read memory.
124135
std::optional<Address> resolveRemoteAddressFromSymbolObjectFile(

lldb/source/Target/Target.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1921,7 +1921,8 @@ size_t Target::ReadMemoryFromFileCache(const Address &addr, void *dst,
19211921

19221922
size_t Target::ReadMemory(const Address &addr, void *dst, size_t dst_len,
19231923
Status &error, bool force_live_memory,
1924-
lldb::addr_t *load_addr_ptr) {
1924+
lldb::addr_t *load_addr_ptr,
1925+
bool *did_read_live_memory) {
19251926
error.Clear();
19261927

19271928
Address fixed_addr = addr;
@@ -2020,6 +2021,8 @@ size_t Target::ReadMemory(const Address &addr, void *dst, size_t dst_len,
20202021
if (bytes_read) {
20212022
if (load_addr_ptr)
20222023
*load_addr_ptr = load_addr;
2024+
if (did_read_live_memory)
2025+
*did_read_live_memory = true;
20232026
return bytes_read;
20242027
}
20252028
}

lldb/unittests/Expression/DWARFExpressionTest.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -111,7 +111,8 @@ class MockTarget : public Target {
111111

112112
size_t ReadMemory(const Address &addr, void *dst, size_t dst_len,
113113
Status &error, bool force_live_memory = false,
114-
lldb::addr_t *load_addr_ptr = nullptr) /*override*/ {
114+
lldb::addr_t *load_addr_ptr = nullptr,
115+
bool *did_read_live_memory = nullptr) /*override*/ {
115116
auto expected_memory = this->ReadMemory(addr.GetOffset(), dst_len);
116117
if (!expected_memory) {
117118
llvm::consumeError(expected_memory.takeError());

0 commit comments

Comments
 (0)