Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Doug Evans <dje@google.com>
To: Eli Zaretskii <eliz@gnu.org>,
	gdb-patches <gdb-patches@sourceware.org>,
	palves@redhat.com
Subject: Re: [RFA, doc RFA] set print frame-arguments-raw on|off
Date: Wed, 17 Jul 2013 19:26:00 -0000	[thread overview]
Message-ID: <20966.61429.746380.387990@ruffy.mtv.corp.google.com> (raw)
In-Reply-To: <CADPb22T-FpXebU8pkvEHPsY=9E+0m8PzXwbCw2=Adbtoxm=DyQ@mail.gmail.com>

Here is a revised version of "set print frame-arguments-raw".
It renames the option to "set print raw frame-arguments" to allow for
other things that we might want to control raw printing of.

Regression tested on amd64-linux.

Ok to check in?

There's one thing I'm not sure of:
which one of gdbcmd.h vs cli/cli-cmds.h to use?
They each declare the set/show list globals.
gdbcmd.h has a comment saying it's deprecated.
However, it defines maintenance_{set,show}_cmdlist whereas cli-cmds.h
does not (which I agree with to the extent that if I were to try to clean
this area up I would make a few changes, e.g., better separation of gdb
and cli-as-module, but they're beyond the scope of this patch).


2013-07-17  Doug Evans  <dje@google.com>

	* NEWS: Mention "set print raw frame-arguments".
	* gdbcmd.h (setprintrawlist, showprintrawlist): Declare.
	* stack.c (print_raw_frame_arguments): New static global.
	(print_frame_arg): Set opts.raw from print_raw_frame_arguments.
	(_initialize_stack): New command "set/show print raw frame-arguments".
	* valprint.c (setprintrawlist, showprintrawlist): New globals.
	(set_print_raw, show_print_raw): New functions.
	(_initialize_valprint): New prefix command "set/show print raw".
	* valprint.h (value_print_options): Improve comments.

	doc/
	* gdb.texinfo (Print Settings): Document "print raw frame-arguments".

	testsuite/
	* gdb.python/py-frame-args.c: New file.
	* gdb.python/py-frame-args.py: New file.
	* gdb.python/py-frame-args.exp New file.

Index: NEWS
===================================================================
RCS file: /cvs/src/src/gdb/NEWS,v
retrieving revision 1.605
diff -u -p -r1.605 NEWS
--- NEWS	26 Jun 2013 08:17:26 -0000	1.605
+++ NEWS	17 Jul 2013 19:13:20 -0000
@@ -34,6 +34,11 @@ maint set|show per-command symtab
 
 * New options
 
+set print raw frame-arguments
+show print raw frame-arguments
+  Set/show whether to print frame arguments in raw mode,
+  disregarding any defined pretty-printers.
+
 set remote trace-status-packet
 show remote trace-status-packet
   Set/show the use of remote protocol qTStatus packet.
Index: gdbcmd.h
===================================================================
RCS file: /cvs/src/src/gdb/gdbcmd.h,v
retrieving revision 1.28
diff -u -p -r1.28 gdbcmd.h
--- gdbcmd.h	1 Jan 2013 06:32:44 -0000	1.28
+++ gdbcmd.h	17 Jul 2013 19:13:20 -0000
@@ -111,6 +111,10 @@ extern struct cmd_list_element *setprint
 
 extern struct cmd_list_element *showprintlist;
 
+extern struct cmd_list_element *setprintrawlist;
+
+extern struct cmd_list_element *showprintrawlist;
+
 extern struct cmd_list_element *setprinttypelist;
 
 extern struct cmd_list_element *showprinttypelist;
Index: stack.c
===================================================================
RCS file: /cvs/src/src/gdb/stack.c,v
retrieving revision 1.275
diff -u -p -r1.275 stack.c
--- stack.c	9 Jul 2013 16:57:09 -0000	1.275
+++ stack.c	17 Jul 2013 19:13:20 -0000
@@ -65,6 +66,9 @@ static const char *const print_frame_arg
   {"all", "scalars", "none", NULL};
 static const char *print_frame_arguments = "scalars";
 
+/* If non-zero, don't invoke pretty-printers for frame arguments.  */
+static int print_raw_frame_arguments;
+
 /* The possible choices of "set print entry-values", and the value
    of this setting.  */
 
@@ -277,6 +281,7 @@ print_frame_arg (const struct frame_arg 
 
 	      get_no_prettyformat_print_options (&opts);
 	      opts.deref_ref = 1;
+	      opts.raw = print_raw_frame_arguments;
 
 	      /* True in "summary" mode, false otherwise.  */
 	      opts.summary = !strcmp (print_frame_arguments, "scalars");
@@ -2640,6 +2645,15 @@ Usage: func <name>\n"));
 			_("Show printing of non-scalar frame arguments"),
 			NULL, NULL, NULL, &setprintlist, &showprintlist);
 
+  add_setshow_boolean_cmd ("frame-arguments", no_class,
+			   &print_raw_frame_arguments, _("\
+Set whether to print frame arguments in raw form."), _("\
+Show whether to print frame arguments in raw form."), _("\
+If set, frame arguments are printed in raw form, bypassing any\n\
+pretty-printers for that value."),
+			   NULL, NULL,
+			   &setprintrawlist, &showprintrawlist);
+
   add_setshow_auto_boolean_cmd ("disassemble-next-line", class_stack,
 			        &disassemble_next_line, _("\
 Set whether to disassemble next source line or insn when execution stops."),
Index: valprint.c
===================================================================
RCS file: /cvs/src/src/gdb/valprint.c,v
retrieving revision 1.137
diff -u -p -r1.137 valprint.c
--- valprint.c	9 Jul 2013 16:57:09 -0000	1.137
+++ valprint.c	17 Jul 2013 19:13:20 -0000
@@ -76,6 +77,9 @@ struct converted_character
 typedef struct converted_character converted_character_d;
 DEF_VEC_O (converted_character_d);
 
+/* Command lists for set/show print raw.  */
+struct cmd_list_element *setprintrawlist;
+struct cmd_list_element *showprintrawlist;
 
 /* Prototypes for local functions */
 
@@ -2686,6 +2690,21 @@ show_print (char *args, int from_tty)
 {
   cmd_show_list (showprintlist, from_tty, "");
 }
+
+static void
+set_print_raw (char *arg, int from_tty)
+{
+  printf_unfiltered (
+     "\"set print raw\" must be followed by the name of a \"print raw\" subcommand.\n");
+  help_list (setprintrawlist, "set print raw ", -1, gdb_stdout);
+}
+
+static void
+show_print_raw (char *args, int from_tty)
+{
+  cmd_show_list (showprintrawlist, from_tty, "");
+}
+
 \f
 void
 _initialize_valprint (void)
@@ -2703,6 +2722,14 @@ _initialize_valprint (void)
   add_alias_cmd ("p", "print", no_class, 1, &showlist);
   add_alias_cmd ("pr", "print", no_class, 1, &showlist);
 
+  add_prefix_cmd ("raw", no_class, set_print_raw,
+		  _("\
+Generic command for setting what things to print in \"raw\" mode."),
+		  &setprintrawlist, "set print raw ", 0, &setprintlist);
+  add_prefix_cmd ("raw", no_class, show_print_raw,
+		  _("Generic command for showing \"print raw\" settings."),
+		  &showprintrawlist, "show print raw ", 0, &showprintlist);
+
   add_setshow_uinteger_cmd ("elements", no_class,
 			    &user_print_options.print_max, _("\
 Set limit on string chars or array elements to print."), _("\
Index: valprint.h
===================================================================
RCS file: /cvs/src/src/gdb/valprint.h,v
retrieving revision 1.47
diff -u -p -r1.47 valprint.h
--- valprint.h	9 Jul 2013 16:57:09 -0000	1.47
+++ valprint.h	17 Jul 2013 19:13:20 -0000
@@ -81,10 +81,12 @@ struct value_print_options
      share one flag, why not Pascal too?  */
   int pascal_static_field_print;
 
-  /* Controls Python pretty-printing.  */
+  /* If non-zero don't do Python pretty-printing.  */
   int raw;
 
-  /* If nonzero, print the value in "summary" form.  */
+  /* If nonzero, print the value in "summary" form.
+     If raw and summary are both non-zero, don't print non-scalar values
+     ("..." is printed instead).  */
   int summary;
 
   /* If nonzero, when printing a pointer, print the symbol to which it
Index: doc/gdb.texinfo
===================================================================
RCS file: /cvs/src/src/gdb/doc/gdb.texinfo,v
retrieving revision 1.1100
diff -u -p -r1.1100 gdb.texinfo
--- doc/gdb.texinfo	2 Jul 2013 16:58:32 -0000	1.1100
+++ doc/gdb.texinfo	17 Jul 2013 19:13:20 -0000
@@ -9030,6 +9030,18 @@ thus speeding up the display of each Ada
 @item show print frame-arguments
 Show how the value of arguments should be displayed when printing a frame.
 
+@item set print raw frame-arguments on
+Print frame arguments in raw, non pretty-printed, form.
+
+@item set print raw frame-arguments off
+Print frame arguments in pretty-printed form, if there is a pretty-printer
+for the value (@pxref{Pretty Printing}),
+otherwise print the value in raw form.
+This is the default.
+
+@item show print raw frame-arguments
+Show whether to print frame arguments in raw form.
+
 @anchor{set print entry-values}
 @item set print entry-values @var{value}
 @kindex set print entry-values
Index: testsuite/gdb.python/py-frame-args.c
===================================================================
RCS file: testsuite/gdb.python/py-frame-args.c
diff -N testsuite/gdb.python/py-frame-args.c
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.python/py-frame-args.c	17 Jul 2013 19:13:20 -0000
@@ -0,0 +1,60 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2013 Free Software Foundation, Inc.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include <string.h>
+
+struct s
+{
+  int m;
+};
+
+struct ss
+{
+  struct s a;
+  struct s b;
+};
+
+void
+init_s (struct s *s, int m)
+{
+  s->m = m;
+}
+
+void
+init_ss (struct ss *s, int a, int b)
+{
+  init_s (&s->a, a);
+  init_s (&s->b, b);
+}
+
+void
+foo (int x, struct ss ss)
+{
+  return; /* break-here */
+}
+
+int
+main ()
+{
+  struct ss ss;
+
+  init_ss (&ss, 1, 2);
+
+  foo (42, ss);
+
+  return 0;
+}
Index: testsuite/gdb.python/py-frame-args.exp
===================================================================
RCS file: testsuite/gdb.python/py-frame-args.exp
diff -N testsuite/gdb.python/py-frame-args.exp
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.python/py-frame-args.exp	17 Jul 2013 19:13:20 -0000
@@ -0,0 +1,70 @@
+# Copyright (C) 2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+standard_testfile
+
+if { [prepare_for_testing ${testfile}.exp ${testfile} ${srcfile}] } {
+    return -1
+}
+
+# Skip all tests if Python scripting is not enabled.
+if { [skip_python_tests] } { continue }
+
+if ![runto_main] {
+    return -1
+}
+
+set remote_python_file [remote_download host ${srcdir}/${subdir}/${testfile}.py]
+
+gdb_test_no_output "python exec (open ('${remote_python_file}').read ())"
+
+gdb_breakpoint [gdb_get_line_number "break-here"]
+gdb_continue_to_breakpoint "break-here" ".* break-here .*"
+
+# Test all combinations with raw off.
+
+gdb_test_no_output "set print raw frame-arguments off"
+
+gdb_test_no_output "set print frame-arguments none"
+gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
+    "frame pretty,none"
+
+gdb_test_no_output "set print frame-arguments scalars"
+gdb_test "frame" ".*foo \\(x=42, ss=super struct = {\[.\]{3}}\\).*" \
+    "frame pretty,scalars"
+
+gdb_test_no_output "set print frame-arguments all"
+gdb_test "frame" \
+    ".*foo \\(x=42, ss=super struct = {a = m=<1>, b = m=<2>}\\).*" \
+    "frame pretty,all"
+
+# Test all combinations with raw on.
+
+gdb_test_no_output "set print raw frame-arguments on"
+
+gdb_test_no_output "set print frame-arguments none"
+gdb_test "frame" ".*foo \\(x=\[.\]{3}, ss=\[.\]{3}\\).*" \
+    "frame raw,none"
+
+gdb_test_no_output "set print frame-arguments scalars"
+gdb_test "frame" ".*foo \\(x=42, ss=\[.\]{3}\\).*" \
+    "frame raw,scalars"
+
+gdb_test_no_output "set print frame-arguments all"
+gdb_test "frame" \
+    ".*foo \\(x=42, ss={a = {m = 1}, b = {m = 2}}\\).*" \
+    "frame raw,all"
+
+remote_file host delete ${remote_python_file}
Index: testsuite/gdb.python/py-frame-args.py
===================================================================
RCS file: testsuite/gdb.python/py-frame-args.py
diff -N testsuite/gdb.python/py-frame-args.py
--- /dev/null	1 Jan 1970 00:00:00 -0000
+++ testsuite/gdb.python/py-frame-args.py	17 Jul 2013 19:13:20 -0000
@@ -0,0 +1,75 @@
+# Copyright (C) 2013 Free Software Foundation, Inc.
+
+# This program is free software; you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation; either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program.  If not, see <http://www.gnu.org/licenses/>.
+
+import re
+import gdb
+
+class pp_s (object):
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        m = self.val["m"]
+        return "m=<" + str(self.val["m"]) + ">"
+
+class pp_ss (object):
+    def __init__(self, val):
+        self.val = val
+
+    def to_string(self):
+        return "super struct"
+
+    def children (self):
+        yield 'a', self.val['a']
+        yield 'b', self.val['b']
+
+
+def lookup_function (val):
+    "Look-up and return a pretty-printer that can print val."
+
+    # Get the type.
+    type = val.type
+
+    # If it points to a reference, get the reference.
+    if type.code == gdb.TYPE_CODE_REF:
+        type = type.target ()
+
+    # Get the unqualified type, stripped of typedefs.
+    type = type.unqualified ().strip_typedefs ()
+
+    # Get the type name.    
+    typename = type.tag
+    if typename == None:
+        return None
+
+    # Iterate over local dictionary of types to determine
+    # if a printer is registered for that type.  Return an
+    # instantiation of the printer if found.
+    for function in pretty_printers_dict:
+        if function.match (typename):
+            return pretty_printers_dict[function] (val)
+        
+    # Cannot find a pretty printer.  Return None.
+    return None
+
+
+def register_pretty_printers ():
+    pretty_printers_dict[re.compile ('^s$')] = pp_s
+    pretty_printers_dict[re.compile ('^ss$')] = pp_ss
+
+pretty_printers_dict = {}
+
+register_pretty_printers ()
+gdb.pretty_printers.append (lookup_function)


  reply	other threads:[~2013-07-17 19:26 UTC|newest]

Thread overview: 8+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2013-06-30  0:37 Doug Evans
2013-06-30 14:58 ` Doug Evans
2013-06-30 15:17   ` Eli Zaretskii
2013-06-30 18:11     ` Doug Evans
2013-07-17 19:26       ` Doug Evans [this message]
2013-07-17 19:34         ` Eli Zaretskii
2013-07-17 19:50         ` Tom Tromey
2013-07-17 19:54           ` Doug Evans

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20966.61429.746380.387990@ruffy.mtv.corp.google.com \
    --to=dje@google.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=palves@redhat.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox