akhuang created this revision. akhuang added a reviewer: dblaikie. Herald added a project: clang. Herald added a subscriber: cfe-commits. akhuang requested review of this revision.
Debug info for inline static data members was missing the constant value, because the initializer for these static data members is not always emitted. Now also try to get the initializer from the templated static data member if the variable doesn't have an initializer. (related to discussion on https://bugs.llvm.org/show_bug.cgi?id=47580) Repository: rG LLVM Github Monorepo https://reviews.llvm.org/D89286 Files: clang/lib/CodeGen/CGDebugInfo.cpp clang/test/CodeGenCXX/debug-info-static-member.cpp Index: clang/test/CodeGenCXX/debug-info-static-member.cpp =================================================================== --- clang/test/CodeGenCXX/debug-info-static-member.cpp +++ clang/test/CodeGenCXX/debug-info-static-member.cpp @@ -1,6 +1,7 @@ // RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck %s +// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++17 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clang_cc1 -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited %s -emit-llvm -o - | FileCheck --check-prefix MSVC %s // PR14471 @@ -45,6 +46,9 @@ // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var" +// CHECK-SAME: extraData: i32 7 +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "static_constexpr_decl_templ_var" +// CHECK-SAME: extraData: i32 8 int C::a = 4; // CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression()) @@ -133,6 +137,11 @@ template<typename T> struct static_decl_templ { static const int static_decl_templ_var = 7; +#if __cplusplus >= 201103L + static constexpr int static_constexpr_decl_templ_var = 8; +#else + static const int static_constexpr_decl_templ_var = 8; +#endif }; template<typename T> Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -1415,14 +1415,20 @@ unsigned LineNumber = getLineNumber(Var->getLocation()); StringRef VName = Var->getName(); llvm::Constant *C = nullptr; - if (Var->getInit()) { - const APValue *Value = Var->evaluateValue(); - if (Value) { - if (Value->isInt()) - C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); - if (Value->isFloat()) - C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); - } + APValue *Value = nullptr; + if (Var->getInit()) + Value = Var->evaluateValue(); + else if (auto *TemplateDecl = Var->getInstantiatedFromStaticDataMember()) { + // Inline static data members might not have an initialization. + if (TemplateDecl->getInit()) + Value = TemplateDecl->evaluateValue(); + } + + if (Value) { + if (Value->isInt()) + C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); + if (Value->isFloat()) + C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); } llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
Index: clang/test/CodeGenCXX/debug-info-static-member.cpp =================================================================== --- clang/test/CodeGenCXX/debug-info-static-member.cpp +++ clang/test/CodeGenCXX/debug-info-static-member.cpp @@ -1,6 +1,7 @@ // RUN: %clangxx -target x86_64-unknown-unknown -g %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++98 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++11 %s -emit-llvm -S -o - | FileCheck %s +// RUN: %clangxx -target x86_64-unknown-unknown -g -std=c++17 %s -emit-llvm -S -o - | FileCheck %s // RUN: %clang_cc1 -triple x86_64-windows-msvc -gcodeview -debug-info-kind=limited %s -emit-llvm -o - | FileCheck --check-prefix MSVC %s // PR14471 @@ -45,6 +46,9 @@ // CHECK-NOT: DIFlagFwdDecl // CHECK-SAME: ){{$}} // CHECK: !DIDerivedType(tag: DW_TAG_member, name: "static_decl_templ_var" +// CHECK-SAME: extraData: i32 7 +// CHECK-DAG: !DIDerivedType(tag: DW_TAG_member, name: "static_constexpr_decl_templ_var" +// CHECK-SAME: extraData: i32 8 int C::a = 4; // CHECK: [[B]] = !DIGlobalVariableExpression(var: [[BV:.*]], expr: !DIExpression()) @@ -133,6 +137,11 @@ template<typename T> struct static_decl_templ { static const int static_decl_templ_var = 7; +#if __cplusplus >= 201103L + static constexpr int static_constexpr_decl_templ_var = 8; +#else + static const int static_constexpr_decl_templ_var = 8; +#endif }; template<typename T> Index: clang/lib/CodeGen/CGDebugInfo.cpp =================================================================== --- clang/lib/CodeGen/CGDebugInfo.cpp +++ clang/lib/CodeGen/CGDebugInfo.cpp @@ -1415,14 +1415,20 @@ unsigned LineNumber = getLineNumber(Var->getLocation()); StringRef VName = Var->getName(); llvm::Constant *C = nullptr; - if (Var->getInit()) { - const APValue *Value = Var->evaluateValue(); - if (Value) { - if (Value->isInt()) - C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); - if (Value->isFloat()) - C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); - } + APValue *Value = nullptr; + if (Var->getInit()) + Value = Var->evaluateValue(); + else if (auto *TemplateDecl = Var->getInstantiatedFromStaticDataMember()) { + // Inline static data members might not have an initialization. + if (TemplateDecl->getInit()) + Value = TemplateDecl->evaluateValue(); + } + + if (Value) { + if (Value->isInt()) + C = llvm::ConstantInt::get(CGM.getLLVMContext(), Value->getInt()); + if (Value->isFloat()) + C = llvm::ConstantFP::get(CGM.getLLVMContext(), Value->getFloat()); } llvm::DINode::DIFlags Flags = getAccessFlag(Var->getAccess(), RD);
_______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits