23 void DWARFDebugAranges::extract(
33 if (
Error E = Set.
extract(DebugArangesData, &Offset, WarningHandler)) {
40 uint64_t HighPC = Desc.getEndAddress();
41 appendRange(CUOffset, LowPC, HighPC);
43 ParsedCUOffsets.
insert(CUOffset);
63 if (ParsedCUOffsets.
insert(CUOffset).second) {
68 for (
const auto &R : *CURanges)
69 appendRange(CUOffset, R.LowPC, R.HighPC);
76 void DWARFDebugAranges::clear() {
79 ParsedCUOffsets.
clear();
86 Endpoints.emplace_back(LowPC, CUOffset,
true);
87 Endpoints.emplace_back(HighPC, CUOffset,
false);
90 void DWARFDebugAranges::construct() {
91 std::multiset<uint64_t> ValidCUs;
95 for (
const auto &
E : Endpoints) {
96 if (PrevAddress <
E.Address && !ValidCUs.empty()) {
100 if (!Aranges.empty() && Aranges.back().HighPC() == PrevAddress &&
101 ValidCUs.find(Aranges.back().CUOffset) != ValidCUs.end()) {
102 Aranges.back().setHighPC(
E.Address);
104 Aranges.emplace_back(PrevAddress,
E.Address, *ValidCUs.begin());
108 if (
E.IsRangeStart) {
109 ValidCUs.insert(
E.CUOffset);
111 auto CUPos = ValidCUs.find(
E.CUOffset);
112 assert(CUPos != ValidCUs.end());
113 ValidCUs.erase(CUPos);
115 PrevAddress =
E.Address;
121 Endpoints.shrink_to_fit();
125 RangeCollIterator It =
126 partition_point(Aranges, [=](Range R) {
return R.HighPC() <= Address; });
127 if (It != Aranges.end() && It->LowPC <= Address)