Now that ValueObjects permit writing, made the

Materializer use that API when dematerializing
variables.

llvm-svn: 179443
This commit is contained in:
Sean Callanan 2013-04-13 02:06:42 +00:00
parent 4458e52c09
commit 458ae1c6eb
3 changed files with 74 additions and 2 deletions

View File

@ -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();

View File

@ -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;
}
}

View File

@ -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;