LLVM: lib/DebugInfo/DWARF/DWARFDebugAranges.cpp Source File (original) (raw)
1
2
3
4
5
6
7
8
16#include
17#include
18#include
19
20using namespace llvm;
21
22void DWARFDebugAranges::extract(
27 return;
29 DWARFDebugArangeSet Set;
30
32 if (Error E = Set.extract(DebugArangesData, &Offset, WarningHandler)) {
33 RecoverableErrorHandler(std::move(E));
34 return;
35 }
36 uint64_t CUOffset = Set.getCompileUnitDIEOffset();
37 for (const auto &Desc : Set.descriptors()) {
38 uint64_t LowPC = Desc.Address;
39 uint64_t HighPC = Desc.getEndAddress();
40 appendRange(CUOffset, LowPC, HighPC);
41 }
42 ParsedCUOffsets.insert(CUOffset);
43 }
44}
45
47 clear();
48 if (!CTX)
49 return;
50
51
56
57
58
59
62 if (ParsedCUOffsets.insert(CUOffset).second) {
64 if (!CURanges)
66 else
67 for (const auto &R : *CURanges)
68 appendRange(CUOffset, R.LowPC, R.HighPC);
69 }
70 }
71
72 construct();
73}
74
75void DWARFDebugAranges::clear() {
76 Endpoints.clear();
77 Aranges.clear();
78 ParsedCUOffsets.clear();
79}
80
81void DWARFDebugAranges::appendRange(uint64_t CUOffset, uint64_t LowPC,
83 if (LowPC >= HighPC)
84 return;
85 Endpoints.emplace_back(LowPC, CUOffset, true);
86 Endpoints.emplace_back(HighPC, CUOffset, false);
87}
88
89void DWARFDebugAranges::construct() {
90 std::multiset<uint64_t> ValidCUs;
91
93 uint64_t PrevAddress = -1ULL;
94 for (const auto &E : Endpoints) {
95 if (PrevAddress < E.Address && !ValidCUs.empty()) {
96
97
98
99 if (!Aranges.empty() && Aranges.back().HighPC() == PrevAddress &&
100 ValidCUs.find(Aranges.back().CUOffset) != ValidCUs.end()) {
101 Aranges.back().setHighPC(E.Address);
102 } else {
103 Aranges.emplace_back(PrevAddress, E.Address, *ValidCUs.begin());
104 }
105 }
106
107 if (E.IsRangeStart) {
108 ValidCUs.insert(E.CUOffset);
109 } else {
110 auto CUPos = ValidCUs.find(E.CUOffset);
111 assert(CUPos != ValidCUs.end());
112 ValidCUs.erase(CUPos);
113 }
114 PrevAddress = E.Address;
115 }
116 assert(ValidCUs.empty());
117
118
119 Endpoints.clear();
120 Endpoints.shrink_to_fit();
121}
122
124 RangeCollIterator It =
126 if (It != Aranges.end() && It->LowPC <= Address)
127 return It->CUOffset;
128 return -1ULL;
129}
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
DWARFContext This data structure is the top level entity that deals with dwarf debug information pars...
function_ref< void(Error)> getRecoverableErrorHandler()
compile_unit_range compile_units()
Get compile units in this context.
function_ref< void(Error)> getWarningHandler()
bool isLittleEndian() const
const DWARFObject & getDWARFObj() const
void generate(DWARFContext *CTX)
Definition DWARFDebugAranges.cpp:46
uint64_t findAddress(uint64_t Address) const
Definition DWARFDebugAranges.cpp:123
virtual StringRef getArangesSection() const
Lightweight error class with error context and mandatory checking.
Tagged union holding either a T or a Error.
Error takeError()
Take ownership of the stored error.
An efficient, type-erasing, non-owning reference to a callable.
This is an optimization pass for GlobalISel generic memory operations.
auto partition_point(R &&Range, Predicate P)
Binary search for the first iterator in a range where a predicate is false.
void sort(IteratorTy Start, IteratorTy End)