Index: lldb/include/lldb/Target/Target.h =================================================================== --- lldb/include/lldb/Target/Target.h +++ lldb/include/lldb/Target/Target.h @@ -139,6 +139,8 @@ bool GetEnableSyntheticValue() const; + uint32_t GetMaxZeroPaddingInFloatFormat() const; + uint32_t GetMaximumNumberOfChildrenToDisplay() const; uint32_t GetMaximumSizeOfStringSummary() const; Index: lldb/packages/Python/lldbsuite/test/functionalities/float-display/Makefile =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/float-display/Makefile @@ -0,0 +1,3 @@ +LEVEL = ../../make +C_SOURCES := main.c +include $(LEVEL)/Makefile.rules Index: lldb/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py @@ -0,0 +1,5 @@ +from lldbsuite.test import lldbinline +from lldbsuite.test import decorators + +lldbinline.MakeInlineTest( + __file__, globals(), []) Index: lldb/packages/Python/lldbsuite/test/functionalities/float-display/main.c =================================================================== --- /dev/null +++ lldb/packages/Python/lldbsuite/test/functionalities/float-display/main.c @@ -0,0 +1,121 @@ +float f_neg3 = 1.234567 / 1e3; +float f_neg4 = 1.234567 / 1e4; +float f_neg5 = 1.234567 / 1e5; +float f_neg6 = 1.234567 / 1e6; +float f_neg7 = 1.234567 / 1e7; +float f_neg8 = 1.234567 / 1e8; +float f_neg20 = 1.234567 / 1e20; +float f_neg30 = 1.234567 / 1e30; + +float f_3 = 1.234567 * 1e3; +float f_4 = 1.234567 * 1e4; +float f_5 = 1.234567 * 1e5; +float f_6 = 1.234567 * 1e6; +float f_7 = 1.234567 * 1e7; +float f_8 = 1.234567 * 1e8; +float f_20 = 1.234567 * 1e20; +float f_30 = 1.234567 * 1e30; + +double d_neg3 = 1.234567 / 1e3; +double d_neg4 = 1.234567 / 1e4; +double d_neg5 = 1.234567 / 1e5; +double d_neg6 = 1.234567 / 1e6; +double d_neg7 = 1.234567 / 1e7; +double d_neg8 = 1.234567 / 1e8; +double d_neg20 = 1.234567 / 1e20; +double d_neg30 = 1.234567 / 1e30; +double d_neg50 = 1.234567 / 1e50; +double d_neg250 = 1.234567 / 1e250; + +double d_3 = 1.234567 * 1e3; +double d_4 = 1.234567 * 1e4; +double d_5 = 1.234567 * 1e5; +double d_6 = 1.234567 * 1e6; +double d_7 = 1.234567 * 1e7; +double d_8 = 1.234567 * 1e8; +double d_20 = 1.234567 * 1e20; +double d_30 = 1.234567 * 1e30; +double d_50 = 1.234567 * 1e50; +double d_250 = 1.234567 * 1e250; + +int main (int argc, char const *argv[]) { + //% # Default setting should be 6. + //% self.expect("frame variable f_neg3", substrs=["0.00123456"]) + //% self.expect("frame variable f_neg4", substrs=["0.000123456"]) + //% self.expect("frame variable f_neg5", substrs=["0.0000123456"]) + //% self.expect("frame variable f_neg6", substrs=["0.00000123456"]) + //% self.expect("frame variable f_neg7", substrs=["1.234567", "E-7"]) + //% self.expect("frame variable f_neg8", substrs=["1.23456", "E-8"]) + //% self.expect("frame variable f_neg20", substrs=["E-20"]) + //% self.expect("frame variable f_neg30", substrs=["E-30"]) + //% self.expect("frame variable f_3", substrs=["1234.56"]) + //% self.expect("frame variable f_4", substrs=["12345.6"]) + //% self.expect("frame variable f_5", substrs=["123456"]) + //% self.expect("frame variable f_6", substrs=["123456"]) + //% self.expect("frame variable f_7", substrs=["123456"]) + //% self.expect("frame variable f_8", substrs=["123456"]) + //% self.expect("frame variable f_20", substrs=["E+20"]) + //% self.expect("frame variable f_30", substrs=["E+30"]) + //% self.expect("frame variable d_neg3", substrs=["0.00123456"]) + //% self.expect("frame variable d_neg4", substrs=["0.000123456"]) + //% self.expect("frame variable d_neg5", substrs=["0.0000123456"]) + //% self.expect("frame variable d_neg6", substrs=["0.00000123456"]) + //% self.expect("frame variable d_neg7", substrs=["1.23456", "E-7"]) + //% self.expect("frame variable d_neg8", substrs=["1.23456", "E-8"]) + //% self.expect("frame variable d_neg20", substrs=["1.23456", "E-20"]) + //% self.expect("frame variable d_neg30", substrs=["1.23456", "E-30"]) + //% self.expect("frame variable d_neg50", substrs=["1.23456", "E-50"]) + //% self.expect("frame variable d_neg250", substrs=["E-250"]) + //% self.expect("frame variable d_3", substrs=["1234.56"]) + //% self.expect("frame variable d_4", substrs=["12345.6"]) + //% self.expect("frame variable d_5", substrs=["123456"]) + //% self.expect("frame variable d_6", substrs=["1234567"]) + //% self.expect("frame variable d_7", substrs=["1234567"]) + //% self.expect("frame variable d_8", substrs=["1234567"]) + //% self.expect("frame variable d_20", substrs=["1.23456", "E+20"]) + //% self.expect("frame variable d_30", substrs=["1.23456", "E+30"]) + //% self.expect("frame variable d_50", substrs=["1.23456", "E+50"]) + //% self.expect("frame variable d_250", substrs=["1.23456", "E+250"]) + //% # Now change the setting to print all the zeroes. + //% # Note that changing this setting should invalidate the data visualizer + //% # cache so that the new setting is used in the following calls. + //% self.runCmd("settings set target.max-zero-padding-in-float-format 9999") + //% self.expect("frame variable f_neg3", substrs=["0.00123456"]) + //% self.expect("frame variable f_neg4", substrs=["0.000123456"]) + //% self.expect("frame variable f_neg5", substrs=["0.0000123456"]) + //% self.expect("frame variable f_neg6", substrs=["0.00000123456"]) + //% self.expect("frame variable f_neg7", substrs=["0.000000123456"]) + //% self.expect("frame variable f_neg8", substrs=["0.0000000123456"]) + //% self.expect("frame variable f_neg20", substrs=["0.0000000000000000000123456"]) + //% self.expect("frame variable f_neg30", substrs=["0.00000000000000000000000000000123456"]) + //% self.expect("frame variable f_3", substrs=["1234.56"]) + //% self.expect("frame variable f_4", substrs=["12345.6"]) + //% self.expect("frame variable f_5", substrs=["123456"]) + //% self.expect("frame variable f_6", substrs=["1234567"]) + //% self.expect("frame variable f_7", substrs=["1234567"]) + //% self.expect("frame variable f_8", substrs=["1234567"]) + //% self.expect("frame variable f_20", substrs=["E+20"]) + //% self.expect("frame variable f_30", substrs=["E+30"]) + //% self.expect("frame variable d_neg3", substrs=["0.00123456"]) + //% self.expect("frame variable d_neg4", substrs=["0.000123456"]) + //% self.expect("frame variable d_neg5", substrs=["0.0000123456"]) + //% self.expect("frame variable d_neg6", substrs=["0.00000123456"]) + //% self.expect("frame variable d_neg7", substrs=["0.000000123456"]) + //% self.expect("frame variable d_neg8", substrs=["0.0000000123456"]) + //% self.expect("frame variable d_neg20", substrs=["0.0000000000000000000123456"]) + //% self.expect("frame variable d_neg30", substrs=["0.000000000000000000000000000001234567"]) + //% self.expect("frame variable d_neg50", substrs=["0.0000000000000000000000000000000000000000000000000123456"]) + //% self.expect("frame variable d_neg250", substrs=["0.000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000123456"]) + //% self.expect("frame variable d_3", substrs=["1234.56"]) + //% self.expect("frame variable d_4", substrs=["12345.6"]) + //% self.expect("frame variable d_5", substrs=["123456"]) + //% self.expect("frame variable d_6", substrs=["1234567"]) + //% self.expect("frame variable d_7", substrs=["1234567"]) + //% self.expect("frame variable d_8", substrs=["1234567"]) + //% # Positive numbers are not affected by this setting. + //% self.expect("frame variable d_20", substrs=["1.23456", "E+20"]) + //% self.expect("frame variable d_30", substrs=["1.23456", "E+30"]) + //% self.expect("frame variable d_50", substrs=["1.23456", "E+50"]) + //% self.expect("frame variable d_250", substrs=["1.23456", "E+250"]) + return 0; +} Index: lldb/source/Core/Debugger.cpp =================================================================== --- lldb/source/Core/Debugger.cpp +++ lldb/source/Core/Debugger.cpp @@ -257,7 +257,14 @@ llvm::StringRef value) { bool is_load_script = (property_path == "target.load-script-from-symbol-file"); - bool is_escape_non_printables = (property_path == "escape-non-printables"); + // These properties might change how we visualize data. + bool invalidate_data_vis = (property_path == "escape-non-printables"); + invalidate_data_vis |= + (property_path == "target.max-zero-padding-in-float-format"); + if (invalidate_data_vis) { + DataVisualization::ForceUpdate(); + } + TargetSP target_sp; LoadScriptFromSymFile load_script_old_value; if (is_load_script && exe_ctx->GetTargetSP()) { @@ -300,8 +307,6 @@ } } } - } else if (is_escape_non_printables) { - DataVisualization::ForceUpdate(); } } return error; Index: lldb/source/Core/DumpDataExtractor.cpp =================================================================== --- lldb/source/Core/DumpDataExtractor.cpp +++ lldb/source/Core/DumpDataExtractor.cpp @@ -563,7 +563,8 @@ llvm::SmallVector sv; // Show full precision when printing float values const unsigned format_precision = 0; - const unsigned format_max_padding = 100; + const unsigned format_max_padding = + target_sp->GetMaxZeroPaddingInFloatFormat(); size_t item_bit_size = item_byte_size * 8; if (item_bit_size == ast->getTypeSize(ast->FloatTy)) { Index: lldb/source/Target/Target.cpp =================================================================== --- lldb/source/Target/Target.cpp +++ lldb/source/Target/Target.cpp @@ -3789,6 +3789,12 @@ nullptr, idx, g_target_properties[idx].default_uint_value != 0); } +uint32_t TargetProperties::GetMaxZeroPaddingInFloatFormat() const { + const uint32_t idx = ePropertyMaxZeroPaddingInFloatFormat; + return m_collection_sp->GetPropertyAtIndexAsUInt64( + nullptr, idx, g_target_properties[idx].default_uint_value); +} + uint32_t TargetProperties::GetMaximumNumberOfChildrenToDisplay() const { const uint32_t idx = ePropertyMaxChildrenCount; return m_collection_sp->GetPropertyAtIndexAsSInt64( Index: lldb/source/Target/TargetProperties.td =================================================================== --- lldb/source/Target/TargetProperties.td +++ lldb/source/Target/TargetProperties.td @@ -60,6 +60,9 @@ def SaveObjects: Property<"save-jit-objects", "Boolean">, DefaultFalse, Desc<"Save intermediate object files generated by the LLVM JIT">; + def MaxZeroPaddingInFloatFormat: Property<"max-zero-padding-in-float-format", "UInt64">, + DefaultUnsignedValue<6>, + Desc<"The maximum number of zeroes to insert when displaying a very small float before falling back to scientific notation.">; def MaxChildrenCount: Property<"max-children-count", "SInt64">, DefaultUnsignedValue<256>, Desc<"Maximum number of children to expand in any level of depth.">;