<rdar://problem/15449837>

Change the NSSet data formatter to not use the expression parser to produce synthetic children
In small-scale experimentation with lldb-perf, this improves our performance by around 25%

llvm-svn: 195294
This commit is contained in:
Enrico Granata 2013-11-21 01:08:05 +00:00
parent d89221e7e3
commit 5383e81a7f
1 changed files with 60 additions and 10 deletions

View File

@ -249,6 +249,10 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx)
if (idx >= num_children) if (idx >= num_children)
return lldb::ValueObjectSP(); return lldb::ValueObjectSP();
ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
if (!process_sp)
return lldb::ValueObjectSP();
if (m_children.empty()) if (m_children.empty())
{ {
// do the scan phase // do the scan phase
@ -260,7 +264,6 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx)
while(tries < num_children) while(tries < num_children)
{ {
obj_at_idx = m_data_ptr + (test_idx * m_ptr_size); obj_at_idx = m_data_ptr + (test_idx * m_ptr_size);
ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
if (!process_sp) if (!process_sp)
return lldb::ValueObjectSP(); return lldb::ValueObjectSP();
Error error; Error error;
@ -286,12 +289,34 @@ lldb_private::formatters::NSSetISyntheticFrontEnd::GetChildAtIndex (size_t idx)
SetItemDescriptor &set_item = m_children[idx]; SetItemDescriptor &set_item = m_children[idx];
if (!set_item.valobj_sp) if (!set_item.valobj_sp)
{ {
// make the new ValueObject auto ptr_size = process_sp->GetAddressByteSize();
StreamString expr; DataBufferHeap buffer(ptr_size,0);
expr.Printf("(id)%" PRIu64,set_item.item_ptr); switch (ptr_size)
{
case 0: // architecture has no clue?? - fail
return lldb::ValueObjectSP();
case 4:
*((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
break;
case 8:
*((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
break;
default:
assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
}
StreamString idx_name; StreamString idx_name;
idx_name.Printf("[%zu]",idx); idx_name.Printf("[%zu]",idx);
set_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
DataExtractor data(buffer.GetBytes(),
buffer.GetByteSize(),
process_sp->GetByteOrder(),
process_sp->GetAddressByteSize());
set_item.valobj_sp =
ValueObject::CreateValueObjectFromData(idx_name.GetData(),
data,
m_exe_ctx_ref,
m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID));
} }
return set_item.valobj_sp; return set_item.valobj_sp;
} }
@ -392,6 +417,10 @@ lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
if (idx >= num_children) if (idx >= num_children)
return lldb::ValueObjectSP(); return lldb::ValueObjectSP();
ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
if (!process_sp)
return lldb::ValueObjectSP();
if (m_children.empty()) if (m_children.empty())
{ {
// do the scan phase // do the scan phase
@ -403,7 +432,6 @@ lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
while(tries < num_children) while(tries < num_children)
{ {
obj_at_idx = m_objs_addr + (test_idx * m_ptr_size); obj_at_idx = m_objs_addr + (test_idx * m_ptr_size);
ProcessSP process_sp = m_exe_ctx_ref.GetProcessSP();
if (!process_sp) if (!process_sp)
return lldb::ValueObjectSP(); return lldb::ValueObjectSP();
Error error; Error error;
@ -429,12 +457,34 @@ lldb_private::formatters::NSSetMSyntheticFrontEnd::GetChildAtIndex (size_t idx)
SetItemDescriptor &set_item = m_children[idx]; SetItemDescriptor &set_item = m_children[idx];
if (!set_item.valobj_sp) if (!set_item.valobj_sp)
{ {
// make the new ValueObject auto ptr_size = process_sp->GetAddressByteSize();
StreamString expr; DataBufferHeap buffer(ptr_size,0);
expr.Printf("(id)%" PRIu64,set_item.item_ptr); switch (ptr_size)
{
case 0: // architecture has no clue?? - fail
return lldb::ValueObjectSP();
case 4:
*((uint32_t*)buffer.GetBytes()) = (uint32_t)set_item.item_ptr;
break;
case 8:
*((uint64_t*)buffer.GetBytes()) = (uint64_t)set_item.item_ptr;
break;
default:
assert(false && "pointer size is not 4 nor 8 - get out of here ASAP");
}
StreamString idx_name; StreamString idx_name;
idx_name.Printf("[%zu]",idx); idx_name.Printf("[%zu]",idx);
set_item.valobj_sp = ValueObject::CreateValueObjectFromExpression(idx_name.GetData(), expr.GetData(), m_exe_ctx_ref);
DataExtractor data(buffer.GetBytes(),
buffer.GetByteSize(),
process_sp->GetByteOrder(),
process_sp->GetAddressByteSize());
set_item.valobj_sp =
ValueObject::CreateValueObjectFromData(idx_name.GetData(),
data,
m_exe_ctx_ref,
m_backend.GetClangType().GetBasicTypeFromAST(lldb::eBasicTypeObjCID));
} }
return set_item.valobj_sp; return set_item.valobj_sp;
} }