diff --git a/llvm/include/llvm/Support/ScopedPrinter.h b/llvm/include/llvm/Support/ScopedPrinter.h --- a/llvm/include/llvm/Support/ScopedPrinter.h +++ b/llvm/include/llvm/Support/ScopedPrinter.h @@ -234,6 +234,10 @@ startLine() << Label << ": " << Value << "\n"; } + virtual void printNumber(StringRef Label, float Value) { + startLine() << Label << ": " << format("%5.1f", Value) << "\n"; + } + template void printNumber(StringRef Label, StringRef Str, T Value) { printNumberImpl(Label, Str, to_string(Value)); @@ -586,6 +590,10 @@ JOS.attribute(Label, Value); } + void printNumber(StringRef Label, float Value) override { + JOS.attribute(Label, Value); + } + void printNumber(StringRef Label, const APSInt &Value) override { JOS.attributeBegin(Label); printAPSInt(Value); diff --git a/llvm/unittests/Support/ScopedPrinterTest.cpp b/llvm/unittests/Support/ScopedPrinterTest.cpp --- a/llvm/unittests/Support/ScopedPrinterTest.cpp +++ b/llvm/unittests/Support/ScopedPrinterTest.cpp @@ -10,6 +10,7 @@ #include "llvm/ADT/APSInt.h" #include "gtest/gtest.h" #include +#include using namespace llvm; @@ -553,6 +554,15 @@ W.printNumber("apsint", LargeNum); W.printNumber("label", "value", 0); + + float MaxFloat = std::numeric_limits::max(); + float MinFloat = std::numeric_limits::min(); + float NaN = std::nanf("1"); + W.printNumber("float-max", MaxFloat); + W.printNumber("float-min", MinFloat); + W.printNumber("float-nan", NaN); + W.printNumber("float-42.0", 42.0f); + W.printNumber("float-42.5625", 42.5625f); }; const char *ExpectedOut = R"(uint64_t-max: 18446744073709551615 @@ -573,6 +583,11 @@ int8_t-min: -128 apsint: 9999999999999999999999 label: value (0) +float-max: 340282346638528859811704183484516925440.0 +float-min: 0.0 +float-nan: nan +float-42.0: 42.0 +float-42.5625: 42.6 )"; const char *JSONExpectedOut = R"({ @@ -596,7 +611,12 @@ "label": { "Name": "value", "Value": 0 - } + }, + "float-max": 3.4028234663852886e+38, + "float-min": 1.1754943508222875e-38, + "float-nan": nan, + "float-42.0": 42, + "float-42.5625": 42.5625 })"; verifyAll(ExpectedOut, JSONExpectedOut, PrintFunc); }