|
8 | 8 |
|
9 | 9 | #include "DWARFDebugRanges.h"
|
10 | 10 | #include "DWARFUnit.h"
|
| 11 | +#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h" |
11 | 12 |
|
12 | 13 | using namespace lldb_private;
|
13 | 14 |
|
14 |
| -static dw_addr_t GetBaseAddressMarker(uint32_t addr_size) { |
15 |
| - switch(addr_size) { |
16 |
| - case 2: |
17 |
| - return 0xffff; |
18 |
| - case 4: |
19 |
| - return 0xffffffff; |
20 |
| - case 8: |
21 |
| - return 0xffffffffffffffff; |
22 |
| - } |
23 |
| - llvm_unreachable("GetBaseAddressMarker unsupported address size."); |
24 |
| -} |
25 |
| - |
26 | 15 | DWARFDebugRanges::DWARFDebugRanges() : m_range_map() {}
|
27 | 16 |
|
28 | 17 | void DWARFDebugRanges::Extract(DWARFContext &context) {
|
29 |
| - DWARFRangeList range_list; |
30 |
| - lldb::offset_t offset = 0; |
31 |
| - dw_offset_t debug_ranges_offset = offset; |
32 |
| - while (Extract(context, &offset, range_list)) { |
33 |
| - range_list.Sort(); |
34 |
| - m_range_map[debug_ranges_offset] = range_list; |
35 |
| - debug_ranges_offset = offset; |
36 |
| - } |
37 |
| -} |
38 |
| - |
39 |
| -bool DWARFDebugRanges::Extract(DWARFContext &context, |
40 |
| - lldb::offset_t *offset_ptr, |
41 |
| - DWARFRangeList &range_list) { |
42 |
| - range_list.Clear(); |
43 |
| - |
44 |
| - lldb::offset_t range_offset = *offset_ptr; |
45 |
| - const DWARFDataExtractor &debug_ranges_data = context.getOrLoadRangesData(); |
46 |
| - uint32_t addr_size = debug_ranges_data.GetAddressByteSize(); |
47 |
| - dw_addr_t base_addr = 0; |
48 |
| - dw_addr_t base_addr_marker = GetBaseAddressMarker(addr_size); |
49 |
| - |
50 |
| - while ( |
51 |
| - debug_ranges_data.ValidOffsetForDataOfSize(*offset_ptr, 2 * addr_size)) { |
52 |
| - dw_addr_t begin = debug_ranges_data.GetMaxU64(offset_ptr, addr_size); |
53 |
| - dw_addr_t end = debug_ranges_data.GetMaxU64(offset_ptr, addr_size); |
54 |
| - |
55 |
| - if (!begin && !end) { |
56 |
| - // End of range list |
57 |
| - break; |
58 |
| - } |
59 |
| - |
60 |
| - if (begin == base_addr_marker) { |
61 |
| - base_addr = end; |
62 |
| - continue; |
| 18 | + llvm::DWARFDataExtractor extractor = |
| 19 | + context.getOrLoadRangesData().GetAsLLVM(); |
| 20 | + llvm::DWARFDebugRangeList extracted_list; |
| 21 | + uint64_t current_offset = 0; |
| 22 | + auto extract_next_list = [&] { |
| 23 | + if (auto error = extracted_list.extract(extractor, ¤t_offset)) { |
| 24 | + consumeError(std::move(error)); |
| 25 | + return false; |
63 | 26 | }
|
64 |
| - |
65 |
| - // Filter out empty ranges |
66 |
| - if (begin < end) |
67 |
| - range_list.Append(DWARFRangeList::Entry(begin + base_addr, end - begin)); |
| 27 | + return true; |
| 28 | + }; |
| 29 | + |
| 30 | + uint64_t previous_offset = current_offset; |
| 31 | + while (extractor.isValidOffset(current_offset) && extract_next_list()) { |
| 32 | + DWARFRangeList &lldb_range_list = m_range_map[previous_offset]; |
| 33 | + lldb_range_list.Reserve(extracted_list.getEntries().size()); |
| 34 | + for (auto &range : extracted_list.getEntries()) |
| 35 | + lldb_range_list.Append(range.StartAddress, |
| 36 | + range.EndAddress - range.StartAddress); |
| 37 | + lldb_range_list.Sort(); |
| 38 | + previous_offset = current_offset; |
68 | 39 | }
|
69 |
| - |
70 |
| - // Make sure we consumed at least something |
71 |
| - return range_offset != *offset_ptr; |
72 | 40 | }
|
73 | 41 |
|
74 | 42 | DWARFRangeList
|
|
0 commit comments