[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