[llvm] [DWARFLinker] Preserve children of DW_TAG_GNU_template_parameter_pack (PR #196439)
Jonas Devlieghere via llvm-commits
llvm-commits at lists.llvm.org
Fri May 8 12:58:35 PDT 2026
https://github.com/JDevlieghere updated https://github.com/llvm/llvm-project/pull/196439
>From 7a6b7994252c27290e6cdfbc685c5c983b0095f5 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Thu, 7 May 2026 15:45:52 -0700
Subject: [PATCH 1/2] [DWARFLinkerParallel] Preserve children of
DW_TAG_GNU_template_parameter_pack
Pack children were not getting ordered synthetic keys, so TypePool
deduplicated them by name and TypesComparator sorted the survivors
alphabetically. Register the two missing tags with
SyntheticTypeNameBuilder.
---
llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp | 4 +++-
1 file changed, 3 insertions(+), 1 deletion(-)
diff --git a/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp b/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
index ca918f6e17b38..b5be5d498ed3e 100644
--- a/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
+++ b/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
@@ -671,7 +671,8 @@ OrderedChildrenIndexAssigner::OrderedChildrenIndexAssigner(
case dwarf::DW_TAG_subroutine_type:
case dwarf::DW_TAG_union_type:
case dwarf::DW_TAG_GNU_template_template_param:
- case dwarf::DW_TAG_GNU_formal_parameter_pack: {
+ case dwarf::DW_TAG_GNU_formal_parameter_pack:
+ case dwarf::DW_TAG_GNU_template_parameter_pack: {
NeedCountChildren = true;
} break;
case dwarf::DW_TAG_enumeration_type: {
@@ -724,6 +725,7 @@ std::optional<size_t> OrderedChildrenIndexAssigner::tagToArrayIndex(
return 0;
case dwarf::DW_TAG_template_value_parameter:
case dwarf::DW_TAG_template_type_parameter:
+ case dwarf::DW_TAG_GNU_template_template_param:
return 1;
case dwarf::DW_TAG_enumeration_type:
if (std::optional<uint32_t> ParentIdx = DieEntry->getParentIdx()) {
>From caabd7321621e67702494114e2f86cc6cf747316 Mon Sep 17 00:00:00 2001
From: Jonas Devlieghere <jonas at devlieghere.com>
Date: Fri, 8 May 2026 12:58:16 -0700
Subject: [PATCH 2/2] Add test
---
.../dwarflinker-template-parameter-pack.map | 7 +
.../dwarflinker-template-parameter-pack.test | 181 ++++++++++++++++++
2 files changed, 188 insertions(+)
create mode 100644 llvm/test/tools/dsymutil/X86/Inputs/dwarflinker-template-parameter-pack.map
create mode 100644 llvm/test/tools/dsymutil/X86/dwarflinker-template-parameter-pack.test
diff --git a/llvm/test/tools/dsymutil/X86/Inputs/dwarflinker-template-parameter-pack.map b/llvm/test/tools/dsymutil/X86/Inputs/dwarflinker-template-parameter-pack.map
new file mode 100644
index 0000000000000..697b3803bee92
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/Inputs/dwarflinker-template-parameter-pack.map
@@ -0,0 +1,7 @@
+---
+triple: 'x86_64-apple-darwin'
+objects:
+ - filename: pack.o
+ symbols:
+ - { sym: __Z3foov, objAddr: 0x0, binAddr: 0x10000, size: 0x10 }
+...
diff --git a/llvm/test/tools/dsymutil/X86/dwarflinker-template-parameter-pack.test b/llvm/test/tools/dsymutil/X86/dwarflinker-template-parameter-pack.test
new file mode 100644
index 0000000000000..c34393553847d
--- /dev/null
+++ b/llvm/test/tools/dsymutil/X86/dwarflinker-template-parameter-pack.test
@@ -0,0 +1,181 @@
+# RUN: rm -rf %t.dir && mkdir -p %t.dir
+# RUN: yaml2obj %s -o %t.dir/pack.o
+# RUN: dsymutil --linker classic -y %p/Inputs/dwarflinker-template-parameter-pack.map -oso-prepend-path=%t.dir -f -o - | llvm-dwarfdump -a - | FileCheck %s
+# RUN: dsymutil --linker parallel -y %p/Inputs/dwarflinker-template-parameter-pack.map -oso-prepend-path=%t.dir -f -o - | llvm-dwarfdump -a - | FileCheck %s
+
+## A DW_TAG_GNU_template_parameter_pack with three identical
+## DW_TAG_template_type_parameter children (all referring to the same
+## int base type) must be preserved as three separate child DIEs after
+## linking. Before the parallel linker registered the pack tag with
+## SyntheticTypeNameBuilder, pack children received no ordered synthetic
+## key and TypePool deduplicated the three siblings down to one.
+
+# CHECK: DW_TAG_structure_type
+# CHECK: DW_AT_name {{.*}}"Pack"
+# CHECK: DW_TAG_GNU_template_parameter_pack
+# CHECK: DW_AT_name {{.*}}"Ts"
+# CHECK: DW_TAG_template_type_parameter
+# CHECK: DW_AT_type {{.*}}"int"
+# CHECK: DW_TAG_template_type_parameter
+# CHECK: DW_AT_type {{.*}}"int"
+# CHECK: DW_TAG_template_type_parameter
+# CHECK: DW_AT_type {{.*}}"int"
+# CHECK-NOT: DW_TAG_template_type_parameter
+
+--- !mach-o
+FileHeader:
+ magic: 0xFEEDFACF
+ cputype: 0x01000007
+ cpusubtype: 0x00000003
+ filetype: 0x00000001
+ ncmds: 2
+ sizeofcmds: 376
+ flags: 0x00002000
+ reserved: 0x00000000
+LoadCommands:
+ - cmd: LC_SEGMENT_64
+ cmdsize: 232
+ segname: ''
+ vmaddr: 0x00
+ vmsize: 0x300
+ fileoff: 0x300
+ filesize: 0x300
+ maxprot: 7
+ initprot: 7
+ nsects: 2
+ flags: 0
+ Sections:
+ - sectname: __debug_abbrev
+ segname: __DWARF
+ addr: 0x000000000000000F
+ size: 0x37
+ offset: 0x00000380
+ align: 0
+ reloff: 0x00000000
+ nreloc: 0
+ flags: 0x02000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ - sectname: __debug_info
+ segname: __DWARF
+ addr: 0x000000000000100
+ size: 0x44
+ offset: 0x000003B7
+ align: 0
+ reloff: 0x00000600
+ nreloc: 1
+ flags: 0x02000000
+ reserved1: 0x00000000
+ reserved2: 0x00000000
+ reserved3: 0x00000000
+ relocations:
+ - address: 0x000001FC
+ symbolnum: 1
+ pcrel: true
+ length: 3
+ extern: true
+ type: 0
+ scattered: false
+ value: 0
+ - cmd: LC_SYMTAB
+ cmdsize: 24
+ symoff: 0x700
+ nsyms: 1
+ stroff: 0x710
+ strsize: 10
+LinkEditData:
+ NameList:
+ - n_strx: 1
+ n_type: 0x0F
+ n_sect: 1
+ n_desc: 0
+ n_value: 0
+ StringTable:
+ - ''
+ - '__Z3foov'
+ - ''
+DWARF:
+ debug_abbrev:
+ - Table:
+ - Tag: DW_TAG_compile_unit
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_producer
+ Form: DW_FORM_string
+ - Attribute: DW_AT_language
+ Form: DW_FORM_data2
+ - Tag: DW_TAG_structure_type
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Tag: DW_TAG_GNU_template_parameter_pack
+ Children: DW_CHILDREN_yes
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Tag: DW_TAG_template_type_parameter
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref_addr
+ - Tag: DW_TAG_base_type
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Tag: DW_TAG_variable
+ Children: DW_CHILDREN_no
+ Attributes:
+ - Attribute: DW_AT_name
+ Form: DW_FORM_string
+ - Attribute: DW_AT_const_value
+ Form: DW_FORM_data4
+ - Attribute: DW_AT_type
+ Form: DW_FORM_ref_addr
+ debug_info:
+ - Version: 4
+ Entries:
+ ## 0x0b: DW_TAG_compile_unit
+ - AbbrCode: 1
+ Values:
+ - CStr: by_hand
+ - Value: 0x04
+ ## 0x16: DW_TAG_structure_type "Pack"
+ - AbbrCode: 2
+ Values:
+ - CStr: Pack
+ ## 0x1c: DW_TAG_GNU_template_parameter_pack "Ts"
+ - AbbrCode: 3
+ Values:
+ - CStr: Ts
+ ## 0x20: DW_TAG_template_type_parameter -> int
+ - AbbrCode: 4
+ Values:
+ - Value: 0x00000031
+ ## 0x25: DW_TAG_template_type_parameter -> int
+ - AbbrCode: 4
+ Values:
+ - Value: 0x00000031
+ ## 0x2a: DW_TAG_template_type_parameter -> int
+ - AbbrCode: 4
+ Values:
+ - Value: 0x00000031
+ ## 0x2f: NULL (close pack)
+ - AbbrCode: 0
+ ## 0x30: NULL (close structure)
+ - AbbrCode: 0
+ ## 0x31: DW_TAG_base_type "int"
+ - AbbrCode: 5
+ Values:
+ - CStr: int
+ ## 0x36: DW_TAG_variable "var" -> Pack
+ - AbbrCode: 6
+ Values:
+ - CStr: var
+ - Value: 0x000000ff
+ - Value: 0x00000016
+ ## 0x43: NULL (close CU)
+ - AbbrCode: 0
+...
More information about the llvm-commits
mailing list