@@ -355,8 +355,7 @@ void DWARFDebugInfoEntry::GetAttributes(DWARFUnit *cu,
355
355
// would be a compile unit header).
356
356
dw_offset_t DWARFDebugInfoEntry::GetAttributeValue (
357
357
const DWARFUnit *cu, const dw_attr_t attr, DWARFFormValue &form_value,
358
- dw_offset_t *end_attr_offset_ptr,
359
- bool check_specification_or_abstract_origin) const {
358
+ dw_offset_t *end_attr_offset_ptr, bool check_elaborating_dies) const {
360
359
if (const auto *abbrevDecl = GetAbbreviationDeclarationPtr (cu)) {
361
360
std::optional<uint32_t > attr_idx = abbrevDecl->findAttributeIndex (attr);
362
361
@@ -380,25 +379,18 @@ dw_offset_t DWARFDebugInfoEntry::GetAttributeValue(
380
379
}
381
380
}
382
381
383
- if (check_specification_or_abstract_origin) {
384
- if (GetAttributeValue (cu, DW_AT_specification, form_value)) {
382
+ if (check_elaborating_dies) {
383
+ for (dw_attr_t elaborating_attr :
384
+ {DW_AT_specification, DW_AT_abstract_origin, DW_AT_signature}) {
385
+ if (!GetAttributeValue (cu, elaborating_attr, form_value))
386
+ continue ;
385
387
DWARFDIE die = form_value.Reference ();
386
- if (die) {
387
- dw_offset_t die_offset = die.GetDIE ()->GetAttributeValue (
388
- die.GetCU (), attr, form_value, end_attr_offset_ptr, false );
389
- if (die_offset)
390
- return die_offset;
391
- }
392
- }
393
-
394
- if (GetAttributeValue (cu, DW_AT_abstract_origin, form_value)) {
395
- DWARFDIE die = form_value.Reference ();
396
- if (die) {
397
- dw_offset_t die_offset = die.GetDIE ()->GetAttributeValue (
398
- die.GetCU (), attr, form_value, end_attr_offset_ptr, false );
399
- if (die_offset)
400
- return die_offset;
401
- }
388
+ if (!die)
389
+ continue ;
390
+ dw_offset_t die_offset = die.GetDIE ()->GetAttributeValue (
391
+ die.GetCU (), attr, form_value, end_attr_offset_ptr, false );
392
+ if (die_offset)
393
+ return die_offset;
402
394
}
403
395
}
404
396
return 0 ;
@@ -412,10 +404,9 @@ dw_offset_t DWARFDebugInfoEntry::GetAttributeValue(
412
404
// doesn't change.
413
405
const char *DWARFDebugInfoEntry::GetAttributeValueAsString (
414
406
const DWARFUnit *cu, const dw_attr_t attr, const char *fail_value,
415
- bool check_specification_or_abstract_origin ) const {
407
+ bool check_elaborating_dies ) const {
416
408
DWARFFormValue form_value;
417
- if (GetAttributeValue (cu, attr, form_value, nullptr ,
418
- check_specification_or_abstract_origin))
409
+ if (GetAttributeValue (cu, attr, form_value, nullptr , check_elaborating_dies))
419
410
return form_value.AsCString ();
420
411
return fail_value;
421
412
}
@@ -425,21 +416,19 @@ const char *DWARFDebugInfoEntry::GetAttributeValueAsString(
425
416
// Get the value of an attribute as unsigned and return it.
426
417
uint64_t DWARFDebugInfoEntry::GetAttributeValueAsUnsigned (
427
418
const DWARFUnit *cu, const dw_attr_t attr, uint64_t fail_value,
428
- bool check_specification_or_abstract_origin ) const {
419
+ bool check_elaborating_dies ) const {
429
420
DWARFFormValue form_value;
430
- if (GetAttributeValue (cu, attr, form_value, nullptr ,
431
- check_specification_or_abstract_origin))
421
+ if (GetAttributeValue (cu, attr, form_value, nullptr , check_elaborating_dies))
432
422
return form_value.Unsigned ();
433
423
return fail_value;
434
424
}
435
425
436
426
std::optional<uint64_t >
437
427
DWARFDebugInfoEntry::GetAttributeValueAsOptionalUnsigned (
438
428
const DWARFUnit *cu, const dw_attr_t attr,
439
- bool check_specification_or_abstract_origin ) const {
429
+ bool check_elaborating_dies ) const {
440
430
DWARFFormValue form_value;
441
- if (GetAttributeValue (cu, attr, form_value, nullptr ,
442
- check_specification_or_abstract_origin))
431
+ if (GetAttributeValue (cu, attr, form_value, nullptr , check_elaborating_dies))
443
432
return form_value.Unsigned ();
444
433
return std::nullopt;
445
434
}
@@ -450,20 +439,18 @@ DWARFDebugInfoEntry::GetAttributeValueAsOptionalUnsigned(
450
439
// relative offsets as needed.
451
440
DWARFDIE DWARFDebugInfoEntry::GetAttributeValueAsReference (
452
441
const DWARFUnit *cu, const dw_attr_t attr,
453
- bool check_specification_or_abstract_origin ) const {
442
+ bool check_elaborating_dies ) const {
454
443
DWARFFormValue form_value;
455
- if (GetAttributeValue (cu, attr, form_value, nullptr ,
456
- check_specification_or_abstract_origin))
444
+ if (GetAttributeValue (cu, attr, form_value, nullptr , check_elaborating_dies))
457
445
return form_value.Reference ();
458
446
return {};
459
447
}
460
448
461
449
uint64_t DWARFDebugInfoEntry::GetAttributeValueAsAddress (
462
450
const DWARFUnit *cu, const dw_attr_t attr, uint64_t fail_value,
463
- bool check_specification_or_abstract_origin ) const {
451
+ bool check_elaborating_dies ) const {
464
452
DWARFFormValue form_value;
465
- if (GetAttributeValue (cu, attr, form_value, nullptr ,
466
- check_specification_or_abstract_origin))
453
+ if (GetAttributeValue (cu, attr, form_value, nullptr , check_elaborating_dies))
467
454
return form_value.Address ();
468
455
return fail_value;
469
456
}
@@ -474,12 +461,13 @@ uint64_t DWARFDebugInfoEntry::GetAttributeValueAsAddress(
474
461
// pc>.
475
462
//
476
463
// Returns the hi_pc or fail_value.
477
- dw_addr_t DWARFDebugInfoEntry::GetAttributeHighPC (
478
- const DWARFUnit *cu, dw_addr_t lo_pc, uint64_t fail_value,
479
- bool check_specification_or_abstract_origin) const {
464
+ dw_addr_t
465
+ DWARFDebugInfoEntry::GetAttributeHighPC (const DWARFUnit *cu, dw_addr_t lo_pc,
466
+ uint64_t fail_value,
467
+ bool check_elaborating_dies) const {
480
468
DWARFFormValue form_value;
481
469
if (GetAttributeValue (cu, DW_AT_high_pc, form_value, nullptr ,
482
- check_specification_or_abstract_origin )) {
470
+ check_elaborating_dies )) {
483
471
dw_form_t form = form_value.Form ();
484
472
if (form == DW_FORM_addr || form == DW_FORM_addrx ||
485
473
form == DW_FORM_GNU_addr_index)
@@ -499,12 +487,11 @@ dw_addr_t DWARFDebugInfoEntry::GetAttributeHighPC(
499
487
// Returns true or sets lo_pc and hi_pc to fail_value.
500
488
bool DWARFDebugInfoEntry::GetAttributeAddressRange (
501
489
const DWARFUnit *cu, dw_addr_t &lo_pc, dw_addr_t &hi_pc,
502
- uint64_t fail_value, bool check_specification_or_abstract_origin ) const {
490
+ uint64_t fail_value, bool check_elaborating_dies ) const {
503
491
lo_pc = GetAttributeValueAsAddress (cu, DW_AT_low_pc, fail_value,
504
- check_specification_or_abstract_origin );
492
+ check_elaborating_dies );
505
493
if (lo_pc != fail_value) {
506
- hi_pc = GetAttributeHighPC (cu, lo_pc, fail_value,
507
- check_specification_or_abstract_origin);
494
+ hi_pc = GetAttributeHighPC (cu, lo_pc, fail_value, check_elaborating_dies);
508
495
if (hi_pc != fail_value)
509
496
return true ;
510
497
}
@@ -514,8 +501,7 @@ bool DWARFDebugInfoEntry::GetAttributeAddressRange(
514
501
}
515
502
516
503
DWARFRangeList DWARFDebugInfoEntry::GetAttributeAddressRanges (
517
- DWARFUnit *cu, bool check_hi_lo_pc,
518
- bool check_specification_or_abstract_origin) const {
504
+ DWARFUnit *cu, bool check_hi_lo_pc, bool check_elaborating_dies) const {
519
505
520
506
DWARFFormValue form_value;
521
507
if (GetAttributeValue (cu, DW_AT_ranges, form_value))
@@ -526,7 +512,7 @@ DWARFRangeList DWARFDebugInfoEntry::GetAttributeAddressRanges(
526
512
dw_addr_t lo_pc = LLDB_INVALID_ADDRESS;
527
513
dw_addr_t hi_pc = LLDB_INVALID_ADDRESS;
528
514
if (GetAttributeAddressRange (cu, lo_pc, hi_pc, LLDB_INVALID_ADDRESS,
529
- check_specification_or_abstract_origin )) {
515
+ check_elaborating_dies )) {
530
516
if (lo_pc < hi_pc)
531
517
ranges.Append (DWARFRangeList::Entry (lo_pc, hi_pc - lo_pc));
532
518
}
0 commit comments