Skip to content

Commit 72cb20f

Browse files
authored
Revert "[llvm/DWARF] Recursively resolve DW_AT_signature references (#97423)"
This reverts commit e93df78.
1 parent cbd2559 commit 72cb20f

File tree

4 files changed

+55
-54
lines changed

4 files changed

+55
-54
lines changed

llvm/include/llvm/DebugInfo/DWARF/DWARFDie.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -181,6 +181,8 @@ class DWARFDie {
181181
DWARFDie getAttributeValueAsReferencedDie(dwarf::Attribute Attr) const;
182182
DWARFDie getAttributeValueAsReferencedDie(const DWARFFormValue &V) const;
183183

184+
DWARFDie resolveTypeUnitReference() const;
185+
184186
/// Extract the range base attribute from this DIE as absolute section offset.
185187
///
186188
/// This is a utility function that checks for either the DW_AT_rnglists_base

llvm/lib/DebugInfo/DWARF/DWARFDie.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,10 @@ static void dumpLocationExpr(raw_ostream &OS, const DWARFFormValue &FormValue,
103103
.print(OS, DumpOpts, U);
104104
}
105105

106+
static DWARFDie resolveReferencedType(DWARFDie D, DWARFFormValue F) {
107+
return D.getAttributeValueAsReferencedDie(F).resolveTypeUnitReference();
108+
}
109+
106110
static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
107111
const DWARFAttribute &AttrValue, unsigned Indent,
108112
DIDumpOptions DumpOpts) {
@@ -194,8 +198,8 @@ static void dumpAttribute(raw_ostream &OS, const DWARFDie &Die,
194198
DINameKind::LinkageName))
195199
OS << Space << "\"" << Name << '\"';
196200
} else if (Attr == DW_AT_type || Attr == DW_AT_containing_type) {
197-
if (DWARFDie D = Die.getAttributeValueAsReferencedDie(FormValue);
198-
D && !D.isNULL()) {
201+
DWARFDie D = resolveReferencedType(Die, FormValue);
202+
if (D && !D.isNULL()) {
199203
OS << Space << "\"";
200204
dumpTypeQualifiedName(D, OS);
201205
OS << '"';
@@ -287,12 +291,13 @@ DWARFDie::findRecursively(ArrayRef<dwarf::Attribute> Attrs) const {
287291
if (auto Value = Die.find(Attrs))
288292
return Value;
289293

290-
for (dwarf::Attribute Attr :
291-
{DW_AT_abstract_origin, DW_AT_specification, DW_AT_signature}) {
292-
if (auto D = Die.getAttributeValueAsReferencedDie(Attr))
293-
if (Seen.insert(D).second)
294-
Worklist.push_back(D);
295-
}
294+
if (auto D = Die.getAttributeValueAsReferencedDie(DW_AT_abstract_origin))
295+
if (Seen.insert(D).second)
296+
Worklist.push_back(D);
297+
298+
if (auto D = Die.getAttributeValueAsReferencedDie(DW_AT_specification))
299+
if (Seen.insert(D).second)
300+
Worklist.push_back(D);
296301
}
297302

298303
return std::nullopt;
@@ -314,14 +319,21 @@ DWARFDie::getAttributeValueAsReferencedDie(const DWARFFormValue &V) const {
314319
} else if (Offset = V.getAsDebugInfoReference(); Offset) {
315320
if (DWARFUnit *SpecUnit = U->getUnitVector().getUnitForOffset(*Offset))
316321
Result = SpecUnit->getDIEForOffset(*Offset);
317-
} else if (std::optional<uint64_t> Sig = V.getAsSignatureReference()) {
318-
if (DWARFTypeUnit *TU = U->getContext().getTypeUnitForHash(
319-
U->getVersion(), *Sig, U->isDWOUnit()))
320-
Result = TU->getDIEForOffset(TU->getTypeOffset() + TU->getOffset());
321322
}
322323
return Result;
323324
}
324325

326+
DWARFDie DWARFDie::resolveTypeUnitReference() const {
327+
if (auto Attr = find(DW_AT_signature)) {
328+
if (std::optional<uint64_t> Sig = Attr->getAsReferenceUVal()) {
329+
if (DWARFTypeUnit *TU = U->getContext().getTypeUnitForHash(
330+
U->getVersion(), *Sig, U->isDWOUnit()))
331+
return TU->getDIEForOffset(TU->getTypeOffset() + TU->getOffset());
332+
}
333+
}
334+
return *this;
335+
}
336+
325337
std::optional<uint64_t> DWARFDie::getRangesBaseAttribute() const {
326338
return toSectionOffset(find({DW_AT_rnglists_base, DW_AT_GNU_ranges_base}));
327339
}

llvm/lib/DebugInfo/DWARF/DWARFTypePrinter.cpp

Lines changed: 27 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -62,10 +62,17 @@ void DWARFTypePrinter::appendArrayType(const DWARFDie &D) {
6262
EndedWithTemplate = false;
6363
}
6464

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+
}
6572
DWARFDie DWARFTypePrinter::skipQualifiers(DWARFDie D) {
6673
while (D && (D.getTag() == DW_TAG_const_type ||
6774
D.getTag() == DW_TAG_volatile_type))
68-
D = D.getAttributeValueAsReferencedDie(DW_AT_type);
75+
D = resolveReferencedType(D);
6976
return D;
7077
}
7178

@@ -96,9 +103,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
96103
return DWARFDie();
97104
}
98105
DWARFDie InnerDIE;
99-
auto Inner = [&] {
100-
return InnerDIE = D.getAttributeValueAsReferencedDie(DW_AT_type);
101-
};
106+
auto Inner = [&] { return InnerDIE = resolveReferencedType(D); };
102107
const dwarf::Tag T = D.getTag();
103108
switch (T) {
104109
case DW_TAG_pointer_type: {
@@ -129,8 +134,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
129134
OS << '(';
130135
else if (Word)
131136
OS << ' ';
132-
if (DWARFDie Cont =
133-
D.getAttributeValueAsReferencedDie(DW_AT_containing_type)) {
137+
if (DWARFDie Cont = resolveReferencedType(D, DW_AT_containing_type)) {
134138
appendQualifiedName(Cont);
135139
EndedWithTemplate = false;
136140
OS << "::";
@@ -169,8 +173,7 @@ DWARFTypePrinter::appendUnqualifiedNameBefore(DWARFDie D,
169173
case DW_TAG_base_type:
170174
*/
171175
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);
174177
if (!NamePtr) {
175178
appendTypeTagName(D.getTag());
176179
return DWARFDie();
@@ -232,9 +235,9 @@ void DWARFTypePrinter::appendUnqualifiedNameAfter(
232235
case DW_TAG_pointer_type: {
233236
if (needsParens(Inner))
234237
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);
238241
break;
239242
}
240243
case DW_TAG_LLVM_ptrauth_type: {
@@ -338,7 +341,7 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
338341
appendTemplateParameters(C, FirstParameter);
339342
}
340343
if (C.getTag() == dwarf::DW_TAG_template_value_parameter) {
341-
DWARFDie T = C.getAttributeValueAsReferencedDie(DW_AT_type);
344+
DWARFDie T = resolveReferencedType(C);
342345
Sep();
343346
if (T.getTag() == DW_TAG_enumeration_type) {
344347
OS << '(';
@@ -458,7 +461,7 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
458461
continue;
459462
auto TypeAttr = C.find(DW_AT_type);
460463
Sep();
461-
appendQualifiedName(TypeAttr ? C.getAttributeValueAsReferencedDie(*TypeAttr)
464+
appendQualifiedName(TypeAttr ? resolveReferencedType(C, *TypeAttr)
462465
: DWARFDie());
463466
}
464467
if (IsTemplate && *FirstParameter && FirstParameter == &FirstParameterValue) {
@@ -470,15 +473,15 @@ bool DWARFTypePrinter::appendTemplateParameters(DWARFDie D,
470473
void DWARFTypePrinter::decomposeConstVolatile(DWARFDie &N, DWARFDie &T,
471474
DWARFDie &C, DWARFDie &V) {
472475
(N.getTag() == DW_TAG_const_type ? C : V) = N;
473-
T = N.getAttributeValueAsReferencedDie(DW_AT_type);
476+
T = resolveReferencedType(N);
474477
if (T) {
475478
auto Tag = T.getTag();
476479
if (Tag == DW_TAG_const_type) {
477480
C = T;
478-
T = T.getAttributeValueAsReferencedDie(DW_AT_type);
481+
T = resolveReferencedType(T);
479482
} else if (Tag == DW_TAG_volatile_type) {
480483
V = T;
481-
T = T.getAttributeValueAsReferencedDie(DW_AT_type);
484+
T = resolveReferencedType(T);
482485
}
483486
}
484487
}
@@ -488,11 +491,10 @@ void DWARFTypePrinter::appendConstVolatileQualifierAfter(DWARFDie N) {
488491
DWARFDie T;
489492
decomposeConstVolatile(N, T, C, V);
490493
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());
493496
else
494-
appendUnqualifiedNameAfter(T,
495-
T.getAttributeValueAsReferencedDie(DW_AT_type));
497+
appendUnqualifiedNameAfter(T, resolveReferencedType(T));
496498
}
497499
void DWARFTypePrinter::appendConstVolatileQualifierBefore(DWARFDie N) {
498500
DWARFDie C;
@@ -502,7 +504,7 @@ void DWARFTypePrinter::appendConstVolatileQualifierBefore(DWARFDie N) {
502504
bool Subroutine = T && T.getTag() == DW_TAG_subroutine_type;
503505
DWARFDie A = T;
504506
while (A && A.getTag() == DW_TAG_array_type)
505-
A = A.getAttributeValueAsReferencedDie(DW_AT_type);
507+
A = resolveReferencedType(A);
506508
bool Leading =
507509
(!A || (A.getTag() != DW_TAG_pointer_type &&
508510
A.getTag() != llvm::dwarf::DW_TAG_ptr_to_member_type)) &&
@@ -544,7 +546,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
544546
if (P.getTag() != DW_TAG_formal_parameter &&
545547
P.getTag() != DW_TAG_unspecified_parameters)
546548
return;
547-
DWARFDie T = P.getAttributeValueAsReferencedDie(DW_AT_type);
549+
DWARFDie T = resolveReferencedType(P);
548550
if (SkipFirstParamIfArtificial && RealFirst && P.find(DW_AT_artificial)) {
549551
FirstParamIfArtificial = T;
550552
RealFirst = false;
@@ -565,7 +567,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
565567
if (DWARFDie P = FirstParamIfArtificial) {
566568
if (P.getTag() == DW_TAG_pointer_type) {
567569
auto CVStep = [&](DWARFDie CV) {
568-
if (DWARFDie U = CV.getAttributeValueAsReferencedDie(DW_AT_type)) {
570+
if (DWARFDie U = resolveReferencedType(CV)) {
569571
Const |= U.getTag() == DW_TAG_const_type;
570572
Volatile |= U.getTag() == DW_TAG_volatile_type;
571573
return U;
@@ -651,8 +653,7 @@ void DWARFTypePrinter::appendSubroutineNameAfter(
651653
if (D.find(DW_AT_rvalue_reference))
652654
OS << " &&";
653655

654-
appendUnqualifiedNameAfter(
655-
Inner, Inner.getAttributeValueAsReferencedDie(DW_AT_type));
656+
appendUnqualifiedNameAfter(Inner, resolveReferencedType(Inner));
656657
}
657658
void DWARFTypePrinter::appendScopes(DWARFDie D) {
658659
if (D.getTag() == DW_TAG_compile_unit)
@@ -665,6 +666,7 @@ void DWARFTypePrinter::appendScopes(DWARFDie D) {
665666
return;
666667
if (D.getTag() == DW_TAG_lexical_block)
667668
return;
669+
D = D.resolveTypeUnitReference();
668670
if (DWARFDie P = D.getParent())
669671
appendScopes(P);
670672
appendUnqualifiedName(D);

llvm/test/tools/llvm-dwarfdump/X86/prettyprint_type_units.s

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -18,15 +18,12 @@
1818
# doesn't really need templates - two local variables would've sufficed
1919
# (anything that references the type units) but I was working on something else
2020
# and this seemed minimal enough.
21-
# A gcc-style type signature reference was also inserted.
2221

2322

2423
# CHECK: DW_TAG_template_type_parameter
2524
# CHECK: DW_AT_type ({{.*}} "t1")
2625
# CHECK: DW_TAG_template_type_parameter
2726
# CHECK: DW_AT_type ({{.*}} "t2")
28-
# CHECK: DW_TAG_template_type_parameter
29-
# CHECK: DW_AT_type (0xc6694e51369161f2 "t1")
3027

3128
.text
3229
.file "test.cpp"
@@ -273,13 +270,6 @@ _Z2f1IJ2t12t2EEvv: # @_Z2f1IJ2t12t2EEvv
273270
.byte 11 # DW_FORM_data1
274271
.byte 0 # EOM(1)
275272
.byte 0 # EOM(2)
276-
.byte 12 # Abbreviation Code
277-
.byte 47 # DW_TAG_template_type_parameter
278-
.byte 0 # DW_CHILDREN_no
279-
.byte 73 # DW_AT_type
280-
.byte 32 # DW_FORM_ref_sig8
281-
.byte 0 # EOM(1)
282-
.byte 0 # EOM(2)
283273
.byte 0 # EOM(3)
284274
.section .debug_info,"",@progbits
285275
.Lcu_begin0:
@@ -323,23 +313,18 @@ _Z2f1IJ2t12t2EEvv: # @_Z2f1IJ2t12t2EEvv
323313
.byte 6 # Abbrev [6] 0x46:0xd DW_TAG_GNU_template_parameter_pack
324314
.byte 5 # DW_AT_name
325315
.byte 7 # Abbrev [7] 0x48:0x5 DW_TAG_template_type_parameter
326-
.long .Lt1_decl-.Lcu_begin0 # DW_AT_type
316+
.long 88 # DW_AT_type
327317
.byte 7 # Abbrev [7] 0x4d:0x5 DW_TAG_template_type_parameter
328-
# Simulate DWARF emitted by GCC where the signature is directly in the type attribute.
329-
.long .Lt2_decl-.Lcu_begin0 # DW_AT_type
330-
.byte 12 # Abbrev [12] DW_TAG_template_type_parameter
331-
.quad -4149699470930386446 # DW_AT_type
318+
.long 97 # DW_AT_type
332319
.byte 0 # End Of Children Mark
333320
.byte 0 # End Of Children Mark
334321
.byte 8 # Abbrev [8] 0x54:0x4 DW_TAG_base_type
335322
.byte 4 # DW_AT_name
336323
.byte 5 # DW_AT_encoding
337324
.byte 4 # DW_AT_byte_size
338-
.Lt1_decl:
339325
.byte 9 # Abbrev [9] 0x58:0x9 DW_TAG_structure_type
340326
# DW_AT_declaration
341327
.quad -4149699470930386446 # DW_AT_signature
342-
.Lt2_decl:
343328
.byte 9 # Abbrev [9] 0x61:0x9 DW_TAG_structure_type
344329
# DW_AT_declaration
345330
.quad 5649318945901130368 # DW_AT_signature

0 commit comments

Comments
 (0)