[llvm] [dsymutil] Fix parallel linker's self-recursive typedef DIE by including referred-to types into synthetic name (PR #166767)

Roy Shi via llvm-commits llvm-commits at lists.llvm.org
Thu Nov 6 10:02:08 PST 2025


https://github.com/royitaqi updated https://github.com/llvm/llvm-project/pull/166767

>From 448888c5aa1604133efd05facb3968d69c39184a Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Thu, 6 Nov 2025 04:37:33 -0800
Subject: [PATCH 1/4] [dsymutil] Fix parallel linker's self-recursive typedef
 DIE by adding ref type name

---
 llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp | 6 ++++--
 1 file changed, 4 insertions(+), 2 deletions(-)

diff --git a/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp b/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
index 34174f98b7e37..ca918f6e17b38 100644
--- a/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
+++ b/llvm/lib/DWARFLinker/Parallel/SyntheticTypeNameBuilder.cpp
@@ -377,8 +377,10 @@ Error SyntheticTypeNameBuilder::addTypeName(UnitEntryPairTy InputUnitEntryPair,
   } break;
   }
 
-  // If name for the DIE is not determined yet add referenced types to the name.
-  if (!HasLinkageName && !HasShortName && !HasDeclFileName) {
+  // If name for the DIE is not determined yet or if the DIE is a typedef, add
+  // referenced types to the name.
+  if ((!HasLinkageName && !HasShortName && !HasDeclFileName) ||
+      InputUnitEntryPair.DieEntry->getTag() == dwarf::DW_TAG_typedef) {
     if (InputUnitEntryPair.CU->find(InputUnitEntryPair.DieEntry,
                                     getODRAttributes()))
       if (Error Err = addReferencedODRDies(InputUnitEntryPair, AddParentNames,

>From 3901d7d3774c52f5f2c324b152561b7e48da8ef3 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Thu, 6 Nov 2025 07:21:42 -0800
Subject: [PATCH 2/4] Add shell test

---
 .../dsymutil/Inputs/typedefs-with-same-name.o | Bin 0 -> 2080 bytes
 .../dsymutil/typedefs-with-same-name.test     |  41 ++++++++++++++++++
 2 files changed, 41 insertions(+)
 create mode 100644 llvm/test/tools/dsymutil/Inputs/typedefs-with-same-name.o
 create mode 100644 llvm/test/tools/dsymutil/typedefs-with-same-name.test

diff --git a/llvm/test/tools/dsymutil/Inputs/typedefs-with-same-name.o b/llvm/test/tools/dsymutil/Inputs/typedefs-with-same-name.o
new file mode 100644
index 0000000000000000000000000000000000000000..6cc47c1a783b35b371b421821a5ba421c4f418f2
GIT binary patch
literal 2080
zcmb7F-D?zA6hAYwv%AUEe7MDYD7uP6TO>2PF&MNZCUp%4S1X#<K*7uG&RsL@?#y&%
z5*sQc^{MS!z^DEVeW;H at p}rLQ<Oh_}zn~V1v>*lhLG3wr?!@e3YkJ_!`MBr&=G=SE
z+`0G1qrYDQPymS at Ipm)-e3X%q#*mlE{ujC>*NT*gl-UK;iTlZk#8|>VOj13y7f&xO
zKC?6JWvLLJnmI}4U}L+<n9Cb0SDDjjM0}O-YnSIP&ToZeI4jb#Pu8~;&;y_0d44OP
zm|nb3Wnx3h%^l*!NyLIyEAGYnS>jAd`FQ7eBBK}YfaoB=ZYf{UCGa!Rb)4CL9oLO0
zq!+I$qlaYv at qDV>!KTVrJQvS*Iy`<3UQI at SDe>xv*9FjHGS&<_q0>y*ihs at XUB>D)
znJUB+nOx4CSQm}rw=bx#?fINidiOgj=lETTSEk`by1xTFMosRSzgXhUq%iQ2#FHk8
zuI*2vV-z_(+d<UEk<%dZ|A6 at fSuCb;2I?1(i3o_8a^-7L`+xNG6g&XfxcGDsZlk_=
zM`PbB!-{E^bj`eR-TY<Uj7Ek=_L{?ccjw~~e4(X~`fz=0c2qM at 7_S=(rIUDDXj7nW
zIq<VR44OG(7+9~q2Np_cC_uiX95Xc2FenqR3R|pU%~z0hP;i^Hp at X2Pn$XeA0e#hE
zsX|i%9g4GPYU-v at fIcxGxxAj!>*(wUO<zo9Uhh*NU!YLTuAs=i4jc8e$X_GhMgA4}
zH{{=uhwwZLbf(C2Vc6#7X4~<vmRETcdx2lBPFoeLQhrr<C#utxignbg9=EEmL9!Nd
zm$%}HYhJQE5#u*8K_7<I3`4L9%WFCbV#M}RGjKVZJVsEgIz4xEa*DMYmJ^2dslZRT
zpTu^Jukv;f^2ol>c9K>Qbz=LR(|qgFk`+qFwwOz`v)QtMjotSljovctw`1Ic9R+Lg
zvS+)z6WC$ITRe)m%cxN3IGzulpFqQj7ErvIiuoXT1HCh_2>8>$Q_Na}2EZ4>mCdkl
ziT?>*Z3mGlxL$wfTm_GcR_SbMZnK%KY<yyTbL8gZ^Yh>7 at 2!7+of<(w)C6h_5nV&W
z$T)$Z9M(!X965DQDz#E7b5<%rnZ+njX)aV63D9UDAZOCEn`p9NNR-pHa2YMy<}^x0
zQT`m*MS?0vMkT#>HRXUhsP9(}QSREU`SH)j^wZ-{{`%m@!pA3Y`+c-cL1VhsZ+xW|
zG55t?_^&aNcyy*%iMX9fo{{!0lmk?zB)WbEFgUw6X=!lVIxx}lcG3x}Ku^&jfPVmw
Cwh(;)

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/dsymutil/typedefs-with-same-name.test b/llvm/test/tools/dsymutil/typedefs-with-same-name.test
new file mode 100644
index 0000000000000..96ec583293977
--- /dev/null
+++ b/llvm/test/tools/dsymutil/typedefs-with-same-name.test
@@ -0,0 +1,41 @@
+#RUN: dsymutil --linker=parallel -f -oso-prepend-path=%p/Inputs/ -y %s -o %t.dwarf
+#RUN: llvm-dwarfdump %t.dwarf | FileCheck %s
+
+# There should be two typedef DIE named "BarInt" in the resultant .dwarf file.
+# The second should refer to the first, which refer to "Foo<int>".
+# CHECK:      0x[[FIRST_BARINT_ADDR:[0-9a-f]{8}]]:  DW_TAG_typedef
+# CHECK-NEXT:     DW_AT_type  (0x{{([[:xdigit:]]{8})}} "Foo<int>")
+# CHECK-NEXT:     DW_AT_name  ("BarInt")
+# CHECK:      0x{{([[:xdigit:]]{8})}}:  DW_TAG_typedef
+# CHECK-NEXT:     DW_AT_type  (0x[[FIRST_BARINT_ADDR]] "BarInt")
+# CHECK-NEXT:     DW_AT_name  ("BarInt")
+
+# Source:
+#
+#   template <typename T> struct Foo;
+#   typedef Foo<int> BarInt;
+#   template <typename T>
+#   struct [[clang::preferred_name(BarInt)]] Foo{};
+#   int main() {
+#     BarInt barInt;
+#     return 0;
+#   }
+#
+# Compile with:
+#
+#   $ clang++ -g -O0 -c typedefs-with-same-name.cpp -o typedefs-with-same-name.o
+#
+# To generate the debug map:
+#
+#   $ clang++ typedefs-with-same-name.o -o typedefs-with-same-name
+#   $ dsymutil -dump-debug-map typedefs-with-same-name
+
+---
+triple:          'arm64-apple-darwin'
+objects:
+  - filename:        '/typedefs-with-same-name.o'
+    timestamp:       1762438746
+    type:            102
+    symbols:
+      - { sym: _main, objAddr: 0x0, binAddr: 0x100000360, size: 0x14 }
+...

>From 3da895328d3c9bad4ce6e6b62e695afeac121ede Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Thu, 6 Nov 2025 07:31:56 -0800
Subject: [PATCH 3/4] In the shell test, loose the check of the number of
 digits in hex addresses

---
 llvm/test/tools/dsymutil/typedefs-with-same-name.test | 6 +++---
 1 file changed, 3 insertions(+), 3 deletions(-)

diff --git a/llvm/test/tools/dsymutil/typedefs-with-same-name.test b/llvm/test/tools/dsymutil/typedefs-with-same-name.test
index 96ec583293977..2312f820b0452 100644
--- a/llvm/test/tools/dsymutil/typedefs-with-same-name.test
+++ b/llvm/test/tools/dsymutil/typedefs-with-same-name.test
@@ -3,10 +3,10 @@
 
 # There should be two typedef DIE named "BarInt" in the resultant .dwarf file.
 # The second should refer to the first, which refer to "Foo<int>".
-# CHECK:      0x[[FIRST_BARINT_ADDR:[0-9a-f]{8}]]:  DW_TAG_typedef
-# CHECK-NEXT:     DW_AT_type  (0x{{([[:xdigit:]]{8})}} "Foo<int>")
+# CHECK:      0x[[FIRST_BARINT_ADDR:[0-9a-f]*]]:  DW_TAG_typedef
+# CHECK-NEXT:     DW_AT_type  (0x{{([[:xdigit:]]*)}} "Foo<int>")
 # CHECK-NEXT:     DW_AT_name  ("BarInt")
-# CHECK:      0x{{([[:xdigit:]]{8})}}:  DW_TAG_typedef
+# CHECK:      0x{{([[:xdigit:]]*)}}:  DW_TAG_typedef
 # CHECK-NEXT:     DW_AT_type  (0x[[FIRST_BARINT_ADDR]] "BarInt")
 # CHECK-NEXT:     DW_AT_name  ("BarInt")
 

>From 4c164dc444fccaf6a8311e050250f77c34182da6 Mon Sep 17 00:00:00 2001
From: Roy Shi <royshi at meta.com>
Date: Thu, 6 Nov 2025 10:00:55 -0800
Subject: [PATCH 4/4] Fix odr-fwd-declaration.test

---
 .../X86/DWARFLinkerParallel/odr-fwd-declaration.test      | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-fwd-declaration.test b/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-fwd-declaration.test
index d028194f7e83a..fd15ce3e18978 100644
--- a/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-fwd-declaration.test
+++ b/llvm/test/tools/dsymutil/X86/DWARFLinkerParallel/odr-fwd-declaration.test
@@ -35,14 +35,14 @@ void foo() { Sptrptr ptr1 = 0; }
 // CHECK: DW_TAG_member
 // CHECK-NEXT: DW_AT_name{{.*}}"field"
 
-// CHECK: 0x[[TYPEDEF_PTR_S]]: DW_TAG_typedef
-// CHECK-NEXT: DW_AT_type{{.*}}{0x[[PTR_S]]} "S *"
-// CHECK-NEXT: DW_AT_name{{.*}}"Sptr"
-
 // CHECK: 0x[[TYPEDEF_PTR_PTR_S:[a-f0-9]*]]: DW_TAG_typedef
 // CHECK-NEXT: DW_AT_type{{.*}}{0x[[PTR_PTR_S]]} "Sptr *"
 // CHECK-NEXT: DW_AT_name{{.*}}"Sptrptr"
 
+// CHECK: 0x[[TYPEDEF_PTR_S]]: DW_TAG_typedef
+// CHECK-NEXT: DW_AT_type{{.*}}{0x[[PTR_S]]} "S *"
+// CHECK-NEXT: DW_AT_name{{.*}}"Sptr"
+
 // First we confirm that first compile unit properly references type.
 //
 // CHECK: DW_TAG_compile_unit



More information about the llvm-commits mailing list