Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.h @@ -74,7 +74,46 @@ // accessors are called. void ParseCompileUnitHeadersIfNeeded(); + template + DWARFUnit *GetCompileUnitTmpl( + Contains contains, dw_offset_t offset, uint32_t *idx_ptr = NULL); + DISALLOW_COPY_AND_ASSIGN(DWARFDebugInfo); }; +template +DWARFUnit *DWARFDebugInfo::GetCompileUnitTmpl( + Contains contains, dw_offset_t offset, uint32_t *idx_ptr) { + ParseCompileUnitHeadersIfNeeded(); + + DWARFUnitSP cu_sp; + + // 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 (contains(*m_compile_units[0], offset)) { + if (idx_ptr) + *idx_ptr = 0; + return m_compile_units[0].get(); + } + } 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, offset, OffsetLessThanCompileUnitOffset); + if (pos != begin_pos) { + --pos; + if (contains(**pos, offset)) { + if (idx_ptr) + *idx_ptr = pos - begin_pos; + return (*pos).get(); + } + } + } + + if (idx_ptr) + *idx_ptr = DW_INVALID_INDEX; + return nullptr; +} + #endif // SymbolFileDWARF_DWARFDebugInfo_h_ Index: lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp =================================================================== --- lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp +++ lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugInfo.cpp @@ -125,35 +125,10 @@ DWARFUnit *DWARFDebugInfo::GetCompileUnit(dw_offset_t cu_offset, uint32_t *idx_ptr) { - DWARFUnitSP cu_sp; - uint32_t cu_idx = DW_INVALID_INDEX; - if (cu_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]->GetOffset() == cu_offset) { - cu_sp = m_compile_units[0]; - cu_idx = 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, cu_offset, OffsetLessThanCompileUnitOffset); - if (pos != begin_pos) { - --pos; - if ((*pos)->GetOffset() == cu_offset) { - cu_sp = *pos; - cu_idx = std::distance(begin_pos, pos); - } - } - } - } - if (idx_ptr) - *idx_ptr = cu_idx; - return cu_sp.get(); + return GetCompileUnitTmpl( + [](const DWARFUnit &unit, dw_offset_t cu_offset) { + return unit.GetOffset() == cu_offset; + }, cu_offset, idx_ptr); } DWARFUnit *DWARFDebugInfo::GetCompileUnit(const DIERef &die_ref) { @@ -165,28 +140,10 @@ DWARFUnit * DWARFDebugInfo::GetCompileUnitContainingDIEOffset(dw_offset_t die_offset) { - ParseCompileUnitHeadersIfNeeded(); - - DWARFUnitSP cu_sp; - - // 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)) - return m_compile_units[0].get(); - } 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, OffsetLessThanCompileUnitOffset); - if (pos != begin_pos) { - --pos; - if ((*pos)->ContainsDIEOffset(die_offset)) - return (*pos).get(); - } - } - - return nullptr; + return GetCompileUnitTmpl( + [](const DWARFUnit &unit, dw_offset_t die_offset) { + return unit.ContainsDIEOffset(die_offset); + }, die_offset); } DWARFDIE