[PATCH] D143458: [llvm][dsymutil] Add DW_TAG_imported_declaration to accelerator table
Michael Buch via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Mon Feb 6 19:47:20 PST 2023
Michael137 created this revision.
Michael137 added a reviewer: aprantl.
Herald added a subscriber: hiraditya.
Herald added a reviewer: JDevlieghere.
Herald added a project: All.
Michael137 requested review of this revision.
Herald added a project: LLVM.
Herald added a subscriber: llvm-commits.
**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
Repository:
rG LLVM Github Monorepo
https://reviews.llvm.org/D143458
Files:
llvm/lib/DWARFLinker/DWARFLinker.cpp
llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test
llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp
llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.macho-arm64
Index: llvm/test/tools/dsymutil/Inputs/accel-imported-declaration.cpp
===================================================================
--- /dev/null
+++ 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; }
Index: llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test
===================================================================
--- /dev/null
+++ llvm/test/tools/dsymutil/ARM/accel-imported-declarations.test
@@ -0,0 +1,48 @@
+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: dsymutil -accelerator=None %p/../Inputs/accel-imported-declaration.macho-arm64 -o %t.none.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: ]
Index: llvm/lib/DWARFLinker/DWARFLinker.cpp
===================================================================
--- llvm/lib/DWARFLinker/DWARFLinker.cpp
+++ 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]) {
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D143458.495357.patch
Type: text/x-patch
Size: 3231 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20230207/65d0fa53/attachment.bin>
More information about the llvm-commits
mailing list