@@ -108,6 +108,14 @@ static void dumpLocationExpr(raw_ostream &OS, const DWARFFormValue &FormValue,
108
108
return ;
109
109
}
110
110
111
+ static DWARFDie resolveReferencedType (DWARFDie D,
112
+ dwarf::Attribute Attr = DW_AT_type) {
113
+ return D.getAttributeValueAsReferencedDie (Attr).resolveTypeUnitReference ();
114
+ }
115
+ static DWARFDie resolveReferencedType (DWARFDie D, DWARFFormValue F) {
116
+ return D.getAttributeValueAsReferencedDie (F).resolveTypeUnitReference ();
117
+ }
118
+
111
119
namespace {
112
120
113
121
// FIXME: We should have pretty printers per language. Currently we print
@@ -181,7 +189,7 @@ struct DWARFTypePrinter {
181
189
DWARFDie skipQualifiers (DWARFDie D) {
182
190
while (D && (D.getTag () == DW_TAG_const_type ||
183
191
D.getTag () == DW_TAG_volatile_type))
184
- D = D. getAttributeValueAsReferencedDie (DW_AT_type );
192
+ D = resolveReferencedType (D );
185
193
return D;
186
194
}
187
195
@@ -209,7 +217,7 @@ struct DWARFTypePrinter {
209
217
OS << " void" ;
210
218
return DWARFDie ();
211
219
}
212
- DWARFDie Inner = D. getAttributeValueAsReferencedDie (DW_AT_type );
220
+ DWARFDie Inner = resolveReferencedType (D );
213
221
const dwarf::Tag T = D.getTag ();
214
222
switch (T) {
215
223
case DW_TAG_pointer_type: {
@@ -240,8 +248,7 @@ struct DWARFTypePrinter {
240
248
OS << ' (' ;
241
249
else if (Word)
242
250
OS << ' ' ;
243
- if (DWARFDie Cont =
244
- D.getAttributeValueAsReferencedDie (DW_AT_containing_type)) {
251
+ if (DWARFDie Cont = resolveReferencedType (D, DW_AT_containing_type)) {
245
252
appendQualifiedName (Cont);
246
253
OS << " ::" ;
247
254
}
@@ -339,10 +346,9 @@ struct DWARFTypePrinter {
339
346
case DW_TAG_pointer_type: {
340
347
if (needsParens (Inner))
341
348
OS << ' )' ;
342
- appendUnqualifiedNameAfter (
343
- Inner, Inner.getAttributeValueAsReferencedDie (DW_AT_type),
344
- /* SkipFirstParamIfArtificial=*/ D.getTag () ==
345
- DW_TAG_ptr_to_member_type);
349
+ appendUnqualifiedNameAfter (Inner, resolveReferencedType (Inner),
350
+ /* SkipFirstParamIfArtificial=*/ D.getTag () ==
351
+ DW_TAG_ptr_to_member_type);
346
352
break ;
347
353
}
348
354
/*
@@ -387,7 +393,7 @@ struct DWARFTypePrinter {
387
393
appendTemplateParameters (C, FirstParameter);
388
394
}
389
395
if (C.getTag () == dwarf::DW_TAG_template_value_parameter) {
390
- DWARFDie T = C. getAttributeValueAsReferencedDie (DW_AT_type );
396
+ DWARFDie T = resolveReferencedType (C );
391
397
Sep ();
392
398
if (T.getTag () == DW_TAG_enumeration_type) {
393
399
auto V = C.find (DW_AT_const_value);
@@ -523,9 +529,8 @@ struct DWARFTypePrinter {
523
529
continue ;
524
530
auto TypeAttr = C.find (DW_AT_type);
525
531
Sep ();
526
- appendQualifiedName (TypeAttr
527
- ? C.getAttributeValueAsReferencedDie (*TypeAttr)
528
- : DWARFDie ());
532
+ appendQualifiedName (TypeAttr ? resolveReferencedType (C, *TypeAttr)
533
+ : DWARFDie ());
529
534
}
530
535
if (IsTemplate && *FirstParameter && FirstParameter == &FirstParameterValue)
531
536
OS << ' <' ;
@@ -534,15 +539,15 @@ struct DWARFTypePrinter {
534
539
void decomposeConstVolatile (DWARFDie &N, DWARFDie &T, DWARFDie &C,
535
540
DWARFDie &V) {
536
541
(N.getTag () == DW_TAG_const_type ? C : V) = N;
537
- T = N. getAttributeValueAsReferencedDie (DW_AT_type );
542
+ T = resolveReferencedType (N );
538
543
if (T) {
539
544
auto Tag = T.getTag ();
540
545
if (Tag == DW_TAG_const_type) {
541
546
C = T;
542
- T = T. getAttributeValueAsReferencedDie (DW_AT_type );
547
+ T = resolveReferencedType (T );
543
548
} else if (Tag == DW_TAG_volatile_type) {
544
549
V = T;
545
- T = T. getAttributeValueAsReferencedDie (DW_AT_type );
550
+ T = resolveReferencedType (T );
546
551
}
547
552
}
548
553
}
@@ -552,12 +557,10 @@ struct DWARFTypePrinter {
552
557
DWARFDie T;
553
558
decomposeConstVolatile (N, T, C, V);
554
559
if (T && T.getTag () == DW_TAG_subroutine_type)
555
- appendSubroutineNameAfter (T,
556
- T.getAttributeValueAsReferencedDie (DW_AT_type),
557
- false , C.isValid (), V.isValid ());
560
+ appendSubroutineNameAfter (T, resolveReferencedType (T), false , C.isValid (),
561
+ V.isValid ());
558
562
else
559
- appendUnqualifiedNameAfter (
560
- T, T.getAttributeValueAsReferencedDie (DW_AT_type));
563
+ appendUnqualifiedNameAfter (T, resolveReferencedType (T));
561
564
}
562
565
void appendConstVolatileQualifierBefore (DWARFDie N) {
563
566
DWARFDie C;
@@ -567,7 +570,7 @@ struct DWARFTypePrinter {
567
570
bool Subroutine = T && T.getTag () == DW_TAG_subroutine_type;
568
571
DWARFDie A = T;
569
572
while (A && A.getTag () == DW_TAG_array_type)
570
- A = A. getAttributeValueAsReferencedDie (DW_AT_type );
573
+ A = resolveReferencedType (A );
571
574
bool Leading =
572
575
(!A || (A.getTag () != DW_TAG_pointer_type &&
573
576
A.getTag () != llvm::dwarf::DW_TAG_ptr_to_member_type)) &&
@@ -611,7 +614,7 @@ struct DWARFTypePrinter {
611
614
for (DWARFDie P : D) {
612
615
if (P.getTag () != DW_TAG_formal_parameter)
613
616
return ;
614
- DWARFDie T = P. getAttributeValueAsReferencedDie (DW_AT_type );
617
+ DWARFDie T = resolveReferencedType (P );
615
618
if (SkipFirstParamIfArtificial && RealFirst && P.find (DW_AT_artificial)) {
616
619
FirstParamIfArtificial = T;
617
620
RealFirst = false ;
@@ -631,7 +634,7 @@ struct DWARFTypePrinter {
631
634
DWARFDie C;
632
635
DWARFDie V;
633
636
auto CVStep = [&](DWARFDie CV) {
634
- if (DWARFDie U = CV. getAttributeValueAsReferencedDie (DW_AT_type )) {
637
+ if (DWARFDie U = resolveReferencedType (CV )) {
635
638
if (U.getTag () == DW_TAG_const_type)
636
639
return C = U;
637
640
if (U.getTag () == DW_TAG_volatile_type)
@@ -658,8 +661,7 @@ struct DWARFTypePrinter {
658
661
OS << " &" ;
659
662
if (D.find (DW_AT_rvalue_reference))
660
663
OS << " &&" ;
661
- appendUnqualifiedNameAfter (
662
- Inner, Inner.getAttributeValueAsReferencedDie (DW_AT_type));
664
+ appendUnqualifiedNameAfter (Inner, resolveReferencedType (Inner));
663
665
}
664
666
void appendScopes (DWARFDie D) {
665
667
if (D.getTag () == DW_TAG_compile_unit)
@@ -670,6 +672,7 @@ struct DWARFTypePrinter {
670
672
return ;
671
673
if (D.getTag () == DW_TAG_subprogram)
672
674
return ;
675
+ D = D.resolveTypeUnitReference ();
673
676
if (DWARFDie P = D.getParent ())
674
677
appendScopes (P);
675
678
appendUnqualifiedName (D);
@@ -761,7 +764,7 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
761
764
DINameKind::LinkageName))
762
765
OS << Space << " \" " << Name << ' \" ' ;
763
766
} else if (Attr == DW_AT_type) {
764
- DWARFDie D = Die. getAttributeValueAsReferencedDie ( FormValue);
767
+ DWARFDie D = resolveReferencedType (Die, FormValue);
765
768
if (D && !D.isNULL ()) {
766
769
OS << Space << " \" " ;
767
770
DWARFTypePrinter (OS).appendQualifiedName (D);
@@ -873,13 +876,27 @@ DWARFDie::getAttributeValueAsReferencedDie(dwarf::Attribute Attr) const {
873
876
874
877
DWARFDie
875
878
DWARFDie::getAttributeValueAsReferencedDie (const DWARFFormValue &V) const {
879
+ DWARFDie Result;
876
880
if (auto SpecRef = V.getAsRelativeReference ()) {
877
881
if (SpecRef->Unit )
878
- return SpecRef->Unit ->getDIEForOffset (SpecRef->Unit ->getOffset () + SpecRef->Offset );
879
- if (auto SpecUnit = U->getUnitVector ().getUnitForOffset (SpecRef->Offset ))
880
- return SpecUnit->getDIEForOffset (SpecRef->Offset );
882
+ Result = SpecRef->Unit ->getDIEForOffset (SpecRef->Unit ->getOffset () +
883
+ SpecRef->Offset );
884
+ else if (auto SpecUnit =
885
+ U->getUnitVector ().getUnitForOffset (SpecRef->Offset ))
886
+ Result = SpecUnit->getDIEForOffset (SpecRef->Offset );
881
887
}
882
- return DWARFDie ();
888
+ return Result;
889
+ }
890
+
891
+ DWARFDie DWARFDie::resolveTypeUnitReference () const {
892
+ if (auto Attr = find (DW_AT_signature)) {
893
+ if (Optional<uint64_t > Sig = Attr->getAsReferenceUVal ()) {
894
+ if (DWARFTypeUnit *TU =
895
+ U->getContext ().getTypeUnitForHash (U->getVersion (), *Sig))
896
+ return TU->getDIEForOffset (TU->getTypeOffset () + TU->getOffset ());
897
+ }
898
+ }
899
+ return *this ;
883
900
}
884
901
885
902
Optional<uint64_t > DWARFDie::getRangesBaseAttribute () const {
0 commit comments