From ccee9b7839a182fc692a65f563abf76f81dd436c Mon Sep 17 00:00:00 2001 From: Michael Buch Date: Mon, 6 Feb 2023 14:42:41 +0000 Subject: [PATCH] [llvm][dsymutil] Add DW_TAG_imported_declaration to accelerator table **Summary** After this patch, `dsymutil` will preserve `DW_TAG_imported_declarations` entries in accelerator tables. This allows consumers to resolve imported declarations even on executables processsed through dsymutil. This helps consumers, particularly LLDB's expression evaluator, to resolve imported declarations (i.e., useful for namespace aliases in C++) more efficiently. **Testing** * Added unit-test Differential Revision: https://reviews.llvm.org/D143458 --- llvm/lib/DWARFLinker/DWARFLinker.cpp | 2 + .../dsymutil/ARM/accel-imported-declarations.test | 47 +++++++++++++++++++++ .../dsymutil/Inputs/accel-imported-declaration.cpp | 17 ++++++++ .../Inputs/accel-imported-declaration.macho-arm64 | Bin 0 -> 33843 bytes 4 files changed, 66 insertions(+) create mode 100644 llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test create mode 100644 llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp create mode 100755 llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.macho-arm64 diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp index d302d61..6d6bd33 100644 --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -1589,6 +1589,8 @@ DIE *DWARFLinker::DIECloner::cloneDIE(const DWARFDie &InputDIE, if (!AttrInfo.Name) AttrInfo.Name = StringPool.getEntry("(anonymous namespace)"); Unit.addNamespaceAccelerator(Die, AttrInfo.Name); + } else if (Tag == dwarf::DW_TAG_imported_declaration && AttrInfo.Name) { + Unit.addNamespaceAccelerator(Die, AttrInfo.Name); } else if (isTypeTag(Tag) && !AttrInfo.IsDeclaration && getDIENames(InputDIE, AttrInfo, StringPool) && AttrInfo.Name && AttrInfo.Name.getString()[0]) { diff --git a/llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test b/llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test new file mode 100644 index 0000000..1c59167 --- /dev/null +++ b/llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test @@ -0,0 +1,47 @@ +RUN: dsymutil -accelerator=Dwarf %p/../Inputs/accel-imported-declaration.macho-arm64 -o %t.dwarf.dSYM +RUN: dsymutil -accelerator=Apple %p/../Inputs/accel-imported-declaration.macho-arm64 -o %t.apple.dSYM + +RUN: llvm-dwarfdump -v %t.dwarf.dSYM | FileCheck %s -check-prefixes=DWARF,COMMON +RUN: llvm-dwarfdump -v %t.apple.dSYM | FileCheck %s -check-prefixes=APPLE,COMMON + +COMMON: .debug_info contents +COMMON: {{.*}}DW_TAG_namespace +COMMON: DW_AT_name{{.*}}"A" +COMMON: {{.*}}DW_TAG_namespace +COMMON: DW_AT_name{{.*}}"B" +COMMON: [[NAMESPACE:0x[0-9a-f]*]]:{{.*}}DW_TAG_namespace +COMMON: DW_AT_name{{.*}}"C" +COMMON: [[IMPORTED:0x[0-9a-f]*]]:{{.*}}DW_TAG_imported_declaration +COMMON: DW_AT_name{{.*}}"C" + +DWARF: .debug_names contents: +DWARF: Bucket 0 [ +DWARF-NEXT: Name {{.*}} { +DWARF-NEXT: Hash: {{.*}} +DWARF-NEXT: String: {{.*}} "C" +DWARF-NEXT: Entry {{.*}} { +DWARF-NEXT: Abbrev: {{.*}} +DWARF-NEXT: Tag: DW_TAG_namespace +DWARF-NEXT: DW_IDX_die_offset: [[NAMESPACE]] +DWARF-NEXT: } +DWARF-NEXT: Entry {{.*}} { +DWARF-NEXT: Abbrev: {{.*}} +DWARF-NEXT: Tag: DW_TAG_imported_declaration +DWARF-NEXT: DW_IDX_die_offset: [[IMPORTED]] +DWARF-NEXT: } +DWARF-NEXT: } + +APPLE: .apple_namespaces contents: +APPLE: Bucket 1 [ +APPLE-NEXT: Hash {{.*}} [ +APPLE-NEXT: Name@{{.*}} { +APPLE-NEXT: String: {{.*}} "C" +APPLE-NEXT: Data 0 [ +APPLE-NEXT: Atom[0]: [[NAMESPACE]] +APPLE-NEXT: ] +APPLE-NEXT: Data 1 [ +APPLE-NEXT: Atom[0]: [[IMPORTED]] +APPLE-NEXT: ] +APPLE-NEXT: } +APPLE-NEXT: ] +APPLE-NEXT: ] diff --git a/llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp b/llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp new file mode 100644 index 0000000..2ee98ce --- /dev/null +++ b/llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp @@ -0,0 +1,17 @@ +// Compiled on macOS using: +// clang++ -c -std=c++2a -gdwarf-4 -O0 -o accel-imported-declaration.macho-arm64.o + +namespace A { +namespace B { +namespace C { +int a = -1; +} // namespace C +} // namespace B + +namespace C = B::C; + +using namespace B::C; +using B::C::a; +} // namespace A + +int main() { return A::a; } diff --git a/llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.macho-arm64 b/llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.macho-arm64 new file mode 100755 index 0000000000000000000000000000000000000000..691d553892e13da18a070655d7c6b36029afeee4 GIT binary patch literal 33843 zcmeI*U1%It6bJCLn?zcZn8pvNsJPImN$c*oHq^xr+-*yA*tYXGCN_n*)Miy zO{0NsQ>(TKVnJ#Js{w_8Scpa>d9cKSf-lA-q)I6kebNU(&<7he@toP&x|^UWTJYt6 z!kxM2-aB{h{bgQfXLjkweZMszcmRxV0)hW3Q_g&*&b*7C3~ zE^k_s$voe4QK~E4-BsRgUmq-QBPXxoW+}2Z38gIafK{j$^78q{9xiNVvol2U;!an@ne3iu^!S&Zw_&+|{*8WJirLFis$gf%#=MvkUiDf;-HA#Cj zQGSzD@vOL_Z}|NXFm_23;dY6{#pyK$Jn;b=lAiVV!ie{1100#k-OH6 z-#eJK%!F^Ja|w?ox|55nC!Z(Uz~?3>7hj3nxY+%}M3aS0+3h$$00Izz00bZa0SG_< z0uX=z1Rwwb2tWV=5P$##AOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb z2tWV=5P$##AOHafKmY<)Utnby&8^hYG{5^hL9XC5=f`I%)H!+8_g3e2rDu5;S>9FV z_q6RY?Yy@vxxC|C!|y0>a^8OCihG5Fn-LIz00bZa0SG_<0uX=z1Rwwb2tWV=5P$## zAOHafKmY;|fB*y_009U<00Izz00bZa0SG_<0uX=z1Rwwb2tWV=5P$##AOHafKmY;| zfB*y_009X6&jKF4fARMMWGSVe5qCZVFU{rQQsl4X&yw?C_r7+2$iLIS%ddy2DiKxY z0n^A?riz++#LSS_{y@50QFTI(CF#Km8ar5=tXPwKMoMlh-(fF)%U#9}tjbSt-p4E5 zd-hvH`sGp|ALO?Wq+ZR3hLT*`8o0>!+9f1!FX^x6x<@*kkp9y3$QJ742NZ&ZYvr5k zbuKv;a+$lXWIhimRm!5&S{G$=XisF#Ojb+8jHqtLdviuq+Y__2c>I}!cOaGNw=$-g z)gl9Wrq6EFEHi6qRw@E&>Ezf*G@SRi`KK(dD1yaNt}9zHwbo9(`SSf=EcPt?GW6u)srNT}8-}*r*WdW- zeDmVe+19U5AAIkF?$l>L^vzU$H8HUaQo|L#xLz&Xi}dH9_k$RoqF-@$IMHw{Jvx0xjzA3 CxtYTN literal 0 HcmV?d00001 -- 2.7.4