[Lldb-commits] [lldb] [lldb][DWARFASTParserClang] GetClangDeclForDIE: don't create VarDecl for static data members (PR #77155)

Michael Buch via lldb-commits lldb-commits at lists.llvm.org
Mon Jan 8 04:13:17 PST 2024


https://github.com/Michael137 updated https://github.com/llvm/llvm-project/pull/77155

>From cf109ab8ed2a6c3e139c168375649ab4651c4ec4 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Fri, 5 Jan 2024 12:45:46 +0000
Subject: [PATCH 1/2] [lldb][DWARFASTParserClang] GetClangDeclForDIE: don't
 create VarDecl for static data members

With DWARFv5, C++ static data members are represented as
`DW_TAG_variable`s (see `faa3a5ea9ae481da757dab1c95c589e2d5645982`).

In GetClangDeclForDIE, when trying to parse the `DW_AT_specification`
that the CU-level DW_TAG_variable points to, we would try to
`CreateVariableDeclaration`, because the static member is a `DW_TAG_variable`
too. Whereas previously it was a no-op (for `DW_TAG_member`s).

Adding `VarDecls` to RecordDecls for static data members should always be
done in `CreateStaticMemberVariable`. The test-case is an exapmle where
we would crash if we tried to create a `VarDecl` from within
`GetClangDeclForDIE` for a static data member.

This patch simply checks whether the `DW_TAG_variable` being parsed is
a static data member, and if so, trivially return from
`GetClangDeclForDIE` (as we previously did for `DW_TAG_member`s).
---
 .../SymbolFile/DWARF/DWARFASTParserClang.cpp  | 21 ++++++++++++++++-
 .../DWARF/Inputs/dwo-static-data-member.cpp   |  8 +++++++
 .../DWARF/dwo-static-data-member-access.test  | 23 +++++++++++++++++++
 3 files changed, 51 insertions(+), 1 deletion(-)
 create mode 100644 lldb/test/Shell/SymbolFile/DWARF/Inputs/dwo-static-data-member.cpp
 create mode 100644 lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test

diff --git a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
index 3e08f2550081f2..771d33bf8ff7ae 100644
--- a/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
+++ b/lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
@@ -142,6 +142,18 @@ static bool ShouldIgnoreArtificialField(llvm::StringRef FieldName) {
          || FieldName.starts_with("_vptr.");
 }
 
+/// Returns true for C++ constructs represented by clang::CXXRecordDecl
+static bool TagIsRecordType(dw_tag_t tag) {
+  switch (tag) {
+  case DW_TAG_class_type:
+  case DW_TAG_structure_type:
+  case DW_TAG_union_type:
+    return true;
+  default:
+    return false;
+  }
+}
+
 TypeSP DWARFASTParserClang::ParseTypeFromClangModule(const SymbolContext &sc,
                                                      const DWARFDIE &die,
                                                      Log *log) {
@@ -3293,12 +3305,19 @@ clang::Decl *DWARFASTParserClang::GetClangDeclForDIE(const DWARFDIE &die) {
     return nullptr;
 
   switch (die.Tag()) {
-  case DW_TAG_variable:
   case DW_TAG_constant:
   case DW_TAG_formal_parameter:
   case DW_TAG_imported_declaration:
   case DW_TAG_imported_module:
     break;
+  case DW_TAG_variable:
+    // This means 'die' is a C++ static data member.
+    // We don't want to create decls for such members
+    // here.
+    if (auto parent = die.GetParent();
+        parent.IsValid() && TagIsRecordType(parent.Tag()))
+      return nullptr;
+    break;
   default:
     return nullptr;
   }
diff --git a/lldb/test/Shell/SymbolFile/DWARF/Inputs/dwo-static-data-member.cpp b/lldb/test/Shell/SymbolFile/DWARF/Inputs/dwo-static-data-member.cpp
new file mode 100644
index 00000000000000..fa7c3500df0f9d
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/Inputs/dwo-static-data-member.cpp
@@ -0,0 +1,8 @@
+struct NoCtor {
+  NoCtor();
+  static int i;
+};
+
+int NoCtor::i = 15;
+
+int main() { return NoCtor::i; }
diff --git a/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test b/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test
new file mode 100644
index 00000000000000..da5a862c35568f
--- /dev/null
+++ b/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test
@@ -0,0 +1,23 @@
+# UNSUPPORTED: system-darwin, system-windows
+
+# In DWARFv5, C++ static data members are represented
+# as DW_TAG_variable. We make sure LLDB's expression
+# evaluator doesn't crash when trying to parse such
+# a DW_TAG_variable DIE, whose parent DIE is only
+# a forward declaration.
+
+# RUN: %clangxx_host %S/Inputs/dwo-static-data-member.cpp \
+# RUN:   -g -gdwarf-5 -gsplit-dwarf -o %t
+# RUN: %lldb %t -s %s -o exit 2>&1 | FileCheck %s
+
+breakpoint set -n main
+process launch
+
+# CHECK: Process {{.*}} stopped
+
+# There is no definition for NoCtor anywhere
+# in the debug-info, so LLDB can't evaluate
+# this expression.
+expression NoCtor::i
+# CHECK-LABEL: expression NoCtor::i
+# CHECK:       use of undeclared identifier 'NoCtor'

>From d368ce332c3466f017658102728f8e1ca1305d30 Mon Sep 17 00:00:00 2001
From: Michael Buch <michaelbuch12 at gmail.com>
Date: Mon, 8 Jan 2024 12:12:06 +0000
Subject: [PATCH 2/2] fixup! rephrase test comment and enable test on other
 platforms

---
 .../DWARF/dwo-static-data-member-access.test        | 13 +++++++------
 1 file changed, 7 insertions(+), 6 deletions(-)

diff --git a/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test b/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test
index da5a862c35568f..6e4deae7b9a0d7 100644
--- a/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test
+++ b/lldb/test/Shell/SymbolFile/DWARF/dwo-static-data-member-access.test
@@ -1,5 +1,3 @@
-# UNSUPPORTED: system-darwin, system-windows
-
 # In DWARFv5, C++ static data members are represented
 # as DW_TAG_variable. We make sure LLDB's expression
 # evaluator doesn't crash when trying to parse such
@@ -7,7 +5,7 @@
 # a forward declaration.
 
 # RUN: %clangxx_host %S/Inputs/dwo-static-data-member.cpp \
-# RUN:   -g -gdwarf-5 -gsplit-dwarf -o %t
+# RUN:   -g -gdwarf-5 -gsplit-dwarf -flimit-debug-info -o %t
 # RUN: %lldb %t -s %s -o exit 2>&1 | FileCheck %s
 
 breakpoint set -n main
@@ -15,9 +13,12 @@ process launch
 
 # CHECK: Process {{.*}} stopped
 
-# There is no definition for NoCtor anywhere
-# in the debug-info, so LLDB can't evaluate
-# this expression.
+# FIXME: The expression evaluator tries to attach
+# the static member's VarDecl to the NoCtor RecordDecl
+# before passing the AST to clang; this requires the
+# RecordDecl to be a full definition. But the debug-info
+# only contains forward declaration for NoCtor. So
+# LLDB fails to evaluate the expression.
 expression NoCtor::i
 # CHECK-LABEL: expression NoCtor::i
 # CHECK:       use of undeclared identifier 'NoCtor'



More information about the lldb-commits mailing list