diff --git a/clang/lib/CodeGen/CGDebugInfo.cpp b/clang/lib/CodeGen/CGDebugInfo.cpp index 3b4932cc4a30f..f1f4a1b79b7bc 100644 --- a/clang/lib/CodeGen/CGDebugInfo.cpp +++ b/clang/lib/CodeGen/CGDebugInfo.cpp @@ -1680,14 +1680,26 @@ CGDebugInfo::CreateRecordStaticField(const VarDecl *Var, llvm::DIType *RecordTy, unsigned LineNumber = getLineNumber(Var->getLocation()); StringRef VName = Var->getName(); + // FIXME: to avoid complications with type merging we should + // emit the constant on the definition instead of the declaration. + 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()); + } + } + 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, Tag, Align); + llvm::DIDerivedType *GV = DBuilder.createStaticMemberType( + RecordTy, VName, VUnit, LineNumber, VTy, Flags, C, 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 f2d4d9408a829..d3b6a363c5bd8 100644 --- a/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp +++ b/clang/test/CodeGenCXX/debug-info-static-inline-member.cpp @@ -49,19 +49,19 @@ int main() { // CHECK: ![[INT_DECL]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_int_with_addr", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 25 // CHECK: ![[INT_DECL2:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_int2", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 26 // CHECK: ![[FLOAT_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_float", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: float // CHECK: ![[ENUM_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_enum", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 -1 // CHECK: ![[EMPTY_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_struct_with_addr", // CHECK-SAME: flags: DIFlagStaticMember @@ -69,15 +69,15 @@ int main() { // CHECK: ![[IENUM_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "inline_enum", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 -1 // CHECK: ![[EMPTY_TEMPLATED_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "empty_templated", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 1 // CHECK: ![[TEMPLATE_DECL:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "cexpr_template", // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 1 // CHECK: !DIGlobalVariableExpression(var: ![[EMPTY_VAR:[0-9]+]], expr: !DIExpression()) // CHECK: ![[EMPTY_VAR]] = distinct !DIGlobalVariable(name: "cexpr_struct_with_addr", linkageName: diff --git a/clang/test/CodeGenCXX/debug-info-static-member.cpp b/clang/test/CodeGenCXX/debug-info-static-member.cpp index a2d25e98ed1cb..096bfa0271e0e 100644 --- a/clang/test/CodeGenCXX/debug-info-static-member.cpp +++ b/clang/test/CodeGenCXX/debug-info-static-member.cpp @@ -74,7 +74,7 @@ int C::a = 4; // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i1 true // 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" @@ -82,7 +82,7 @@ int C::a = 4; // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagProtected | DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: float // DWARF4: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_member, name: "c" // DWARF5: ![[DECL_C:[0-9]+]] = !DIDerivedType(tag: DW_TAG_variable, name: "c" @@ -97,7 +97,7 @@ int C::a = 4; // CHECK-NOT: align: // CHECK-NOT: offset: // CHECK-SAME: flags: DIFlagPublic | DIFlagStaticMember -// CHECK-NOT: extraData: +// CHECK-SAME: extraData: i32 18 // // DWARF4: !DIDerivedType(tag: DW_TAG_member, name: "x_a" // DWARF5: !DIDerivedType(tag: DW_TAG_variable, name: "x_a" @@ -154,7 +154,7 @@ struct V { // const_va is not emitted for MS targets. // NOT-MS: !DIDerivedType(tag: DW_TAG_member, name: "const_va", // NOT-MS-SAME: line: [[@LINE-5]] -// NOT-MS-NOT: extraData: +// NOT-MS-SAME: extraData: i32 42 const int V::const_va; namespace x {