[Lldb-commits] [PATCH] D11390: Optimize GetCompileUnitContainingDIE with a lookup table
Greg Clayton
clayborg at gmail.com
Tue Jul 21 13:31:27 PDT 2015
clayborg requested changes to this revision.
clayborg added a comment.
This revision now requires changes to proceed.
No need for an extra map. A local C++ guru a while back told me about being able to use a comparison function with two different types if you use std::lower_bound() or std::upper_bound(). Since m_compiler_units is sorted, we can just do:
static bool CompileUnitOffsetLessThan (dw_offset_t die_offset, const DWARFCompileUnitSP& cu_sp)
{
return die_offset < cu_sp->GetOffset();
}
DWARFCompileUnitSP
DWARFDebugInfo::GetCompileUnitContainingDIE(dw_offset_t die_offset)
{
DWARFCompileUnitSP cu_sp;
if (die_offset != DW_INVALID_OFFSET)
{
ParseCompileUnitHeadersIfNeeded();
// Watch out for single compile unit executable as they are pretty common
const size_t num_cus = m_compile_units.size();
if (num_cus == 1)
{
if (m_compile_units[0]->ContainsDIEOffset(die_offset))
cu_sp = m_compile_units[0];
}
else if (num_cus)
{
CompileUnitColl::const_iterator end_pos = m_compile_units.end();
CompileUnitColl::const_iterator begin_pos = m_compile_units.begin();
CompileUnitColl::const_iterator pos = std::upper_bound(begin_pos, end_pos, die_offset, CompileUnitOffsetLessThan);
if (pos != begin_pos)
{
--pos;
if ((*pos)->ContainsDIEOffset(die_offset))
cu_sp = *pos;
}
}
}
return cu_sp;
}
Try out the changes and make sure they work and then switch to using the code above.
http://reviews.llvm.org/D11390
More information about the lldb-commits
mailing list