[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