19 void DWARFDebugAranges::extract(
DataExtractor DebugArangesData) {
23 typedef std::vector<DWARFDebugArangeSet> RangeSetColl;
26 uint32_t TotalRanges = 0;
28 while (Set.
extract(DebugArangesData, &Offset)) {
35 Aranges.reserve(TotalRanges);
36 for (RangeSetColl::const_iterator
I = Sets.begin(), E = Sets.end();
I != E;
38 uint32_t CUOffset =
I->getCompileUnitDIEOffset();
40 for (uint32_t i = 0, n =
I->getNumDescriptors(); i < n; ++i) {
43 uint64_t LowPC = ArangeDescPtr->
Address;
44 uint64_t HighPC = LowPC + ArangeDescPtr->
Length;
64 uint32_t CUOffset = CU->getOffset();
65 if (ParsedCUOffsets.
insert(CUOffset).second)
66 CU->buildAddressRangeTable(
this,
true, CUOffset);
75 if (!Aranges.empty()) {
76 if (Aranges.back().CUOffset == CUOffset &&
77 Aranges.back().HighPC() == LowPC) {
78 Aranges.back().setHighPC(HighPC);
82 Aranges.push_back(Range(LowPC, HighPC, CUOffset));
85 void DWARFDebugAranges::sortAndMinimize() {
86 const size_t orig_arange_size = Aranges.size();
88 if (orig_arange_size <= 1)
91 std::stable_sort(Aranges.begin(), Aranges.end());
103 size_t minimal_size = 1;
104 for (
size_t i = 1; i < orig_arange_size; ++i) {
105 if (!Range::SortedOverlapCheck(Aranges[i-1], Aranges[i]))
111 if (minimal_size == orig_arange_size)
115 RangeColl minimal_aranges;
116 minimal_aranges.resize(minimal_size);
118 minimal_aranges[j] = Aranges[0];
119 for (
size_t i = 1; i < orig_arange_size; ++i) {
120 if (Range::SortedOverlapCheck(minimal_aranges[j], Aranges[i])) {
121 minimal_aranges[j].setHighPC(Aranges[i].HighPC());
124 minimal_aranges[++j] = Aranges[i];
127 assert(j+1 == minimal_size);
132 minimal_aranges.swap(Aranges);
136 if (!Aranges.empty()) {
137 Range range(Address);
138 RangeCollIterator
begin = Aranges.begin();
139 RangeCollIterator
end = Aranges.end();
140 RangeCollIterator pos =
141 std::lower_bound(begin, end, range);
143 if (pos != end && pos->containsAddress(Address)) {
144 return pos->CUOffset;
145 }
else if (pos != begin) {
147 if (pos->containsAddress(Address))
148 return pos->CUOffset;
const_iterator end(StringRef path)
Get end iterator over path.
const_iterator begin(StringRef path)
Get begin iterator over path.
void generate(DWARFContext *CTX)
unsigned getNumCompileUnits()
Get the number of compile units in this context.
DWARFCompileUnit * getCompileUnitAtIndex(unsigned index)
Get the compile unit at the specified index for this compile unit.
uint32_t getNumDescriptors() const
std::pair< iterator, bool > insert(const ValueT &V)
bool extract(DataExtractor data, uint32_t *offset_ptr)
void appendRange(uint32_t CUOffset, uint64_t LowPC, uint64_t HighPC)
virtual StringRef getARangeSection()=0
uint32_t findAddress(uint64_t Address) const
virtual bool isLittleEndian() const =0