From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from AUS01-SY4-obe.outbound.protection.outlook.com (mail-sy4aus01olkn2173.outbound.protection.outlook.com [40.92.62.173]) by sourceware.org (Postfix) with ESMTPS id C44603857C53 for ; Wed, 27 Oct 2021 14:07:13 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org C44603857C53 ARC-Seal: i=1; a=rsa-sha256; s=arcselector9901; d=microsoft.com; cv=none; b=mOKMNwQlu/vsF9Z2iLPzJyybksfgFjW961s4E0PtmWRm8zsk2ehoQb1QYpMYTMNnumD2gGzF0lBOBiQaJF80xIIGdFygJWWox3nfsBpeYHSQi4pWnkWC0OwCuSHYoVKnkNyGqf4o4drDe5Xtj9dddiH5OpxICRfX1eh83Kij/jYZm0SoY+LNfA6MA2+XMHjce1Hcrcab7wNqUlbO34ibAINiHwws42146TVzovrzslYOoCbxnzZ13AIk4Iu/QDVcKgElHBdE+tX0qHjJr7Xemxepl4J/RY65jYJKUIDr33wyCQNn29v0rawf6E7ZlsfIV5TS7oWt9EFIajzTvbw+pw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=microsoft.com; s=arcselector9901; h=From:Date:Subject:Message-ID:Content-Type:MIME-Version:X-MS-Exchange-AntiSpam-MessageData-ChunkCount:X-MS-Exchange-AntiSpam-MessageData-0:X-MS-Exchange-AntiSpam-MessageData-1; bh=1+kpKUg75rQHXc4G038q1pmyhXvCSpUVpWgRSdkGJTo=; b=PHAD3hAYTbngoDctSF7nRK5UEWnSNevDdCi0tqT5h9dJM5H/yptkl2dfN62w9g0WYGiqjQHiwUFGzW4G64bIkPQCWpTvLuf0iF49skZzL4VtrreF5qUHwfcqsyR1OC+IKfNUC9ycdbAi2CaaxiOFoZo6TNr1APDUZ6jFJGX/X0WOuZ8n+EjiXtiHd0NL6rKQPiBn66M/Zi/oGCBk5VJuOA9eyRFkOf2cTWzYmOv/XJvbWQ121/Rm7cnX2WU0ypoF+BD4HlpoBgBxH1KVLJCEVC3a2IP3e2YzTt4MgvtFPLrG/QnqqaL61GY7KB8A+HGd+WVMnKgZjrlIKRKx0elqVg== ARC-Authentication-Results: i=1; mx.microsoft.com 1; spf=none; dmarc=none; dkim=none; arc=none Received: from SYBP282MB0300.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:6c::11) by SY4P282MB2670.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:131::11) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4628.18; Wed, 27 Oct 2021 14:07:08 +0000 Received: from SYBP282MB0300.AUSP282.PROD.OUTLOOK.COM ([fe80::c946:aec2:54cd:631a]) by SYBP282MB0300.AUSP282.PROD.OUTLOOK.COM ([fe80::c946:aec2:54cd:631a%3]) with mapi id 15.20.4628.020; Wed, 27 Oct 2021 14:07:08 +0000 Message-ID: Subject: [PING][PATCH v5] gdb: Add new 'print nibbles' feature From: Enze Li To: gdb-patches@sourceware.org Date: Wed, 27 Oct 2021 22:07:03 +0800 In-Reply-To: References: Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.42.0 Content-Transfer-Encoding: 8bit X-TMN: [z1Zp3/guD/DlX1hd0ctnzSgj2aElBbfP] X-ClientProxiedBy: HK2PR04CA0070.apcprd04.prod.outlook.com (2603:1096:202:15::14) To SYBP282MB0300.AUSP282.PROD.OUTLOOK.COM (2603:10c6:10:6c::11) X-Microsoft-Original-Message-ID: MIME-Version: 1.0 X-MS-Exchange-MessageSentRepresentingType: 1 Received: from [192.168.3.105] (61.48.214.232) by HK2PR04CA0070.apcprd04.prod.outlook.com (2603:1096:202:15::14) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.20.4649.14 via Frontend Transport; Wed, 27 Oct 2021 14:07:07 +0000 X-MS-PublicTrafficType: Email X-MS-Office365-Filtering-Correlation-Id: 2afe305e-dd29-4830-b640-08d999531006 X-MS-TrafficTypeDiagnostic: SY4P282MB2670: X-Microsoft-Antispam: BCL:0; X-Microsoft-Antispam-Message-Info: ZdD34REKuVYLe6B9B8Fsia6GDDA1jlo5LlQLfixhu5tgJGPvBeZSmwYIOCx/+YWmneCDHbaiQqsaFFGiWQn3pO6nCJCDjIuG6BZFMfQUBe/YiaObTv/4vavugjaEh2uwvD4J7nQ3WL9l4C4/pbQIznt2jPmrZzEdH3PTPNwAIo6Mshn4Yi3fodkC2IBU27slC7oJt/qekvZjrSvdUKJO7hcDni47QuKTfYEEBtGX/eeeA1RpyTtom2nKeGLZlIUQ5BDb9BHlxQhUbqsq9COlEOpA5uzROIG6WqRz1gf0MSXeS3GIpH8iFad4BtneBQcufe5Ynedp+2n3d+snZY3wee97TNKcMuG247iA+gHU2loNexjwdILSquifYULMDjUM5F6LotpM7DcFQLnRBsg6ov8eWO+A6SbcAlyOaqUPmpOYqNyLwZ97XiBUQpazrYEKaqwnHIEhpGV7pqDHLLgmZPfreZgxq599HBA0bEXM0vlsYCQdyoGXq0bWNpBOXURaCRJvDx+o573Xl54gue/jrgu6Dte4UwaepWiSVr257oqjhSYZChPeScL+Iax9/HJAtzIaJypQm4IRq468I4TiTg== X-MS-Exchange-AntiSpam-MessageData-ChunkCount: 1 X-MS-Exchange-AntiSpam-MessageData-0: U7v9ZfJRkjQPjP6bgbKdL0vQpkxzQVLyfnuMK959jwC+CVt1MtcjGod9hmfZOPYhe+7Sf9JGoFCa3uYb821BkquWopkrm4avZagQWgZCONuqEfY+RatMEW9ge2xj0pHuWYHQr4LqL3WG4dCqTClvz/2UKx7jfGhqy3bIVvHk2BRr63HX8Jw/dQYpnWub6Jx92LXUsVL2DJrVIh5YFxMiBuVbe4ZwAWzmZGQC8az5a2XtzA/BiRL43WKqXJoyWXh4ESCnAT3UgPyvK6fHT7XHlSPh7SFfrvKAXV04lgkmwgyRob/snBWRZRKPTJD1QLKrF7dLWqyIEtBK+ojctSUz2TMSiYVsEuxfG3OYXIlAdEym66cJ2sd6FWxCdw0lBQbgOED4X4A8y2fmic1EZP+zPsjis+E/P6lcEBF04Pmnqo4kX/bESVH3854W/ODT5CchjhRsyXsWw0oAgBodfBAikEg/edu0VkHOXGQn+Xde7mjSTqJnd5HE5n3Bl5BcW05zTR60SQrujXXH3sdEpLOY9dTktgdDnGkraPrFMO86W+zG3YsoSJbtvH43g7i3wy4bAPFjIG/BwRqmnKXZuNcmBghK0Aot4caWiycsMpWlEPhdWoQjO3FzAjN+NE4OcjIydFXkQ4u54dBGLyOSqEHz6xW1qL61gssXkJxhFGPX1pbQeDBHesVf8JC/u9BC/rD+BKDjFkvUSQ8sXd4wNK0xwg== X-OriginatorOrg: sct-15-20-3174-20-msonline-outlook-8dac2.templateTenant X-MS-Exchange-CrossTenant-Network-Message-Id: 2afe305e-dd29-4830-b640-08d999531006 X-MS-Exchange-CrossTenant-AuthSource: SYBP282MB0300.AUSP282.PROD.OUTLOOK.COM X-MS-Exchange-CrossTenant-AuthAs: Internal X-MS-Exchange-CrossTenant-OriginalArrivalTime: 27 Oct 2021 14:07:08.3174 (UTC) X-MS-Exchange-CrossTenant-FromEntityHeader: Hosted X-MS-Exchange-CrossTenant-Id: 84df9e7f-e9f6-40af-b435-aaaaaaaaaaaa X-MS-Exchange-CrossTenant-RMS-PersistedConsumerOrg: 00000000-0000-0000-0000-000000000000 X-MS-Exchange-Transport-CrossTenantHeadersStamped: SY4P282MB2670 X-Spam-Status: No, score=-9.1 required=5.0 tests=BAYES_00, BODY_8BITS, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_ENVFROM_END_DIGIT, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_PASS, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.4 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 27 Oct 2021 14:07:18 -0000 Hi all, Kindly PING for the patch. :) Please let me know if the patch is acceptable for the trunk. Cheers! Enze On Thu, 2021-10-07 at 22:44 +0800, Enze Li via Gdb-patches wrote: > Make an introduction of a new print setting that can be set by 'set > print nibbles [on|off]'.  The default value is OFF, and it would be > changed by users manually. > > Of course, 'show print nibbles' is also included in the patch. > > The new feature could display binary values in groups, and each group > has four bits. > > The motivation behind this work is to enable users to more quickly > distinguish the position of any bit on the binary value. > > Here's a GDB session before this patch is applied. >   (gdb) print var_a >   $1 = 1230 >   (gdb) print/t var_a >   $2 = 10011001110 > > With this patch applied, we have a new print setting to use. >   (gdb) print var_a >   $1 = 1230 >   (gdb) print/t var_a >   $2 = 10011001110 >   (gdb) set print nibbles on >   (gdb) print/t a >   $3 = 100 1100 1110 > > Tested on x86_64-linux(little-endian) and mips-linux(big-endian). > > gdb/ChangeLog: > 2021-09-03  Enze Li  > >         * NEWS: Metion new command. >         * printcmd.c (print_scalar_formatted): Add new parameter and > pass >         it to print_binary_chars. >         * valprint.c (struct value_print_options) : >         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: > 2021-09-03  Enze Li  > >         * gdb.texinfo (Print Settings): Document 'print nibbles'. > > gdb/testsuite/ChangeLog: > 2021-09-03  Enze Li  > >         * gdb.base/printcmds.exp: Update to use new >         'print nibbles' command. >         * gdb.base/options.exp: Add -nibbles in the print completion > list. > --- >  gdb/NEWS                             |  5 ++++ >  gdb/doc/gdb.texinfo                  | 35 ++++++++++++++++++++++++-- > -- >  gdb/printcmd.c                       |  2 +- >  gdb/testsuite/gdb.base/options.exp   |  1 + >  gdb/testsuite/gdb.base/printcmds.exp | 14 +++++++++++ >  gdb/valprint.c                       | 28 +++++++++++++++++++++- >  gdb/valprint.h                       |  6 ++++- >  7 files changed, 84 insertions(+), 7 deletions(-) > > diff --git a/gdb/NEWS b/gdb/NEWS > index 7ca1f842cb1..ef1127da27b 100644 > --- a/gdb/NEWS > +++ b/gdb/NEWS > @@ -170,6 +170,11 @@ set debug event-loop >  show debug event-loop >    Control the display of debug output about GDB's event loop. >   > +set print nibbles [on|off] > +show print nibbles > +  This controls whether the 'print/t' command will display binary > values > +  in groups of four bits, known as "nibbles".  The default is 'off'. > + >  set print memory-tag-violations >  show print memory-tag-violations >    Control whether to display additional information about memory tag > violations > diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo > index a6f207a41a7..d59fbe13457 100644 > --- a/gdb/doc/gdb.texinfo > +++ b/gdb/doc/gdb.texinfo > @@ -2141,10 +2141,10 @@ on @code{-} after the command name.  For > example: >   >  @smallexample >  (@value{GDBP}) print -@key{TAB}@key{TAB} > --address         -max-depth       -raw-values      -union > --array           -null-stop       -repeats         -vtbl > --array-indexes   -object          -static-members > --elements        -pretty          -symbol > +-address         -max-depth       -pretty          -symbol > +-array           -nibbles         -raw-values      -union > +-array-indexes   -null-stop       -repeats         -vtbl > +-elements        -object          -static-members >  @end smallexample >   >  Completion will in some cases guide you with a suggestion of what > kind > @@ -10003,6 +10003,10 @@ Set limit on string chars or array elements > to print.  The value >  Set the threshold after which nested structures are replaced with >  ellipsis.  Related setting: @ref{set print max-depth}. >   > +@item -nibbles [@code{on}|@code{off}] > +Set whether to print binary values in groups of four bits, known > +as ``nibbles''. @xref{set print nibbles}. > + >  @item -null-stop [@code{on}|@code{off}] >  Set printing of char arrays to stop at first null char.  Related >  setting: @ref{set print null-stop}. > @@ -11361,6 +11365,29 @@ Stop printing element indexes when > displaying arrays. >  Show whether the index of each element is printed when displaying >  arrays. >   > +@anchor{set print nibbles} > +@item set print nibbles > +@itemx set print nibbles on > +@cindex print binary values in groups of four bits > +Print binary values in groups of four bits, known as @dfn{nibbles}, > +when using the print command of @value{GDBN} with the option > @samp{/t}. > +For example, this is what it looks like with @code{set print nibbles > on}: > + > +@smallexample > +@group > +(@value{GDBP}) print val_flags > +$1 = 1230 > +(@value{GDBP}) print/t val_flags > +$2 = 100 1100 1110 > +@end group > +@end smallexample > + > +@item set print nibbles off > +Don't printing binary values in groups.  This is the default. > + > +@item show print nibbles > +Show whether to print binary values in groups of four bits. > + >  @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 2fe3f4b0cc5..62713f1a91f 100644 > --- a/gdb/printcmd.c > +++ b/gdb/printcmd.c > @@ -490,7 +490,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/gdb.base/options.exp > b/gdb/testsuite/gdb.base/options.exp > index 94372aa9fc7..1a680a3baf4 100644 > --- a/gdb/testsuite/gdb.base/options.exp > +++ b/gdb/testsuite/gdb.base/options.exp > @@ -168,6 +168,7 @@ proc_with_prefix test-print {{prefix ""}} { >         "-elements" >         "-max-depth" >         "-memory-tag-violations" > +       "-nibbles" >         "-null-stop" >         "-object" >         "-pretty" > diff --git a/gdb/testsuite/gdb.base/printcmds.exp > b/gdb/testsuite/gdb.base/printcmds.exp > index b2f90aaff10..75abe79a70d 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_nibbles {} { > +    gdb_test_no_output "set print nibbles 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 nibbles off" > +} > + >  proc test_print_string_constants {} { >      global gdb_prompt >   > @@ -1067,6 +1080,7 @@ test_print_int_arrays >  test_print_typedef_arrays >  test_artificial_arrays >  test_print_char_arrays > +test_print_nibbles >  # 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 c6ea0d82e40..1e79cc73beb 100644 > --- a/gdb/valprint.c > +++ b/gdb/valprint.c > @@ -108,6 +108,7 @@ struct value_print_options user_print_options = >    0,                           /* vtblprint */ >    1,                           /* unionprint */ >    1,                           /* addressprint */ > +  false,                       /* nibblesprint */ >    0,                           /* objectprint */ >    PRINT_MAX_DEFAULT,           /* print_max */ >    10,                          /* repeat_count_threshold */ > @@ -260,6 +261,17 @@ show_unionprint (struct ui_file *file, int > from_tty, >                     value); >  } >   > +/* Controls the format of printing binary values.  */ > + > +static void > +show_nibbles (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 > @@ -1367,7 +1379,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; > @@ -1390,6 +1403,8 @@ print_binary_chars (struct ui_file *stream, > const gdb_byte *valaddr, >   >           for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++) >             { > +             if (options->nibblesprint && seen_a_one && i % 4 == 0) > +               fputc_filtered (' ', stream); >               if (*p & (mask >> i)) >                 b = '1'; >               else > @@ -1410,6 +1425,8 @@ print_binary_chars (struct ui_file *stream, > const gdb_byte *valaddr, >         { >           for (i = 0; i < (HOST_CHAR_BIT * sizeof (*p)); i++) >             { > +             if (options->nibblesprint && seen_a_one && i % 4 == 0) > +               fputc_filtered (' ', stream); >               if (*p & (mask >> i)) >                 b = '1'; >               else > @@ -3016,6 +3033,15 @@ static const gdb::option::option_def > value_print_option_defs[] = { >      NULL, /* help_doc */ >    }, >   > +  boolean_option_def { > +    "nibbles", > +    [] (value_print_options *opt) { return &opt->nibblesprint; }, > +    show_nibbles, /* show_cmd_cb */ > +    N_("Set whether to print binary values in groups of four > bits."), > +    N_("Show whether to print binary values in groups of four > bits."), > +    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 e1dae2cc8fc..bb19c41ab68 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 nibbles.  */ > +  bool nibblesprint; > + >    /* Controls looking up an object's derived type using what we find >       in its vtables.  */ >    bool objectprint; > @@ -149,7 +152,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);