diff --git a/llvm/include/llvm/DWARFLinker/DWARFLinker.h b/llvm/include/llvm/DWARFLinker/DWARFLinker.h index eaf0bbb94e34a..8f1d2d079c16b 100644 --- a/llvm/include/llvm/DWARFLinker/DWARFLinker.h +++ b/llvm/include/llvm/DWARFLinker/DWARFLinker.h @@ -361,6 +361,9 @@ class DWARFLinker { void addAccelTableKind(AccelTableKind Kind) { assert(!llvm::is_contained(Options.AccelTables, Kind)); Options.AccelTables.emplace_back(Kind); + + if (Kind == AccelTableKind::Apple) + Options.CanStripTemplateName = true; } /// Set prepend path for clang modules. @@ -882,6 +885,7 @@ class DWARFLinker { /// The accelerator table kinds SmallVector AccelTables; + bool CanStripTemplateName = false; /// Prepend path for the clang modules. std::string PrependPath; diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index 349be17301aea..206ba9d409904 100644 --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -192,7 +192,8 @@ bool DWARFLinker::DIECloner::getDIENames(const DWARFDie &Die, if (!Info.MangledName) Info.MangledName = Info.Name; - if (StripTemplate && Info.Name && Info.MangledName != Info.Name) { + if (StripTemplate && Linker.Options.CanStripTemplateName && Info.Name && + Info.MangledName != Info.Name) { StringRef Name = Info.Name.getString(); if (std::optional StrippedName = StripTemplateParameters(Name)) Info.NameWithoutTemplate = StringPool.getEntry(*StrippedName); diff --git a/llvm/test/tools/dsymutil/X86/Inputs/dwarf5-accel.o b/llvm/test/tools/dsymutil/X86/Inputs/dwarf5-accel.o new file mode 100644 index 0000000000000..1620b85a7fd83 Binary files /dev/null and b/llvm/test/tools/dsymutil/X86/Inputs/dwarf5-accel.o differ diff --git a/llvm/test/tools/dsymutil/X86/dwarf5-accel.test b/llvm/test/tools/dsymutil/X86/dwarf5-accel.test new file mode 100644 index 0000000000000..621fd80e623a6 --- /dev/null +++ b/llvm/test/tools/dsymutil/X86/dwarf5-accel.test @@ -0,0 +1,34 @@ +## This test checks that DIE name with stripped template parameters +## is not stored into .debug_name section. + +## cat dwarf5-accel.cpp +## +## template void foo() {}; +## +## int main ( void ) { +## foo(); +## return 0; +## } + +## $ clang -gdwarf-5 dwarf5-accel.cpp -c -o dwarf5-accel.o + +#RUN: dsymutil -accelerator=Dwarf -oso-prepend-path %p/Inputs -y %s -o %t.dSYM +#RUN: llvm-dwarfdump --verify %t.dSYM | FileCheck %s --check-prefix VERIFY +#RUN: llvm-dwarfdump -a --verbose %t.dSYM | FileCheck %s + +#VERIFY: No errors. + +#CHECK: .debug_names +#CHECK-NOT: "foo" +#CHECK: _Z3fooIcEvv +#CHECK-NOT: "foo" +#CHECK: "foo" + +--- +triple: 'x86_64-apple-darwin' +objects: + - filename: 'dwarf5-accel.o' + timestamp: 1676048242 + symbols: + - { sym: _main, objAddr: 0x0000000000000000, binAddr: 0x0000000100000AB0, size: 0x00000008 } + - { sym: __Z3fooIcEvv, objAddr: 0x0000000000000020, binAddr: 0x0000000100000BB0, size: 0x00000008 }