aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2013-07-17 20:35:11 +0000
committerDoug Evans <dje@google.com>2013-07-17 20:35:11 +0000
commite7045703528f2fb0d4cadf2ddab16d1887046f35 (patch)
tree627d5ca62a8379cc2eb29a718094adb3334ccd9f
parent453e48a5a576472ddf5b099a1c0a0e00ff1da657 (diff)
downloadgdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.zip
gdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.tar.gz
gdb-e7045703528f2fb0d4cadf2ddab16d1887046f35.tar.bz2
* 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.
-rw-r--r--gdb/ChangeLog10
-rw-r--r--gdb/NEWS5
-rw-r--r--gdb/doc/ChangeLog4
-rw-r--r--gdb/doc/gdb.texinfo12
-rw-r--r--gdb/gdbcmd.h4
-rw-r--r--gdb/stack.c13
-rw-r--r--gdb/testsuite/ChangeLog6
-rw-r--r--gdb/testsuite/gdb.python/py-frame-args.c60
-rw-r--r--gdb/testsuite/gdb.python/py-frame-args.exp70
-rw-r--r--gdb/testsuite/gdb.python/py-frame-args.py75
-rw-r--r--gdb/valprint.c26
-rw-r--r--gdb/valprint.h6
12 files changed, 289 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 691470a..142156d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,15 @@
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.
+
* cli/cli-cmds.c (init_cmd_lists): Delete unnecessary initialization
of all *list variables.
diff --git a/gdb/NEWS b/gdb/NEWS
index e469f1e..a4238d0 100644
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -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.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index 9cb925c..87a1f08 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,7 @@
+2013-07-17 Doug Evans <dje@google.com>
+
+ * gdb.texinfo (Print Settings): Document "print raw frame-arguments".
+
2013-07-02 Tom Tromey <tromey@redhat.com>
* gdb.texinfo (Target Commands): Don't mention "target nrom".
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index fae54e4..4caeea5 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -9030,6 +9030,18 @@ thus speeding up the display of each Ada frame.
@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
diff --git a/gdb/gdbcmd.h b/gdb/gdbcmd.h
index c9262f6..b7c3e6e 100644
--- a/gdb/gdbcmd.h
+++ b/gdb/gdbcmd.h
@@ -107,6 +107,10 @@ extern struct cmd_list_element *setprintlist;
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;
diff --git a/gdb/stack.c b/gdb/stack.c
index 313d57f..d89ff89 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -65,6 +65,9 @@ static const char *const print_frame_arguments_choices[] =
{"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 +280,7 @@ print_frame_arg (const struct frame_arg *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 +2644,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."),
diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog
index ddd00ea..ca53ee1 100644
--- a/gdb/testsuite/ChangeLog
+++ b/gdb/testsuite/ChangeLog
@@ -1,3 +1,9 @@
+2013-07-17 Doug Evans <dje@google.com>
+
+ * gdb.python/py-frame-args.c: New file.
+ * gdb.python/py-frame-args.py: New file.
+ * gdb.python/py-frame-args.exp New file.
+
2013-07-16 Andrew Burgess <aburgess@broadcom.com>
* gdb.base/printcmds.exp (test_printf): Add tests for format
diff --git a/gdb/testsuite/gdb.python/py-frame-args.c b/gdb/testsuite/gdb.python/py-frame-args.c
new file mode 100644
index 0000000..7cc3dbe
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-frame-args.c
@@ -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;
+}
diff --git a/gdb/testsuite/gdb.python/py-frame-args.exp b/gdb/testsuite/gdb.python/py-frame-args.exp
new file mode 100644
index 0000000..ff082dd
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-frame-args.exp
@@ -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}
diff --git a/gdb/testsuite/gdb.python/py-frame-args.py b/gdb/testsuite/gdb.python/py-frame-args.py
new file mode 100644
index 0000000..65c9ad7
--- /dev/null
+++ b/gdb/testsuite/gdb.python/py-frame-args.py
@@ -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)
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 184bab6..753ae34 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -76,6 +76,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 +2689,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, "");
+}
+
void
_initialize_valprint (void)
@@ -2703,6 +2721,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."), _("\
diff --git a/gdb/valprint.h b/gdb/valprint.h
index 3401afa..2959098 100644
--- a/gdb/valprint.h
+++ b/gdb/valprint.h
@@ -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