//---------------------------------------------------------------------- // Extract //---------------------------------------------------------------------- bool DWARFDebugAranges::Extract(const DataExtractor &debug_aranges_data) { if (debug_aranges_data.ValidOffset(0)) { uint32_t offset = 0; typedef std::vector<DWARFDebugArangeSet> SetCollection; typedef SetCollection::const_iterator SetCollectionIter; SetCollection sets; DWARFDebugArangeSet set; Range range; while (set.Extract(debug_aranges_data, &offset)) sets.push_back(set); uint32_t count = 0; for_each(sets.begin(), sets.end(), CountArangeDescriptors(count)); if (count > 0) { m_aranges.reserve(count); AddArangeDescriptors range_adder(m_aranges); for_each(sets.begin(), sets.end(), range_adder); } // puts("\n\nDWARFDebugAranges list is:\n"); // for_each(m_aranges.begin(), m_aranges.end(), PrintRange); } return false; }
//---------------------------------------------------------------------- // 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; }
//---------------------------------------------------------------------- // Dump //---------------------------------------------------------------------- void DWARFDebugAranges::Dump(SymbolFileDWARF* dwarf2Data, Stream *s) { const DataExtractor &debug_aranges_data = dwarf2Data->get_debug_aranges_data(); if (debug_aranges_data.ValidOffset(0)) { uint32_t offset = 0; DWARFDebugArangeSet set; while (set.Extract(debug_aranges_data, &offset)) set.Dump(s); } else s->PutCString("< EMPTY >\n"); }