Skip to content

Commit a933f17

Browse files
committed
[clang][DebugInfo] DWARFv5: static data members declarations are DW_TAG_variable
This patch implements the DWARFv5 issue 161118.1: "DW_TAG for C++ static data members". This will simplify LLDB's handling of static data members greatly in the long term since we no longer need to differentiate non-static from static data member declarations using non-portable heuristics.
1 parent da90fd7 commit a933f17

File tree

3 files changed

+31
-18
lines changed

3 files changed

+31
-18
lines changed

clang/lib/CodeGen/CGDebugInfo.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1679,10 +1679,13 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy,
16791679
StringRef VName = Var->getName();
16801680

16811681
llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
1682+
auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5
1683+
? llvm::dwarf::DW_TAG_variable
1684+
: llvm::dwarf::DW_TAG_member;
16821685
auto Align = getDeclAlignIfRequired(Var, CGM.getContext());
1683-
llvm::DIDerivedType *GV = DBuilder.createStaticMemberType(
1684-
RecordTy, VName, VUnit, LineNumber, VTy, Flags, /* Val */ nullptr,
1685-
llvm::dwarf::DW_TAG_member, Align);
1686+
llvm::DIDerivedType *GV =
1687+
DBuilder.createStaticMemberType(RecordTy, VName, VUnit, LineNumber, VTy,
1688+
Flags, /* Val */ nullptr, Tag, Align);
16861689
StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV);
16871690
StaticDataMemberDefinitionsToEmit.push_back(Var->getCanonicalDecl());
16881691
return GV;

clang/test/CodeGenCXX/debug-info-static-inline-member.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -debug-info-kind=standalone %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s
2-
// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -debug-info-kind=limited %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s
1+
// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -gdwarf-4 -debug-info-kind=standalone %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s
2+
// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -gdwarf-4 -debug-info-kind=limited %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s
33

44
enum class Enum : int {
55
VAL = -1

clang/test/CodeGenCXX/debug-info-static-member.cpp

Lines changed: 23 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,8 @@
1-
// RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s
2-
// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s
3-
// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s
4-
// RUN: %clangxx -target x86_64-windows-msvc -g %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s
1+
// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-4 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4,NOT-MS %s
2+
// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-4 -std=c++98 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4,NOT-MS %s
3+
// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-4 -std=c++11 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4,NOT-MS %s
4+
// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-5 -std=c++11 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF5 %s
5+
// RUN: %clangxx -target x86_64-windows-msvc -g -gdwarf-4 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4 %s
56
// PR14471
67

78
// CHECK: @{{.*}}a{{.*}} = dso_local global i32 4, align 4, !dbg [[A:![0-9]+]]
@@ -39,58 +40,67 @@ class C
3940
//
4041
// CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "X"{{.*}})
4142
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "anon_static_decl_struct"
42-
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var"
43+
// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var"
44+
// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "anon_static_decl_var"
4345
// CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "static_decl_templ<int>"
4446
// CHECK-NOT: DIFlagFwdDecl
4547
// CHECK-SAME: ){{$}}
46-
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var"
48+
// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var"
49+
// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "static_decl_templ_var"
4750

4851
int C::a = 4;
4952
// CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression())
5053
// CHECK: [[BV]] = distinct !DIGlobalVariable(name: "b",
5154
// CHECK-SAME: declaration: ![[DECL_B:[0-9]+]])
52-
// CHECK: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_member, name: "b"
55+
// DWARF4: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_member, name: "b"
56+
// DWARF5: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_variable, name: "b"
5357
// CHECK-NOT: size:
5458
// CHECK-NOT: align:
5559
// CHECK-NOT: offset:
5660
// CHECK-SAME: flags: DIFlagProtected | DIFlagStaticMember)
5761
//
5862
// CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "C"{{.*}})
5963
//
60-
// CHECK: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_member, name: "a"
64+
// DWARF4: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_member, name: "a"
65+
// DWARF5: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_variable, name: "a"
6166
// CHECK-NOT: size:
6267
// CHECK-NOT: align:
6368
// CHECK-NOT: offset:
6469
// CHECK-SAME: flags: DIFlagStaticMember)
6570
//
66-
// CHECK: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_a"
71+
// DWARF4: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_a"
72+
// DWARF5: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_a"
6773
// CHECK-NOT: size:
6874
// CHECK-NOT: align:
6975
// CHECK-NOT: offset:
7076
// CHECK-SAME: flags: DIFlagStaticMember
7177
// CHECK-NOT: extraData:
7278

73-
// CHECK: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_b"
79+
// DWARF4: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_b"
80+
// DWARF5: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_b"
7481
// CHECK-NOT: size:
7582
// CHECK-NOT: align:
7683
// CHECK-NOT: offset:
7784
// CHECK-SAME: flags: DIFlagProtected | DIFlagStaticMember
7885
// CHECK-NOT: extraData:
7986

80-
// CHECK: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c"
87+
// DWARF4: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c"
88+
// DWARF5: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "c"
8189
// CHECK-NOT: size:
8290
// CHECK-NOT: align:
8391
// CHECK-NOT: offset:
8492
// CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember)
8593
//
86-
// CHECK: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_c"
94+
// DWARF4: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_c"
95+
// DWARF5: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_c"
8796
// CHECK-NOT: size:
8897
// CHECK-NOT: align:
8998
// CHECK-NOT: offset:
9099
// CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember
91100
// CHECK-NOT: extraData:
92101
//
93-
// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "x_a"
102+
// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "x_a"
103+
// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "x_a"
94104
// CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember)
95105

96106
int C::b = 2;

0 commit comments

Comments
 (0)