Index: lib/CodeGen/CGDebugInfo.cpp =================================================================== --- lib/CodeGen/CGDebugInfo.cpp +++ lib/CodeGen/CGDebugInfo.cpp @@ -3760,6 +3760,9 @@ if (Init.isInt()) InitExpr = DBuilder.createConstantValueExpression(Init.getInt().getExtValue()); + else if (Init.isFloat() && CGM.getContext().getTypeSize(VD->getType()) <= 64) + InitExpr = + DBuilder.createConstantValueExpression(Init.getFloat().bitcastToAPInt().getZExtValue()); GV.reset(DBuilder.createGlobalVariable( DContext, Name, StringRef(), Unit, getLineNumber(VD->getLocation()), Ty, true, InitExpr, getOrCreateStaticDataMemberDeclarationOrNull(VarD), Index: test/CodeGen/debug-info-static-const-fp.c =================================================================== --- /dev/null +++ test/CodeGen/debug-info-static-const-fp.c @@ -0,0 +1,24 @@ +// RUN: %clang -emit-llvm -O0 -S -g %s -o - | FileCheck %s + +// Per PR26619, check that for referenced static const of floating-point type, +// we emit its constant value in debug info. NOTE that PR26619 is not yet fixed for long double. + +static const __fp16 hVal = 29/13.0f; // 2.2307692307692307692 (2.23046875) + +static const float fVal = -147/17.0f; // -8.6470588235294117647 (-8.64705849) + +static const double dVal = 19637/7.0; // 2805.2857142857142857 (2805.2857142857142) + +static const long double ldVal = 3/1234567.0L; // 2.4300017739012949479e-06 () + +int main() { + return hVal + fVal + dVal + ldVal; +} + +// CHECK: !4 = distinct !DIGlobalVariable(name: "hVal", scope: !0, file: !1, line: 6, type: !5, isLocal: true, isDefinition: true, expr: !7) +// CHECK: !7 = !DIExpression(DW_OP_constu, 16502, DW_OP_stack_value) +// CHECK: !8 = distinct !DIGlobalVariable(name: "fVal", scope: !0, file: !1, line: 8, type: !9, isLocal: true, isDefinition: true, expr: !11) +// CHECK: !11 = !DIExpression(DW_OP_constu, 3238681178, DW_OP_stack_value) +// CHECK: !12 = distinct !DIGlobalVariable(name: "dVal", scope: !0, file: !1, line: 10, type: !13, isLocal: true, isDefinition: true, expr: !15) +// CHECK: !15 = !DIExpression(DW_OP_constu, 4658387303597904457, DW_OP_stack_value) +// CHECK: !16 = distinct !DIGlobalVariable(name: "ldVal", scope: !0, file: !1, line: 12, type: !17, isLocal: true, isDefinition: true)