Skip to content

Commit fce0314

Browse files
authored
[LLVM][DWARF] Create debug names entry for non-tu top level DIE (#121856)
When creating a Type Unit (TU), LLVM attempts to do so optimistically. However, if this fails, it discards the TU state and creates the TU within the Compilation Unit (CU). In such cases, an entry for the top-level DIE is not created in the debug names table. This can cause issues when running llvm-dwarfdump --debug-names --verify, as the missing entry will result in verification failure. To address this issue, this patch adds a call to the updateAcceleratorTables when TU creation fails. This ensures that the debug names table is updated correctly, even in cases where TU creation fails.
1 parent 160a408 commit fce0314

File tree

3 files changed

+89
-5
lines changed

3 files changed

+89
-5
lines changed

llvm/lib/CodeGen/AsmPrinter/DwarfDebug.cpp

+1
Original file line numberDiff line numberDiff line change
@@ -3789,6 +3789,7 @@ void DwarfDebug::addDwarfTypeUnitType(DwarfCompileUnit &CU,
37893789
// they depend on addresses, throwing them out and rebuilding them.
37903790
setCurrentDWARF5AccelTable(DWARF5AccelTableKind::CU);
37913791
CU.constructTypeDIE(RefDie, cast<DICompositeType>(CTy));
3792+
CU.updateAcceleratorTables(CTy->getScope(), CTy, RefDie);
37923793
return;
37933794
}
37943795

llvm/lib/CodeGen/AsmPrinter/DwarfUnit.h

+5-5
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,11 @@ class DwarfUnit : public DIEUnit {
315315
/// Get context owner's DIE.
316316
DIE *createTypeDIE(const DICompositeType *Ty);
317317

318+
/// If this is a named finished type then include it in the list of types for
319+
/// the accelerator tables.
320+
void updateAcceleratorTables(const DIScope *Context, const DIType *Ty,
321+
const DIE &TyDIE);
322+
318323
protected:
319324
~DwarfUnit();
320325

@@ -357,11 +362,6 @@ class DwarfUnit : public DIEUnit {
357362

358363
virtual void finishNonUnitTypeDIE(DIE& D, const DICompositeType *CTy) = 0;
359364

360-
/// If this is a named finished type then include it in the list of types for
361-
/// the accelerator tables.
362-
void updateAcceleratorTables(const DIScope *Context, const DIType *Ty,
363-
const DIE &TyDIE);
364-
365365
virtual bool isDwoUnit() const = 0;
366366
const MCSymbol *getCrossSectionRelativeBaseAddress() const override;
367367

Original file line numberDiff line numberDiff line change
@@ -0,0 +1,83 @@
1+
; RUN: llc -filetype=obj -O0 -generate-type-units -mtriple=x86_64-unknown-linux-gnu < %s \
2+
; RUN: | llvm-dwarfdump -debug-info -debug-names - \
3+
; RUN: | FileCheck %s
4+
5+
;; Test that an entry in the debug names table gets created for a top level DIE when the creation of TU fails.
6+
7+
;; clang++ -O0 main.cpp -gdwarf-5 -fdebug-types-section -gpubnames -S -emit-llvm -glldb -o main.ll
8+
;; int foo;
9+
;; namespace {
10+
;; struct t1 {};
11+
;; } // namespace
12+
;; template <int *> struct t2 {
13+
;; t1 v1;
14+
;; };
15+
;; struct t3 {
16+
;; t2<&foo> v1;
17+
;; };
18+
;; t3 v1;
19+
20+
; CHECK: [[OFFSET:0x[0-9a-f]*]]: DW_TAG_structure_type
21+
; CHECK: [[OFFSET1:0x[0-9a-f]*]]: DW_TAG_structure_type
22+
23+
; CHECK: Bucket 0 [
24+
; CHECK-NEXT: Name 1 {
25+
; CHECK-NEXT: Hash: {{.+}}
26+
; CHECK-NEXT: String: {{.+}} "t3"
27+
; CHECK-NEXT: Entry @ {{.+}} {
28+
; CHECK-NEXT: Abbrev: 0x1
29+
; CHECK-NEXT: Tag: DW_TAG_structure_type
30+
; CHECK-NEXT: DW_IDX_die_offset: [[OFFSET]]
31+
; CHECK-NEXT: DW_IDX_parent: <parent not indexed>
32+
33+
; CHECK: Name 5 {
34+
; CHECK-NEXT: Hash: {{.+}}
35+
; CHECK-NEXT: String: {{.+}} "t2<&foo>"
36+
; CHECK-NEXT: Entry @ 0xe1 {
37+
; CHECK-NEXT: Abbrev: 0x1
38+
; CHECK-NEXT: Tag: DW_TAG_structure_type
39+
; CHECK-NEXT: DW_IDX_die_offset: [[OFFSET1]]
40+
; CHECK-NEXT: DW_IDX_parent: <parent not indexed>
41+
42+
; ModuleID = 'main.cpp'
43+
source_filename = "main.cpp"
44+
target datalayout = "e-m:e-p270:32:32-p271:32:32-p272:64:64-i64:64-i128:128-f80:128-n8:16:32:64-S128"
45+
target triple = "x86_64-unknown-linux-gnu"
46+
47+
%struct.t3 = type { i8 }
48+
49+
@foo = dso_local global i32 0, align 4, !dbg !0
50+
@v1 = dso_local global %struct.t3 zeroinitializer, align 1, !dbg !5
51+
52+
!llvm.dbg.cu = !{!2}
53+
!llvm.module.flags = !{!20, !21, !22, !23, !24, !25, !26}
54+
!llvm.ident = !{!27}
55+
56+
!0 = !DIGlobalVariableExpression(var: !1, expr: !DIExpression())
57+
!1 = distinct !DIGlobalVariable(name: "foo", scope: !2, file: !3, line: 1, type: !19, isLocal: false, isDefinition: true)
58+
!2 = distinct !DICompileUnit(language: DW_LANG_C_plus_plus_14, file: !3, producer: "clang version 20.0.0git ([email protected]:llvm/llvm-project.git ba373096e8ac83a7136fc44bc4e71a7bc53417a6)", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, globals: !4, splitDebugInlining: false, sysroot: "/")
59+
!3 = !DIFile(filename: "main.cpp", directory: "/StructuredType", checksumkind: CSK_MD5, checksum: "f91f8d905197b1c0309da9526bc4776e")
60+
!4 = !{!0, !5}
61+
!5 = !DIGlobalVariableExpression(var: !6, expr: !DIExpression())
62+
!6 = distinct !DIGlobalVariable(name: "v1", scope: !2, file: !3, line: 11, type: !7, isLocal: false, isDefinition: true)
63+
!7 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t3", file: !3, line: 8, size: 8, flags: DIFlagTypePassByValue, elements: !8, identifier: "_ZTS2t3")
64+
!8 = !{!9}
65+
!9 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !7, file: !3, line: 9, baseType: !10, size: 8)
66+
!10 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t2<&foo>", file: !3, line: 5, size: 8, flags: DIFlagTypePassByValue, elements: !11, templateParams: !16, identifier: "_ZTS2t2IXadL_Z3fooEEE")
67+
!11 = !{!12}
68+
!12 = !DIDerivedType(tag: DW_TAG_member, name: "v1", scope: !10, file: !3, line: 6, baseType: !13, size: 8)
69+
!13 = distinct !DICompositeType(tag: DW_TAG_structure_type, name: "t1", scope: !14, file: !3, line: 3, size: 8, flags: DIFlagTypePassByValue, elements: !15)
70+
!14 = !DINamespace(scope: null)
71+
!15 = !{}
72+
!16 = !{!17}
73+
!17 = !DITemplateValueParameter(type: !18, value: ptr @foo)
74+
!18 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !19, size: 64)
75+
!19 = !DIBasicType(name: "int", size: 32, encoding: DW_ATE_signed)
76+
!20 = !{i32 7, !"Dwarf Version", i32 5}
77+
!21 = !{i32 2, !"Debug Info Version", i32 3}
78+
!22 = !{i32 1, !"wchar_size", i32 4}
79+
!23 = !{i32 8, !"PIC Level", i32 2}
80+
!24 = !{i32 7, !"PIE Level", i32 2}
81+
!25 = !{i32 7, !"uwtable", i32 2}
82+
!26 = !{i32 7, !"frame-pointer", i32 2}
83+
!27 = !{!"clang version 20.0.0git ([email protected]:llvm/llvm-project.git ba373096e8ac83a7136fc44bc4e71a7bc53417a6)"}

0 commit comments

Comments
 (0)