[PATCH] gdb:Add new 'print binary-groups' feature

Enze Li lienze2010@hotmail.com
Sun Nov 29 13:00:05 GMT 2020


Make an introduction of a new print setting that can be set by
'set print binary-groups [on|off]'.  The default value is OFF, and
it would be changed by users manually.

And of course, 'show print binary-groups' is also included in the
patch.

The new feature could display binary values in groups, and each group
has 4 bits.

Here's a GDB session before this patch is applied.
  (gdb) print var_a
  $1 = 371
  (gdb) print/t var_a
  $2 = 101110011

With this patch applied, we have a new print setting to use.
  (gdb) print var_a
  $1 = 371
  (gdb) print/t var_a
  $2 = 101110011
  (gdb) set print binary-groups on
  (gdb) print/t var_a
  $3 = 1 0111 0011

Tested on x86_64-linux(little-endian) and mips-linux(big-endian).

gdb/ChangeLog:

	* NEWS: Metion new commands.
	* printcmd.c (print_scalar_formatted): Add new parameter and pass
	it to print_binary_chars.
	* valprint.c (struct value_print_options) <binary_group_print>:
	New member.
	(show_binary_groups): New function.
	(print_binary_chars): Add new parameter `value_print_option *`
	and use it.
	* valprint.h (struct value_print_options):
	(print_binary_chars): Add new parameter to declaration.

gdb/doc/ChangeLog:

	* gdb.texinfo: Document 'set/show print binary-groups'.

gdb/testsuite/ChangeLog:

	* gdb.base/printcmds.exp: Update to use new
	'print binary-groups' command.
---
 gdb/ChangeLog                        | 13 +++++++++++++
 gdb/NEWS                             |  5 +++++
 gdb/doc/ChangeLog                    |  5 +++++
 gdb/doc/gdb.texinfo                  | 26 ++++++++++++++++++++++++++
 gdb/printcmd.c                       |  2 +-
 gdb/testsuite/ChangeLog              |  5 +++++
 gdb/testsuite/gdb.base/printcmds.exp | 14 ++++++++++++++
 gdb/valprint.c                       | 26 +++++++++++++++++++++++++-
 gdb/valprint.h                       |  6 +++++-
 9 files changed, 99 insertions(+), 3 deletions(-)

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index acffde..2e19fd 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,16 @@
+2020-11-29  Enze Li  <lienze2010@hotmail.com>
+
+	* NEWS: Metion new commands.
+	* printcmd.c (print_scalar_formatted): Add new parameter and pass
+	it to print_binary_chars.
+	* valprint.c (struct value_print_options) <binary_group_print>:
+	New member.
+	(show_binary_groups): New function.
+	(print_binary_chars): Add new parameter `value_print_option *`
+	and use it.
+	* valprint.h (struct value_print_options):
+	(print_binary_chars): Add new parameter to declaration.
+
 2020-11-28  Alex Richardson  <Alexander.Richardson@cl.cam.ac.uk>
 
 	* acincludde.m4 (GDB_AC_CHECK_BFD): Include string.h in the test
diff --git a/gdb/NEWS b/gdb/NEWS
index d75992..324fce 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -39,6 +39,11 @@ set debug event-loop
 show debug event-loop
   Control the display of debug output about GDB's event loop.
 
+set print binary-groups [on|off]
+show print binary-groups
+  This controls whether the 'p/t' command will display the binary
+  value in groups, each group has 4 bits.  The default is 'off'.
+
 * Changed commands
 
 break [PROBE_MODIFIER] [LOCATION] [thread THREADNUM]
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 69b079..4c41cb 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2020-11-29  Enze Li  <lienze2010@hotmail.com>
+
+	* gdb.texinfo (Print Settings): Document
+	'set/show print binary-groups'.
+
 2020-11-19  Andrew Burgess  <andrew.burgess@embecosm.com>
 
 	* gdb.texinfo (Debugging Output): Document 'set/show debug
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 01dcac..b75129 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9929,6 +9929,10 @@ Related setting: @ref{set print array}.
 Set printing of array indexes.
 Related setting: @ref{set print array-indexes}.
 
+@item -binary-groups [@code{on}|@code{off}]
+Set whether to print binary values in groups.
+Related setting: @ref{set print binary-groups}.
+
 @item -elements @var{number-of-elements}|@code{unlimited}
 Set limit on string chars or array elements to print.  The value
 @code{unlimited} causes there to be no limit.  Related setting:
@@ -11213,6 +11217,28 @@ Stop printing element indexes when displaying arrays.
 Show whether the index of each element is printed when displaying
 arrays.
 
+@anchor{set print binary-groups}
+@item set print binary-groups
+@itemx set print binary-groups on
+Print binary values in groups when using the print command of
+@value{GDBN} with the option '/t'.  For example, this is what it
+looks like with @code{set print binary-groups on}:
+
+@smallexample
+@group
+(@value{GDBP}) p val_flags
+$1 = 371
+(@value{GDBP}) p/t val_flags
+$2 = 1 0111 0011
+@end group
+@end smallexample
+
+@item set print binary-groups off
+Stop printing binary values in groups.  The default is @code{off}.
+
+@item show print binary-groups
+Show whether to print binary values in groups.
+
 @anchor{set print elements}
 @item set print elements @var{number-of-elements}
 @itemx set print elements unlimited
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index e95b880..402c39 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -475,7 +475,7 @@ print_scalar_formatted (const gdb_byte *valaddr, struct type *type,
       break;
 
     case 't':
-      print_binary_chars (stream, valaddr, len, byte_order, size > 0);
+      print_binary_chars (stream, valaddr, len, byte_order, size > 0, options);
       break;
     case 'x':
       print_hex_chars (stream, valaddr, len, byte_order, size > 0);
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index 5f62e4..ae1ddb 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2020-11-29  Enze Li  <lienze2010@hotmail.com>
+
+	* gdb.base/printcmds.exp: Update to use new
+	'print binary-groups' command.
+
 2020-11-24  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>
 
 	* gdb.base/condbreak-multi-context.exp: Do not hard-code location
diff --git a/gdb/testsuite/gdb.base/printcmds.exp b/gdb/testsuite/gdb.base/printcmds.exp
index 08a096..4b62bf 100644
--- a/gdb/testsuite/gdb.base/printcmds.exp
+++ b/gdb/testsuite/gdb.base/printcmds.exp
@@ -690,6 +690,19 @@ proc test_print_char_arrays {} {
     gdb_test_no_output "set print address off" "address off char arrays"
 }
 
+proc test_print_binary_groups {} {
+    gdb_test_no_output "set print binary-groups on"
+    gdb_test "p/t 0"		" = 0"
+    gdb_test "p/t 0x0"		" = 0"
+    gdb_test "p/t 0x30"		" = 11 0000"
+    gdb_test "p/t 0xff"		" = 1111 1111"
+    gdb_test "p/t 0x0f"		" = 1111"
+    gdb_test "p/t 0x01"		" = 1"
+    gdb_test "p/t 0xf0f"	" = 1111 0000 1111"
+    gdb_test "p/t 0x70f"	" = 111 0000 1111"
+    gdb_test_no_output "set print binary-groups off"
+}
+
 proc test_print_string_constants {} {
     global gdb_prompt
 
@@ -1068,6 +1081,7 @@ test_print_int_arrays
 test_print_typedef_arrays
 test_artificial_arrays
 test_print_char_arrays
+test_print_binary_groups
 # We used to do the runto main here.
 test_print_string_constants
 test_print_array_constants
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 50278a..6941e97 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -105,6 +105,7 @@ struct value_print_options user_print_options =
   0,				/* vtblprint */
   1,				/* unionprint */
   1,				/* addressprint */
+  0,				/* binary_group_print */
   0,				/* objectprint */
   PRINT_MAX_DEFAULT,		/* print_max */
   10,				/* repeat_count_threshold */
@@ -245,6 +246,15 @@ show_unionprint (struct ui_file *file, int from_tty,
 		    value);
 }
 
+static void
+show_binary_groups (struct ui_file *file, int from_tty,
+		       struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file,
+		    _("Printing binary values in groups is %s.\n"),
+		    value);
+}
+
 /* If nonzero, causes machine addresses to be printed in certain contexts.  */
 
 static void
@@ -1353,7 +1363,8 @@ print_floating (const gdb_byte *valaddr, struct type *type,
 
 void
 print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
-		    unsigned len, enum bfd_endian byte_order, bool zero_pad)
+		    unsigned len, enum bfd_endian byte_order, bool zero_pad,
+		    const struct value_print_options *options)
 {
   const gdb_byte *p;
   unsigned int i;
@@ -1376,6 +1387,8 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
 
 	  for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++)
 	    {
+	      if (options->binary_group_print && seen_a_one && i%4 == 0)
+		fputc_filtered (' ', stream);
 	      if (*p & (mask >> i))
 		b = '1';
 	      else
@@ -1396,6 +1409,8 @@ print_binary_chars (struct ui_file *stream, const gdb_byte *valaddr,
 	{
 	  for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++)
 	    {
+	      if (options->binary_group_print && seen_a_one && i%4 == 0)
+		fputc_filtered (' ', stream);
 	      if (*p & (mask >> i))
 		b = '1';
 	      else
@@ -3040,6 +3055,15 @@ static const gdb::option::option_def value_print_option_defs[] = {
     NULL, /* help_doc */
   },
 
+  boolean_option_def {
+    "binary-groups",
+    [] (value_print_options *opt) { return &opt->binary_group_print; },
+    show_binary_groups, /* show_cmd_cb */
+    N_("Set whether to print binary values in groups."),
+    N_("Show whether to print binary values in groups."),
+    NULL, /* help_doc */
+  },
+
   uinteger_option_def {
     "elements",
     [] (value_print_options *opt) { return &opt->print_max; },
diff --git a/gdb/valprint.h b/gdb/valprint.h
index ef9ebf..4ed081 100644
--- a/gdb/valprint.h
+++ b/gdb/valprint.h
@@ -44,6 +44,9 @@ struct value_print_options
   /* Controls printing of addresses.  */
   bool addressprint;
 
+  /* Controls printing of binary by group.  */
+  bool binary_group_print;
+
   /* Controls looking up an object's derived type using what we find
      in its vtables.  */
   bool objectprint;
@@ -146,7 +149,8 @@ extern void value_print_scalar_formatted
    int size, struct ui_file *stream);
 
 extern void print_binary_chars (struct ui_file *, const gdb_byte *,
-				unsigned int, enum bfd_endian, bool);
+				unsigned int, enum bfd_endian, bool,
+				const struct value_print_options *options);
 
 extern void print_octal_chars (struct ui_file *, const gdb_byte *,
 			       unsigned int, enum bfd_endian);
-- 
2.27.0



More information about the Gdb-patches mailing list