@@ -62,10 +62,17 @@ void DWARFTypePrinter::appendArrayType(const DWARFDie &D) {
62
62
EndedWithTemplate = false ;
63
63
}
64
64
65
+ static DWARFDie resolveReferencedType (DWARFDie D,
66
+ dwarf::Attribute Attr = DW_AT_type) {
67
+ return D.getAttributeValueAsReferencedDie (Attr).resolveTypeUnitReference ();
68
+ }
69
+ static DWARFDie resolveReferencedType (DWARFDie D, DWARFFormValue F) {
70
+ return D.getAttributeValueAsReferencedDie (F).resolveTypeUnitReference ();
71
+ }
65
72
DWARFDie DWARFTypePrinter::skipQualifiers (DWARFDie D) {
66
73
while (D && (D.getTag () == DW_TAG_const_type ||
67
74
D.getTag () == DW_TAG_volatile_type))
68
- D = D. getAttributeValueAsReferencedDie (DW_AT_type );
75
+ D = resolveReferencedType (D );
69
76
return D;
70
77
}
71
78
@@ -96,9 +103,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
96
103
return DWARFDie ();
97
104
}
98
105
DWARFDie InnerDIE;
99
- auto Inner = [&] {
100
- return InnerDIE = D.getAttributeValueAsReferencedDie (DW_AT_type);
101
- };
106
+ auto Inner = [&] { return InnerDIE = resolveReferencedType (D); };
102
107
const dwarf::Tag T = D.getTag ();
103
108
switch (T) {
104
109
case DW_TAG_pointer_type: {
@@ -129,8 +134,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
129
134
OS << ' (' ;
130
135
else if (Word)
131
136
OS << ' ' ;
132
- if (DWARFDie Cont =
133
- D.getAttributeValueAsReferencedDie (DW_AT_containing_type)) {
137
+ if (DWARFDie Cont = resolveReferencedType (D, DW_AT_containing_type)) {
134
138
appendQualifiedName (Cont);
135
139
EndedWithTemplate = false ;
136
140
OS << " ::" ;
@@ -169,8 +173,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
169
173
case DW_TAG_base_type:
170
174
*/
171
175
default : {
172
- const char *NamePtr =
173
- dwarf::toString (D.findRecursively (DW_AT_name), nullptr );
176
+ const char *NamePtr = dwarf::toString (D.find (DW_AT_name), nullptr );
174
177
if (!NamePtr) {
175
178
appendTypeTagName (D.getTag ());
176
179
return DWARFDie ();
@@ -232,9 +235,9 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter(
232
235
case DW_TAG_pointer_type: {
233
236
if (needsParens (Inner))
234
237
OS << ' )' ;
235
- appendUnqualifiedNameAfter (
236
- Inner, Inner. getAttributeValueAsReferencedDie (DW_AT_type),
237
- /* SkipFirstParamIfArtificial= */ D. getTag () == DW_TAG_ptr_to_member_type);
238
+ appendUnqualifiedNameAfter (Inner, resolveReferencedType (Inner),
239
+ /* SkipFirstParamIfArtificial= */ D. getTag () ==
240
+ DW_TAG_ptr_to_member_type);
238
241
break ;
239
242
}
240
243
case DW_TAG_LLVM_ptrauth_type: {
@@ -338,7 +341,7 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
338
341
appendTemplateParameters (C, FirstParameter);
339
342
}
340
343
if (C.getTag () == dwarf::DW_TAG_template_value_parameter) {
341
- DWARFDie T = C. getAttributeValueAsReferencedDie (DW_AT_type );
344
+ DWARFDie T = resolveReferencedType (C );
342
345
Sep ();
343
346
if (T.getTag () == DW_TAG_enumeration_type) {
344
347
OS << ' (' ;
@@ -458,7 +461,7 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
458
461
continue ;
459
462
auto TypeAttr = C.find (DW_AT_type);
460
463
Sep ();
461
- appendQualifiedName (TypeAttr ? C. getAttributeValueAsReferencedDie ( *TypeAttr)
464
+ appendQualifiedName (TypeAttr ? resolveReferencedType (C, *TypeAttr)
462
465
: DWARFDie ());
463
466
}
464
467
if (IsTemplate && *FirstParameter && FirstParameter == &FirstParameterValue) {
@@ -470,15 +473,15 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
470
473
void DWARFTypePrinter::decomposeConstVolatile (DWARFDie &N, DWARFDie &T,
471
474
DWARFDie &C, DWARFDie &V) {
472
475
(N.getTag () == DW_TAG_const_type ? C : V) = N;
473
- T = N. getAttributeValueAsReferencedDie (DW_AT_type );
476
+ T = resolveReferencedType (N );
474
477
if (T) {
475
478
auto Tag = T.getTag ();
476
479
if (Tag == DW_TAG_const_type) {
477
480
C = T;
478
- T = T. getAttributeValueAsReferencedDie (DW_AT_type );
481
+ T = resolveReferencedType (T );
479
482
} else if (Tag == DW_TAG_volatile_type) {
480
483
V = T;
481
- T = T. getAttributeValueAsReferencedDie (DW_AT_type );
484
+ T = resolveReferencedType (T );
482
485
}
483
486
}
484
487
}
@@ -488,11 +491,10 @@ void DWARFTypePrinter::appendConstVolatileQualifierAfter(DWARFDie N) {
488
491
DWARFDie T;
489
492
decomposeConstVolatile (N, T, C, V);
490
493
if (T && T.getTag () == DW_TAG_subroutine_type)
491
- appendSubroutineNameAfter (T, T. getAttributeValueAsReferencedDie (DW_AT_type ),
492
- false , C. isValid (), V.isValid ());
494
+ appendSubroutineNameAfter (T, resolveReferencedType (T), false , C. isValid ( ),
495
+ V.isValid ());
493
496
else
494
- appendUnqualifiedNameAfter (T,
495
- T.getAttributeValueAsReferencedDie (DW_AT_type));
497
+ appendUnqualifiedNameAfter (T, resolveReferencedType (T));
496
498
}
497
499
void DWARFTypePrinter::appendConstVolatileQualifierBefore (DWARFDie N) {
498
500
DWARFDie C;
@@ -502,7 +504,7 @@ void DWARFTypePrinter::appendConstVolatileQualifierBefore(DWARFDie N) {
502
504
bool Subroutine = T && T.getTag () == DW_TAG_subroutine_type;
503
505
DWARFDie A = T;
504
506
while (A && A.getTag () == DW_TAG_array_type)
505
- A = A. getAttributeValueAsReferencedDie (DW_AT_type );
507
+ A = resolveReferencedType (A );
506
508
bool Leading =
507
509
(!A || (A.getTag () != DW_TAG_pointer_type &&
508
510
A.getTag () != llvm::dwarf::DW_TAG_ptr_to_member_type)) &&
@@ -544,7 +546,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
544
546
if (P.getTag () != DW_TAG_formal_parameter &&
545
547
P.getTag () != DW_TAG_unspecified_parameters)
546
548
return ;
547
- DWARFDie T = P. getAttributeValueAsReferencedDie (DW_AT_type );
549
+ DWARFDie T = resolveReferencedType (P );
548
550
if (SkipFirstParamIfArtificial && RealFirst && P.find (DW_AT_artificial)) {
549
551
FirstParamIfArtificial = T;
550
552
RealFirst = false ;
@@ -565,7 +567,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
565
567
if (DWARFDie P = FirstParamIfArtificial) {
566
568
if (P.getTag () == DW_TAG_pointer_type) {
567
569
auto CVStep = [&](DWARFDie CV) {
568
- if (DWARFDie U = CV. getAttributeValueAsReferencedDie (DW_AT_type )) {
570
+ if (DWARFDie U = resolveReferencedType (CV )) {
569
571
Const |= U.getTag () == DW_TAG_const_type;
570
572
Volatile |= U.getTag () == DW_TAG_volatile_type;
571
573
return U;
@@ -651,8 +653,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
651
653
if (D.find (DW_AT_rvalue_reference))
652
654
OS << " &&" ;
653
655
654
- appendUnqualifiedNameAfter (
655
- Inner, Inner.getAttributeValueAsReferencedDie (DW_AT_type));
656
+ appendUnqualifiedNameAfter (Inner, resolveReferencedType (Inner));
656
657
}
657
658
void DWARFTypePrinter::appendScopes (DWARFDie D) {
658
659
if (D.getTag () == DW_TAG_compile_unit)
@@ -665,6 +666,7 @@ void DWARFTypePrinter::appendScopes(DWARFDie D) {
665
666
return ;
666
667
if (D.getTag () == DW_TAG_lexical_block)
667
668
return ;
669
+ D = D.resolveTypeUnitReference ();
668
670
if (DWARFDie P = D.getParent ())
669
671
appendScopes (P);
670
672
appendUnqualifiedName (D);
0 commit comments