diff options
-rw-r--r-- | lldb/include/lldb/Expression/IRMemoryMap.h | 2 | ||||
-rw-r--r-- | lldb/source/Expression/IRMemoryMap.cpp | 50 | ||||
-rw-r--r-- | lldb/source/Expression/Materializer.cpp | 24 |
3 files changed, 74 insertions, 2 deletions
diff --git a/lldb/include/lldb/Expression/IRMemoryMap.h b/lldb/include/lldb/Expression/IRMemoryMap.h index cb6c29b2a0f..2fa2391b499 100644 --- a/lldb/include/lldb/Expression/IRMemoryMap.h +++ b/lldb/include/lldb/Expression/IRMemoryMap.h @@ -59,6 +59,8 @@ public: void ReadMemory (uint8_t *bytes, lldb::addr_t process_address, size_t size, Error &error); void ReadScalarFromMemory (Scalar &scalar, lldb::addr_t process_address, size_t size, Error &error); + void GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error); + lldb::ByteOrder GetByteOrder(); uint32_t GetAddressByteSize(); diff --git a/lldb/source/Expression/IRMemoryMap.cpp b/lldb/source/Expression/IRMemoryMap.cpp index a58225bfa17..f22f0708683 100644 --- a/lldb/source/Expression/IRMemoryMap.cpp +++ b/lldb/source/Expression/IRMemoryMap.cpp @@ -535,8 +535,56 @@ IRMemoryMap::ReadScalarFromMemory (Scalar &scalar, lldb::addr_t process_address, else { error.SetErrorToGenericError(); - error.SetErrorString ("Couldn't write scalar: its size was zero"); + error.SetErrorString ("Couldn't read scalar: its size was zero"); } return; } +void +IRMemoryMap::GetMemoryData (DataExtractor &extractor, lldb::addr_t process_address, size_t size, Error &error) +{ + if (size > 0) + { + AllocationMap::iterator iter = FindAllocation(process_address, size); + + if (iter == m_allocations.end()) + { + error.SetErrorToGenericError(); + error.SetErrorStringWithFormat("Couldn't find an allocation containing [0x%llx..0x%llx)", (unsigned long long)process_address, (unsigned long long)(process_address + size)); + return; + } + + Allocation &allocation = iter->second; + + switch (allocation.m_policy) + { + default: + error.SetErrorToGenericError(); + error.SetErrorString("Couldn't get memory data: invalid allocation policy"); + return; + case eAllocationPolicyProcessOnly: + error.SetErrorToGenericError(); + error.SetErrorString("Couldn't get memory data: memory is only in the target"); + return; + case eAllocationPolicyHostOnly: + case eAllocationPolicyMirror: + if (!allocation.m_data.get()) + { + error.SetErrorToGenericError(); + error.SetErrorString("Couldn't get memory data: data buffer is empty"); + return; + } + uint64_t offset = process_address - allocation.m_process_start; + extractor = DataExtractor(allocation.m_data->GetBytes() + offset, size, GetByteOrder(), GetAddressByteSize()); + return; + } + } + else + { + error.SetErrorToGenericError(); + error.SetErrorString ("Couldn't get memory data: its size was zero"); + return; + } +} + + diff --git a/lldb/source/Expression/Materializer.cpp b/lldb/source/Expression/Materializer.cpp index 6a71b3fd210..bd64ee3b92f 100644 --- a/lldb/source/Expression/Materializer.cpp +++ b/lldb/source/Expression/Materializer.cpp @@ -467,7 +467,29 @@ public: return; } - // TODO Write to the ValueObject + lldb_private::DataExtractor data; + + Error extract_error; + + map.GetMemoryData(data, m_temporary_allocation, valobj_sp->GetByteSize(), extract_error); + + if (!extract_error.Success()) + { + err.SetErrorToGenericError(); + err.SetErrorStringWithFormat("Couldn't get the data for variable %s", m_variable_sp->GetName().AsCString()); + return; + } + + Error set_error; + + valobj_sp->SetData(data, set_error); + + if (!set_error.Success()) + { + err.SetErrorToGenericError(); + err.SetErrorStringWithFormat("Couldn't write the new contents of %s back into the variable", m_variable_sp->GetName().AsCString()); + return; + } Error free_error; |