From 448888c5aa1604133efd05facb3968d69c39184a Mon Sep 17 00:00:00 2001 From: Roy Shi 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 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#*lhLG3wr?!@e3YkJ_!`MBr&=G=SE z+`0G1qrYDQPymS@Ipm)-e3X%q#*mlE{ujC>*NT*gl-UK;iTlZk#8|>VOj13y7f&xO zKC?6JWvLLJnmI}4U}L+jAd`FQ7eBBK}YfaoB=ZYf{UCGa!Rb)4CL9oLO0 zq!+I$qlaYv@qDV>!KTVrJQvS*Iy`<3UQI@SDe>xv*9FjHGS&<_q0>y*ihs@XUB>D) znJUB+nOx4CSQm}rw=bx#?fINidiOgj=lETTSEk`by1xTFMosRSzgXhUq%iQ2#FHk8 zuI*2vV-z_(+d*(wUOc9K>Qbz=LR(|qgFk`+qFwwOz`v)QtMjotSljovctw`1Ic9R+Lg zvS+)z6WC$ITRe)m%cxN3IGzulpFqQj7ErvIiuoXT1HCh_2>8>$Q_Na}2EZ4>mCdkl ziT?>*Z3mGlxL$wfTm_GcR_SbMZnK%KY7@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". +# CHECK: 0x[[FIRST_BARINT_ADDR:[0-9a-f]{8}]]: DW_TAG_typedef +# CHECK-NEXT: DW_AT_type (0x{{([[:xdigit:]]{8})}} "Foo") +# 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 struct Foo; +# typedef Foo BarInt; +# template +# 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 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". -# CHECK: 0x[[FIRST_BARINT_ADDR:[0-9a-f]{8}]]: DW_TAG_typedef -# CHECK-NEXT: DW_AT_type (0x{{([[:xdigit:]]{8})}} "Foo") +# CHECK: 0x[[FIRST_BARINT_ADDR:[0-9a-f]*]]: DW_TAG_typedef +# CHECK-NEXT: DW_AT_type (0x{{([[:xdigit:]]*)}} "Foo") # 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 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