From e7045703528f2fb0d4cadf2ddab16d1887046f35 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Wed, 17 Jul 2013 20:35:11 +0000 Subject: [PATCH] * 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. --- gdb/ChangeLog | 10 ++++ gdb/NEWS | 5 ++ gdb/doc/ChangeLog | 4 ++ gdb/doc/gdb.texinfo | 12 +++++ gdb/gdbcmd.h | 4 ++ gdb/stack.c | 13 ++++++ gdb/testsuite/ChangeLog | 6 +++ gdb/testsuite/gdb.python/py-frame-args.c | 60 ++++++++++++++++++++++++ gdb/testsuite/gdb.python/py-frame-args.exp | 70 ++++++++++++++++++++++++++++ gdb/testsuite/gdb.python/py-frame-args.py | 75 ++++++++++++++++++++++++++++++ gdb/valprint.c | 26 +++++++++++ gdb/valprint.h | 6 ++- 12 files changed, 289 insertions(+), 2 deletions(-) create mode 100644 gdb/testsuite/gdb.python/py-frame-args.c create mode 100644 gdb/testsuite/gdb.python/py-frame-args.exp create mode 100644 gdb/testsuite/gdb.python/py-frame-args.py 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 + * 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 + + * gdb.texinfo (Print Settings): Document "print raw frame-arguments". + 2013-07-02 Tom Tromey * 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 \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 + + * 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 * 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 . */ + +#include + +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 . + +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 . + +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 -- 2.7.4