Skip to content

[lldb][DWARFASTParserClang] GetClangDeclForDIE: don't create VarDecl for static data members #77155

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 2 commits into from
Jan 8, 2024
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 20 additions & 1 deletion lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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;
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
struct NoCtor {
NoCtor();
static int i;
};

int NoCtor::i = 15;

int main() { return NoCtor::i; }
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
# UNSUPPORTED: system-darwin, system-windows
Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just out of curiosity — we are evaluating a static constant. Do we actually need to run the binary, or could we run the expression against e.g., an ELF binary on Darwin, too, by just evaluating the expression and not launching at all?

Copy link
Collaborator

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That's actually a great question, but I think for now the answer with lldb is "no, expression evaluation doesn't work without a running process" - but I was just commenting on an internal bug where folks were having trouble investigating core dumps with some of our pretty printers that evaluate expressions that happen to be constants that gdb can evaluate on a core/without a running process, but it seems lldb can't do that...

So while that sounds like a good thing, my understanding is that lldb can't do that at the moment.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

As @dwblaikie points out, we need a process to run the expression. But if we specify -flimit-debug-info I can repro the crash on Darwin too, so we can remove UNSUPPORTED here and get the coverage that way.


# 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'