diff --git a/llvm/lib/DWARFLinker/DWARFLinker.cpp b/llvm/lib/DWARFLinker/DWARFLinker.cpp --- a/llvm/lib/DWARFLinker/DWARFLinker.cpp +++ b/llvm/lib/DWARFLinker/DWARFLinker.cpp @@ -1589,6 +1589,8 @@ 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 --- /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 --- /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..0000000000000000000000000000000000000000 GIT binary patch literal 0 Hc$@