From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 20155 invoked by alias); 17 Jul 2013 19:26:56 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 20140 invoked by uid 89); 17 Jul 2013 19:26:56 -0000 X-Spam-SWARE-Status: No, score=-2.2 required=5.0 tests=AWL,BAYES_50,KHOP_THREADED,RCVD_IN_DNSWL_LOW,RCVD_IN_HOSTKARMA_YE,RDNS_NONE,SPF_PASS autolearn=ham version=3.3.1 Received: from Unknown (HELO mail-vc0-f201.google.com) (209.85.220.201) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Wed, 17 Jul 2013 19:26:54 +0000 Received: by mail-vc0-f201.google.com with SMTP id hz11so67918vcb.4 for ; Wed, 17 Jul 2013 12:26:47 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20120113; h=from:mime-version:content-type:content-transfer-encoding:message-id :date:to:subject:in-reply-to:references:x-mailer:x-gm-message-state; bh=WPQRmvSbH+0JpIpgEx0LIR3n+4i7CIKRHl65Um07yEk=; b=HanRgfx/1bDN8SDkhIcsozFSTvfjzYOOByN6kxG7tVR/vblcaVe6CkrfiGNhaKpJvZ sUK0DsXF9t8M0QiJ4NojqSlr46LRBM8NhqcEopf4nYf9hufnv9wBzX1hV17l15vmB82S /QqNXXxWTSZV5RiqaXxsPfZFbJY83cJ2C6vEBR8JwFOnAIfDj/ms9HvZOBHfCjYYXppX c+mVHqqz4cxjxw+8G9VRs6mWoFG5klbhI8fy1EnxEb+RS1wx/i+gHu/SMV+MrOJUfOWa Hc2BAkPFCIX5vSHh/5orlxhCSm05QbdD0tXwaHY+ysSpstPyoeI9DNILSxBdGc5rVBQI OZjA== X-Received: by 10.236.93.113 with SMTP id k77mr4417149yhf.25.1374089206985; Wed, 17 Jul 2013 12:26:46 -0700 (PDT) Received: from corp2gmr1-2.hot.corp.google.com (corp2gmr1-2.hot.corp.google.com [172.24.189.93]) by gmr-mx.google.com with ESMTPS id o24si3275533yhm.1.2013.07.17.12.26.46 for (version=TLSv1.1 cipher=AES128-SHA bits=128/128); Wed, 17 Jul 2013 12:26:46 -0700 (PDT) Received: from ruffy.mtv.corp.google.com (ruffy.mtv.corp.google.com [172.17.128.44]) by corp2gmr1-2.hot.corp.google.com (Postfix) with ESMTP id 4C67B5A404E; Wed, 17 Jul 2013 12:26:46 -0700 (PDT) From: Doug Evans MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit Message-ID: <20966.61429.746380.387990@ruffy.mtv.corp.google.com> Date: Wed, 17 Jul 2013 19:26:00 -0000 To: Eli Zaretskii , gdb-patches , palves@redhat.com Subject: Re: [RFA, doc RFA] set print frame-arguments-raw on|off In-Reply-To: References: <20943.41509.270378.842286@ruffy.mtv.corp.google.com> <83ip0vd4sf.fsf@gnu.org> X-Gm-Message-State: ALoCoQmqEbjMOj/y2HuZRjoYjDJRXc3b1JFwkxlXBcSfeF9/bC2BDejj9Mv2ygXVaVjJma7qKnGrsjlPTs7u4BN8QC2EJ9JAbJLpJsjxgpnsZE6DnpOTnEHcRNoo9IEfUzRcAOZzTLvuZKNxqIjCiyjDuNTBE3yv1qFz2Sxz8GktNYGqqvr3PiATZV+s0RotQkOiXW3ExNfQKpt5A+2JQEO8eoUY+MzQ5g== X-SW-Source: 2013-07/txt/msg00422.txt.bz2 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 * 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 \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, ""); +} + 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 . */ + +#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; +} 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 . + +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 . + +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)