https://github.com/Michael137 created https://github.com/llvm/llvm-project/pull/72235
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. >From c0db61f318f50a1cf219c69af9c6b624b05c9da1 Mon Sep 17 00:00:00 2001 From: Michael Buch <michaelbuc...@gmail.com> Date: Mon, 13 Nov 2023 09:48:39 +0000 Subject: [PATCH] [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. --- clang/lib/CodeGen/CGDebugInfo.cpp | 8 +++-- .../debug-info-static-inline-member.cpp | 4 +-- .../CodeGenCXX/debug-info-static-member.cpp | 36 ++++++++++++------- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 04ca02cfe858579..f3de91d4a39ebee 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1679,9 +1679,13 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, StringRef VName = Var->getName(); llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD); + auto Tag = CGM.getCodeGenOpts().DwarfVersion >= 5 + ? llvm::dwarf::DW_TAG_variable + : llvm::dwarf::DW_TAG_member; auto Align = getDeclAlignIfRequired(Var, CGM.getContext()); - llvm::DIDerivedType *GV = DBuilder.createStaticMemberType( - RecordTy, VName, VUnit, LineNumber, VTy, Flags, /* Val */ nullptr, Align); + llvm::DIDerivedType *GV = + DBuilder.createStaticMemberType(RecordTy, VName, VUnit, LineNumber, VTy, + Flags, /* Val */ nullptr, Tag, Align); StaticDataMemberCache[Var->getCanonicalDecl()].reset(GV); StaticDataMemberDefinitionsToEmit.push_back(Var->getCanonicalDecl()); return GV; diff --git a/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp b/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp index bfb7ad6b80fabf3..f2d4d9408a8297a 100644 --- a/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp +++ b/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp @@ -1,5 +1,5 @@ -// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -debug-info-kind=standalone %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s -// RUN: %clangxx -target arm64-apple-macosx11.0.0 -g -debug-info-kind=limited %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s +// 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 +// 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 enum class Enum : int { VAL = -1 diff --git a/clang/test/CodeGenCXX/debug-info-static-member.cpp b/clang/test/CodeGenCXX/debug-info-static-member.cpp index 578995801c6400b..a2d25e98ed1cb62 100644 --- a/clang/test/CodeGenCXX/debug-info-static-member.cpp +++ b/clang/test/CodeGenCXX/debug-info-static-member.cpp @@ -1,7 +1,8 @@ -// RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s -// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s -// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,NOT-MS %s -// RUN: %clangxx -target x86_64-windows-msvc -g %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK %s +// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-4 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4,NOT-MS %s +// 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 +// 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 +// RUN: %clangxx -target x86_64-unknown-unknown -g -gdwarf-5 -std=c++11 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF5 %s +// RUN: %clangxx -target x86_64-windows-msvc -g -gdwarf-4 %s -emit-llvm -S -o - | FileCheck --check-prefixes=CHECK,DWARF4 %s // PR14471 // CHECK: @{{.*}}a{{.*}} = dso_local global i32 4, align 4, !dbg [[A:![0-9]+]] @@ -39,17 +40,20 @@ class C // // CHECK: !DICompositeType(tag: DW_TAG_enumeration_type, name: "X"{{.*}}) // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "anon_static_decl_struct" -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var" +// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "anon_static_decl_var" +// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "anon_static_decl_var" // CHECK: !DICompositeType(tag: DW_TAG_structure_type, name: "static_decl_templ<int>" // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var" +// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var" +// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "static_decl_templ_var" int C::a = 4; // CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression()) // CHECK: [[BV]] = distinct !DIGlobalVariable(name: "b", // CHECK-SAME: declaration: ![[DECL_B:[0-9]+]]) -// CHECK: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_member, name: "b" +// DWARF4: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_member, name: "b" +// DWARF5: ![[DECL_B]] = !DIDerivedType(tag: DW_TAG_variable, name: "b" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: @@ -57,40 +61,46 @@ int C::a = 4; // // CHECK: !DICompositeType(tag: DW_TAG_class_type, name: "C"{{.*}}) // -// CHECK: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_member, name: "a" +// DWARF4: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_member, name: "a" +// DWARF5: ![[DECL_A]] = !DIDerivedType(tag: DW_TAG_variable, name: "a" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagStaticMember) // -// CHECK: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_a" +// DWARF4: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_a" +// DWARF5: ![[CONST_A_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_a" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagStaticMember // CHECK-NOT: extraData: -// CHECK: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_b" +// DWARF4: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_b" +// DWARF5: ![[CONST_B_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_b" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagProtected | DIFlagStaticMember // CHECK-NOT: extraData: -// CHECK: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c" +// DWARF4: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c" +// DWARF5: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "c" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember) // -// CHECK: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_c" +// DWARF4: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "const_c" +// DWARF5: ![[CONST_C_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "const_c" // CHECK-NOT: size: // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember // CHECK-NOT: extraData: // -// CHECK: !DIDerivedType(tag: DW_TAG_member, name: "x_a" +// DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "x_a" +// DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "x_a" // CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember) int C::b = 2; _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits