//---------------------------------------------------------------------- // Extract //---------------------------------------------------------------------- bool DWARFDebugAranges::Extract(const DataExtractor &debug_aranges_data) { if (debug_aranges_data.ValidOffset(0)) { uint32_t offset = 0; DWARFDebugArangeSet set; Range range; while (set.Extract(debug_aranges_data, &offset)) { const uint32_t num_descriptors = set.NumDescriptors(); if (num_descriptors > 0) { const dw_offset_t cu_offset = set.GetCompileUnitDIEOffset(); for (uint32_t i=0; i<num_descriptors; ++i) { const DWARFDebugArangeSet::Descriptor &descriptor = set.GetDescriptorRef(i); m_aranges.Append(RangeToDIE::Entry (descriptor.address, descriptor.length, cu_offset)); } } set.Clear(); } } return false; }
void operator() (const DWARFDebugArangeSet& set) { const DWARFDebugArangeSet::Descriptor* arange_desc_ptr; DWARFDebugAranges::Range range; range.offset = set.GetCompileUnitDIEOffset(); for (uint32_t i=0; (arange_desc_ptr = set.GetDescriptor(i)) != NULL; ++i) { range.lo_pc = arange_desc_ptr->address; range.hi_pc = arange_desc_ptr->address + arange_desc_ptr->length; // Insert each item in increasing address order so binary searching // can later be done! DWARFDebugAranges::RangeColl::iterator insert_pos = lower_bound(range_collection.begin(), range_collection.end(), range, RangeLessThan); range_collection.insert(insert_pos, range); } }