Skip to content

Commit 35b10ac

Browse files
authored
[lldb][DWARFASTParserClang] DWARFv5: support DW_TAG_variable static data members declarations (#72236)
The accepted DWARFv5 issue 161118.1: "DW_TAG for C++ static data members" specifies that static data member declaration be described by DW_TAG_variable. Make sure we recognize such members. Depends on: * #72234 * #72235
1 parent faa3a5e commit 35b10ac

File tree

1 file changed

+7
-2
lines changed

1 file changed

+7
-2
lines changed

lldb/source/Plugins/SymbolFile/DWARF/DWARFASTParserClang.cpp

+7-2
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ static bool ShouldIgnoreArtificialField(llvm::StringRef FieldName) {
144144

145145
std::optional<DWARFFormValue>
146146
DWARFASTParserClang::FindConstantOnVariableDefinition(DWARFDIE die) {
147-
assert(die.Tag() == llvm::dwarf::DW_TAG_member);
147+
assert(die.Tag() == DW_TAG_member || die.Tag() == DW_TAG_variable);
148148

149149
auto *dwarf = die.GetDWARF();
150150
if (!dwarf)
@@ -2889,7 +2889,7 @@ void DWARFASTParserClang::CreateStaticMemberVariable(
28892889
const DWARFDIE &die, const MemberAttributes &attrs,
28902890
const lldb_private::CompilerType &class_clang_type) {
28912891
Log *log = GetLog(DWARFLog::TypeCompletion | DWARFLog::Lookups);
2892-
assert(die.Tag() == DW_TAG_member);
2892+
assert(die.Tag() == DW_TAG_member || die.Tag() == DW_TAG_variable);
28932893

28942894
Type *var_type = die.ResolveTypeUID(attrs.encoding_form.Reference());
28952895

@@ -2965,6 +2965,7 @@ void DWARFASTParserClang::ParseSingleMember(
29652965
// data members is DW_AT_declaration, so we check it instead.
29662966
// FIXME: Since DWARFv5, static data members are marked DW_AT_variable so we
29672967
// can consistently detect them on both GCC and Clang without below heuristic.
2968+
// Remove this block if we ever drop DWARFv4 support.
29682969
if (attrs.member_byte_offset == UINT32_MAX &&
29692970
attrs.data_bit_offset == UINT64_MAX && attrs.is_declaration) {
29702971
CreateStaticMemberVariable(die, attrs, class_clang_type);
@@ -3195,6 +3196,10 @@ bool DWARFASTParserClang::ParseChildMembers(
31953196
}
31963197
break;
31973198

3199+
case DW_TAG_variable: {
3200+
const MemberAttributes attrs(die, parent_die, module_sp);
3201+
CreateStaticMemberVariable(die, attrs, class_clang_type);
3202+
} break;
31983203
case DW_TAG_member:
31993204
ParseSingleMember(die, parent_die, class_clang_type,
32003205
default_accessibility, layout_info, last_field_info);

0 commit comments

Comments
 (0)