[llvm] 6576726 - [llvm][DebugInfo] Add DW_TAG_imported_declaration to accelerator tables

Michael Buch via llvm-commits llvm-commits at lists.llvm.org
Thu Feb 9 17:34:24 PST 2023


Author: Michael Buch
Date: 2023-02-10T01:33:51Z
New Revision: 657672667fd16aa49897093b925c93c900286c8d

URL: https://github.com/llvm/llvm-project/commit/657672667fd16aa49897093b925c93c900286c8d
DIFF: https://github.com/llvm/llvm-project/commit/657672667fd16aa49897093b925c93c900286c8d.diff

LOG: [llvm][DebugInfo] Add DW_TAG_imported_declaration to accelerator tables

**Summary**

After this patch, `DW_TAG_imported_declaration`s will be emitted into
the DWARF accelerator tables (under `.apple_namespaces`)

**Motivation**

Currently LLDB expression evaluation doesn't see through namespace
aliases. This is because LLDB only considers namespaces that are
part of `.apple_namespaces` when building a nested namespace
identifier for C++, which currently doesn't include import
declarations. The alternative to putting imports into accelerator
tables is to do a linear scan of a `DW_TAG_namespace` and look
for import declarations that look like they would satisfy the lookup
request, which is prohibitively expensive.

**Testing**

* Added unit-test

Differential Revision: https://reviews.llvm.org/D143397

Added: 
    llvm/test/DebugInfo/Inputs/accel-imported-declaration.cpp
    llvm/test/DebugInfo/Inputs/accel-imported-declaration.macho-arm64.o
    llvm/test/DebugInfo/accel-imported-declaration.test

Modified: 
    llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp

Removed: 
    


################################################################################
diff  --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
index 6dde50375a60c..4c6a5bb5bf0dd 100644
--- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp
@@ -1289,9 +1289,17 @@ DIE *DwarfCompileUnit::constructImportedEntityDIE(
   addSourceLine(*IMDie, Module->getLine(), Module->getFile());
   addDIEEntry(*IMDie, dwarf::DW_AT_import, *EntityDie);
   StringRef Name = Module->getName();
-  if (!Name.empty())
+  if (!Name.empty()) {
     addString(*IMDie, dwarf::DW_AT_name, Name);
 
+    // FIXME: if consumers ever start caring about handling
+    // unnamed import declarations such as `using ::nullptr_t`
+    // or `using namespace std::ranges`, we could add the
+    // import declaration into the accelerator table with the
+    // name being the one of the entity being imported.
+    DD->addAccelNamespace(*CUNode, Name, *IMDie);
+  }
+
   // This is for imported module with renamed entities (such as variables and
   // subprograms).
   DINodeArray Elements = Module->getElements();

diff  --git a/llvm/test/DebugInfo/Inputs/accel-imported-declaration.cpp b/llvm/test/DebugInfo/Inputs/accel-imported-declaration.cpp
new file mode 100644
index 0000000000000..76a8decbebc21
--- /dev/null
+++ b/llvm/test/DebugInfo/Inputs/accel-imported-declaration.cpp
@@ -0,0 +1,15 @@
+// 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

diff  --git a/llvm/test/DebugInfo/Inputs/accel-imported-declaration.macho-arm64.o b/llvm/test/DebugInfo/Inputs/accel-imported-declaration.macho-arm64.o
new file mode 100644
index 0000000000000..3c5275a5674f6
Binary files /dev/null and b/llvm/test/DebugInfo/Inputs/accel-imported-declaration.macho-arm64.o 
diff er

diff  --git a/llvm/test/DebugInfo/accel-imported-declaration.test b/llvm/test/DebugInfo/accel-imported-declaration.test
new file mode 100644
index 0000000000000..be9dd9a884e04
--- /dev/null
+++ b/llvm/test/DebugInfo/accel-imported-declaration.test
@@ -0,0 +1,37 @@
+RUN: llvm-dwarfdump -v %p/Inputs/accel-imported-declaration.macho-arm64.o | FileCheck %s
+RUN: llvm-dwarfdump -verify %p/Inputs/accel-imported-declaration.macho-arm64.o | FileCheck %s --check-prefix=VERIFY
+
+Gather some DIE indexes to verify the accelerator table contents.
+
+CHECK: .debug_info contents
+CHECK: {{.*}}DW_TAG_namespace
+CHECK:   DW_AT_name{{.*}}"A"
+CHECK: {{.*}}DW_TAG_namespace
+CHECK:   DW_AT_name{{.*}}"B"
+CHECK: [[NAMESPACE:0x[0-9a-f]*]]:{{.*}}DW_TAG_namespace
+CHECK:   DW_AT_name{{.*}}"C"
+CHECK: [[IMPORTED:0x[0-9a-f]*]]:{{.*}}DW_TAG_imported_declaration
+CHECK:   DW_AT_name{{.*}}"C"
+
+Check that the .apple_namespaces section contains two entries for "namespace C"
+
+CHECK:      .apple_namespaces contents:
+CHECK:      Bucket 1 [
+CHECK-NEXT:   Hash {{.*}} [
+CHECK-NEXT:     Name{{.*}} {
+CHECK-NEXT:       String: {{.*}} "C"
+CHECK-NEXT:       Data 0 [
+CHECK-NEXT:         Atom[0]: [[NAMESPACE]]
+CHECK-NEXT:       ]
+CHECK-NEXT:       Data 1 [
+CHECK-NEXT:         Atom[0]: [[IMPORTED]]
+CHECK-NEXT:       ]
+CHECK-NEXT:     }
+CHECK-NEXT:   ]
+CHECK-NEXT: ]
+
+VERIFY:      Verifying .apple_names...
+VERIFY-NEXT: Verifying .apple_types...
+VERIFY-NEXT: Verifying .apple_namespaces...
+VERIFY-NEXT: Verifying .apple_objc...
+VERIFY-NEXT: No errors.


        


More information about the llvm-commits mailing list