Skip to content

Commit 70aad4e

Browse files
[lldb][NFCI] Use llvm's libDebugInfo for DebugRanges
In an effort to unify the different dwarf parsers available in the codebase, this commit removes LLDB's custom parsing for the `.debug_ranges` DWARF section, instead calling into LLVM's parser. Subsequent work should look into unifying `llvm::DWARDebugRangeList` (whose entries are pairs of (start, end) addresses) with `lldb::DWARFRangeList` (whose entries are pairs of (start, length)). The lists themselves are also different data structures, but functionally equivalent. Depends on D150363 Differential Revision: https://reviews.llvm.org/D150366
1 parent b91e78d commit 70aad4e

File tree

2 files changed

+21
-56
lines changed

2 files changed

+21
-56
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.cpp

Lines changed: 21 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -8,67 +8,35 @@
88

99
#include "DWARFDebugRanges.h"
1010
#include "DWARFUnit.h"
11+
#include "llvm/DebugInfo/DWARF/DWARFDebugRangeList.h"
1112

1213
using namespace lldb_private;
1314

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-
2615
DWARFDebugRanges::DWARFDebugRanges() : m_range_map() {}
2716

2817
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, &current_offset)) {
24+
consumeError(std::move(error));
25+
return false;
6326
}
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;
6839
}
69-
70-
// Make sure we consumed at least something
71-
return range_offset != *offset_ptr;
7240
}
7341

7442
DWARFRangeList

lldb/source/Plugins/SymbolFile/DWARF/DWARFDebugRanges.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -26,9 +26,6 @@ class DWARFDebugRanges {
2626
dw_offset_t debug_ranges_offset) const;
2727

2828
protected:
29-
bool Extract(lldb_private::DWARFContext &context, lldb::offset_t *offset_ptr,
30-
DWARFRangeList &range_list);
31-
3229
std::map<dw_offset_t, DWARFRangeList> m_range_map;
3330
};
3431

0 commit comments

Comments
 (0)