@@ -226,39 +226,47 @@ bool DWARFDebugInfoEntryMinimal::getLowAndHighPC(const DWARFUnit *U,
226
226
return (HighPC != -1ULL );
227
227
}
228
228
229
- void DWARFDebugInfoEntryMinimal::buildAddressRangeTable (
230
- const DWARFUnit *U, DWARFDebugAranges *DebugAranges,
231
- uint32_t UOffsetInAranges) const {
232
- if (AbbrevDecl) {
233
- if (isSubprogramDIE ()) {
234
- uint64_t LowPC, HighPC;
235
- if (getLowAndHighPC (U, LowPC, HighPC))
236
- DebugAranges->appendRange (UOffsetInAranges, LowPC, HighPC);
237
- // FIXME: try to append ranges from .debug_ranges section.
238
- }
239
-
240
- const DWARFDebugInfoEntryMinimal *Child = getFirstChild ();
241
- while (Child) {
242
- Child->buildAddressRangeTable (U, DebugAranges, UOffsetInAranges);
243
- Child = Child->getSibling ();
244
- }
245
- }
246
- }
247
-
248
- bool DWARFDebugInfoEntryMinimal::addressRangeContainsAddress (
249
- const DWARFUnit *U, const uint64_t Address) const {
229
+ DWARFAddressRangesVector
230
+ DWARFDebugInfoEntryMinimal::getAddressRanges (const DWARFUnit *U) const {
250
231
if (isNULL ())
251
- return false ;
232
+ return DWARFAddressRangesVector{};
233
+ // Single range specified by low/high PC.
252
234
uint64_t LowPC, HighPC;
253
- if (getLowAndHighPC (U, LowPC, HighPC))
254
- return (LowPC <= Address && Address <= HighPC);
255
- // Try to get address ranges from .debug_ranges section.
235
+ if (getLowAndHighPC (U, LowPC, HighPC)) {
236
+ return DWARFAddressRangesVector{std::make_pair (LowPC, HighPC)};
237
+ }
238
+ // Multiple ranges from .debug_ranges section.
256
239
uint32_t RangesOffset =
257
240
getAttributeValueAsSectionOffset (U, DW_AT_ranges, -1U );
258
241
if (RangesOffset != -1U ) {
259
242
DWARFDebugRangeList RangeList;
260
243
if (U->extractRangeList (RangesOffset, RangeList))
261
- return RangeList.containsAddress (U->getBaseAddress (), Address);
244
+ return RangeList.getAbsoluteRanges (U->getBaseAddress ());
245
+ }
246
+ return DWARFAddressRangesVector{};
247
+ }
248
+
249
+ void DWARFDebugInfoEntryMinimal::collectChildrenAddressRanges (
250
+ const DWARFUnit *U, DWARFAddressRangesVector& Ranges) const {
251
+ if (isNULL ())
252
+ return ;
253
+ if (isSubprogramDIE ()) {
254
+ const auto &DIERanges = getAddressRanges (U);
255
+ Ranges.insert (Ranges.end (), DIERanges.begin (), DIERanges.end ());
256
+ }
257
+
258
+ const DWARFDebugInfoEntryMinimal *Child = getFirstChild ();
259
+ while (Child) {
260
+ Child->collectChildrenAddressRanges (U, Ranges);
261
+ Child = Child->getSibling ();
262
+ }
263
+ }
264
+
265
+ bool DWARFDebugInfoEntryMinimal::addressRangeContainsAddress (
266
+ const DWARFUnit *U, const uint64_t Address) const {
267
+ for (const auto & R : getAddressRanges (U)) {
268
+ if (R.first <= Address && Address < R.second )
269
+ return true ;
262
270
}
263
271
return false ;
264
272
}
0 commit comments