[Lldb-commits] [lldb] r370880 - [lldb] Limit the amount of zeroes we use for padding when printing small floats

Raphael Isemann via lldb-commits lldb-commits at lists.llvm.org
Wed Sep 4 04:41:23 PDT 2019


Author: teemperor
Date: Wed Sep  4 04:41:23 2019
New Revision: 370880

URL: http://llvm.org/viewvc/llvm-project?rev=370880&view=rev
Log:
[lldb] Limit the amount of zeroes we use for padding when printing small floats

Summary:
We got a radar that printing small floats is not very user-friendly in LLDB as we print them with up to
100 leading zeroes before starting to use scientific notation. This patch changes this by already using
scientific notation when we hit 6 padding zeroes by default and moves this value into a target setting
so that users can just set this number back to 100 if they for some reason preferred the old behaviour.

This new setting is influencing how we format data, so that's why we have to reset the data visualisation
cache when it is changed.

Note that we have always been using scientific notation for large numbers because it seems that
the LLVM implementation doesn't support printing out the padding zeroes for them. I would have fixed
that if it was trivial, but looking at the LLVM implementation for this it seems that this is not as trivial
as it sounds. I would say we look into this if we ever get a bug report about someone wanting to have
a large amount of trailing zeroes in their numbers instead of using scientific notation.

Fixes rdar://39744137

Reviewers: #lldb, clayborg

Reviewed By: clayborg

Subscribers: JDevlieghere, lldb-commits

Tags: #lldb

Differential Revision: https://reviews.llvm.org/D67001

Added:
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/Makefile
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py
    lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/main.c
Modified:
    lldb/trunk/include/lldb/Target/Target.h
    lldb/trunk/source/Core/Debugger.cpp
    lldb/trunk/source/Core/DumpDataExtractor.cpp
    lldb/trunk/source/Target/Target.cpp
    lldb/trunk/source/Target/TargetProperties.td

Modified: lldb/trunk/include/lldb/Target/Target.h
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/include/lldb/Target/Target.h?rev=370880&r1=370879&r2=370880&view=diff
==============================================================================
--- lldb/trunk/include/lldb/Target/Target.h (original)
+++ lldb/trunk/include/lldb/Target/Target.h Wed Sep  4 04:41:23 2019
@@ -139,6 +139,8 @@ public:
 
   bool GetEnableSyntheticValue() const;
 
+  uint32_t GetMaxZeroPaddingInFloatFormat() const;
+
   uint32_t GetMaximumNumberOfChildrenToDisplay() const;
 
   uint32_t GetMaximumSizeOfStringSummary() const;

Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/Makefile
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/Makefile?rev=370880&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/Makefile (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/Makefile Wed Sep  4 04:41:23 2019
@@ -0,0 +1,3 @@
+LEVEL = ../../make
+C_SOURCES := main.c
+include $(LEVEL)/Makefile.rules

Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py?rev=370880&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/TestFloatDisplay.py Wed Sep  4 04:41:23 2019
@@ -0,0 +1,5 @@
+from lldbsuite.test import lldbinline
+from lldbsuite.test import decorators
+
+lldbinline.MakeInlineTest(
+    __file__, globals(), [])

Added: lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/main.c
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/main.c?rev=370880&view=auto
==============================================================================
--- lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/main.c (added)
+++ lldb/trunk/packages/Python/lldbsuite/test/functionalities/float-display/main.c Wed Sep  4 04:41:23 2019
@@ -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;
+}

Modified: lldb/trunk/source/Core/Debugger.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/Debugger.cpp?rev=370880&r1=370879&r2=370880&view=diff
==============================================================================
--- lldb/trunk/source/Core/Debugger.cpp (original)
+++ lldb/trunk/source/Core/Debugger.cpp Wed Sep  4 04:41:23 2019
@@ -257,7 +257,14 @@ Status Debugger::SetPropertyValue(const
                                   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 @@ Status Debugger::SetPropertyValue(const
           }
         }
       }
-    } else if (is_escape_non_printables) {
-      DataVisualization::ForceUpdate();
     }
   }
   return error;

Modified: lldb/trunk/source/Core/DumpDataExtractor.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Core/DumpDataExtractor.cpp?rev=370880&r1=370879&r2=370880&view=diff
==============================================================================
--- lldb/trunk/source/Core/DumpDataExtractor.cpp (original)
+++ lldb/trunk/source/Core/DumpDataExtractor.cpp Wed Sep  4 04:41:23 2019
@@ -563,7 +563,8 @@ lldb::offset_t lldb_private::DumpDataExt
             llvm::SmallVector<char, 256> 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)) {

Modified: lldb/trunk/source/Target/Target.cpp
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/Target.cpp?rev=370880&r1=370879&r2=370880&view=diff
==============================================================================
--- lldb/trunk/source/Target/Target.cpp (original)
+++ lldb/trunk/source/Target/Target.cpp Wed Sep  4 04:41:23 2019
@@ -3789,6 +3789,12 @@ bool TargetProperties::GetEnableSyntheti
       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(

Modified: lldb/trunk/source/Target/TargetProperties.td
URL: http://llvm.org/viewvc/llvm-project/lldb/trunk/source/Target/TargetProperties.td?rev=370880&r1=370879&r2=370880&view=diff
==============================================================================
--- lldb/trunk/source/Target/TargetProperties.td (original)
+++ lldb/trunk/source/Target/TargetProperties.td Wed Sep  4 04:41:23 2019
@@ -60,6 +60,9 @@ let Definition = "target" in {
   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.">;




More information about the lldb-commits mailing list