1 //===-- DWARFDebugRanges.h --------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 #ifndef SymbolFileDWARF_DWARFDebugRanges_h_ 11 #define SymbolFileDWARF_DWARFDebugRanges_h_ 12 13 #include "SymbolFileDWARF.h" 14 #include <map> 15 #include <vector> 16 17 18 class DWARFDebugRanges 19 { 20 public: 21 22 //------------------------------------------------------------------ 23 // Address range 24 //------------------------------------------------------------------ 25 struct Range 26 { 27 Range(dw_addr_t begin = DW_INVALID_ADDRESS, dw_addr_t end = DW_INVALID_ADDRESS) : 28 begin_offset(begin), 29 end_offset(end) 30 { 31 } 32 33 void Clear() 34 { 35 begin_offset = DW_INVALID_ADDRESS; 36 end_offset = DW_INVALID_ADDRESS; 37 } 38 39 dw_addr_t begin_offset; 40 dw_addr_t end_offset; 41 42 typedef std::vector<Range> collection; 43 typedef collection::iterator iterator; 44 typedef collection::const_iterator const_iterator; 45 46 }; 47 48 //------------------------------------------------------------------ 49 // Collection of ranges 50 //------------------------------------------------------------------ 51 struct RangeList 52 { 53 RangeList() : 54 ranges() 55 { 56 } 57 58 bool Extract(SymbolFileDWARF* dwarf2Data, uint32_t* offset_ptr); 59 bool AddRange(dw_addr_t lo_addr, dw_addr_t hi_addr); 60 void Clear() 61 { 62 ranges.clear(); 63 } 64 65 dw_addr_t LowestAddress(const dw_addr_t base_addr) const; 66 dw_addr_t HighestAddress(const dw_addr_t base_addr) const; 67 void AddOffset(dw_addr_t offset); 68 void SubtractOffset(dw_addr_t offset); 69 size_t Size() const; 70 const Range* RangeAtIndex(size_t i) const; 71 const Range* Lookup(dw_addr_t offset) const; 72 Range::collection ranges; 73 }; 74 75 DWARFDebugRanges(); 76 ~DWARFDebugRanges(); 77 void Extract(SymbolFileDWARF* dwarf2Data); 78 static void Dump(lldb_private::Stream &s, const lldb_private::DataExtractor& debug_ranges_data, uint32_t* offset_ptr, dw_addr_t cu_base_addr); 79 bool FindRanges(dw_offset_t debug_ranges_offset, DWARFDebugRanges::RangeList& range_list) const; 80 81 protected: 82 typedef std::map<dw_offset_t, RangeList> range_map; 83 typedef range_map::iterator range_map_iterator; 84 typedef range_map::const_iterator range_map_const_iterator; 85 range_map m_range_map; 86 }; 87 88 89 #endif // SymbolFileDWARF_DWARFDebugRanges_h_ 90