forked from OSchip/llvm-project
Now that ValueObjects permit writing, made the
Materializer use that API when dematerializing variables. llvm-svn: 179443
This commit is contained in:
parent
4458e52c09
commit
458ae1c6eb
|
@ -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();
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -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;
|
||||
|
||||
|
|
Loading…
Reference in New Issue