Fixed a few bugs in IRMemoryMap:
- If an allocation is mirrored between the host
and the process, update the host's version
before returning a DataExtractor pointing to
it.
- If anyone attempts to access memory in a
process/target that does not have a corresponding
allocation, try accessing the memory directly
before erroring out.
llvm-svn: 179561
diff --git a/lldb/source/Expression/IRMemoryMap.cpp b/lldb/source/Expression/IRMemoryMap.cpp
index 300aaa5..7aecc9e 100644
--- a/lldb/source/Expression/IRMemoryMap.cpp
+++ b/lldb/source/Expression/IRMemoryMap.cpp
@@ -325,8 +325,16 @@
if (iter == m_allocations.end())
{
+ lldb::ProcessSP process_sp = m_process_wp.lock();
+
+ if (process_sp)
+ {
+ process_sp->WriteMemory(process_address, bytes, size, error);
+ return;
+ }
+
error.SetErrorToGenericError();
- error.SetErrorString("Couldn't write: no allocation contains the target range");
+ error.SetErrorString("Couldn't write: no allocation contains the target range and the process doesn't exist");
return;
}
@@ -433,8 +441,25 @@
if (iter == m_allocations.end())
{
+ lldb::ProcessSP process_sp = m_process_wp.lock();
+
+ if (process_sp)
+ {
+ process_sp->ReadMemory(process_address, bytes, size, error);
+ return;
+ }
+
+ lldb::TargetSP target_sp = m_target_wp.lock();
+
+ if (target_sp)
+ {
+ Address absolute_address(process_address);
+ target_sp->ReadMemory(absolute_address, false, bytes, size, error);
+ return;
+ }
+
error.SetErrorToGenericError();
- error.SetErrorString("Couldn't read: no allocation contains the target range");
+ error.SetErrorString("Couldn't read: no allocation contains the target range, and neither the process nor the target exist");
return;
}
@@ -561,8 +586,27 @@
error.SetErrorToGenericError();
error.SetErrorString("Couldn't get memory data: memory is only in the target");
return;
- case eAllocationPolicyHostOnly:
case eAllocationPolicyMirror:
+ {
+ lldb::ProcessSP process_sp = m_process_wp.lock();
+
+ if (!allocation.m_data.get())
+ {
+ error.SetErrorToGenericError();
+ error.SetErrorString("Couldn't get memory data: data buffer is empty");
+ return;
+ }
+ if (process_sp)
+ {
+ process_sp->ReadMemory(allocation.m_process_start, allocation.m_data->GetBytes(), allocation.m_data->GetByteSize(), error);
+ if (!error.Success())
+ return;
+ uint64_t offset = process_address - allocation.m_process_start;
+ extractor = DataExtractor(allocation.m_data->GetBytes() + offset, size, GetByteOrder(), GetAddressByteSize());
+ return;
+ }
+ }
+ case eAllocationPolicyHostOnly:
if (!allocation.m_data.get())
{
error.SetErrorToGenericError();