Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
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,24 @@
# 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 -flimit-debug-info -o %t
# RUN: %lldb %t -s %s -o exit 2>&1 | FileCheck %s

breakpoint set -n main
process launch

# CHECK: Process {{.*}} stopped

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