[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