From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 109067 invoked by alias); 13 Jun 2018 15:50:12 -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 109031 invoked by uid 89); 13 Jun 2018 15:50:11 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-25.3 required=5.0 tests=AWL,BAYES_00,GIT_PATCH_0,GIT_PATCH_1,GIT_PATCH_2,GIT_PATCH_3,KAM_SHORT,SPF_HELO_PASS autolearn=ham version=3.3.2 spammy=naked, va, rb, till X-HELO: mx1.redhat.com Received: from mx3-rdu2.redhat.com (HELO mx1.redhat.com) (66.187.233.73) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 13 Jun 2018 15:50:09 +0000 Received: from smtp.corp.redhat.com (int-mx04.intmail.prod.int.rdu2.redhat.com [10.11.54.4]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AC3CB406F8B9; Wed, 13 Jun 2018 15:50:07 +0000 (UTC) Received: from [127.0.0.1] (ovpn04.gateway.prod.ext.ams2.redhat.com [10.39.146.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 18AFA20244E0; Wed, 13 Jun 2018 15:50:06 +0000 (UTC) Subject: Re: [PATCH][PR cli/22573] Honour 'print pretty' when printing result of finish command To: Tom de Vries , gdb-patches@sourceware.org References: <20180609170752.2s4kdlyhat5d5bnn@localhost.localdomain> From: Pedro Alves Message-ID: <4504da7f-593e-c8af-8ac9-40930cf9ce11@redhat.com> Date: Wed, 13 Jun 2018 15:50:00 -0000 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.8.0 MIME-Version: 1.0 In-Reply-To: <20180609170752.2s4kdlyhat5d5bnn@localhost.localdomain> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit X-SW-Source: 2018-06/txt/msg00330.txt.bz2 On 06/09/2018 06:07 PM, Tom de Vries wrote: > Hi, > > this fixes PR22573 - "finish" doesn't respect "set print pretty". > > > Consider this testcase: > ... > struct s { > int a; > int b; > }; > > struct s foo () > { > struct s r; > r.a = 1; > r.b = 2; > return r; > } > > int > main (void) > { > struct s v; > v = foo (); > return v.a + v.b; > } > ... > > When we compile it with -g, load the exec with gdb, and run till the end of foo, > we can print r: > ... > (gdb) p r > $1 = {a = 1, b = 2} > ... > > and by setting pretty printing to on, we can get the fields of r printed each > on its own line: > ... > (gdb) set print pretty > (gdb) p r > $2 = { > a = 1, > b = 2 > } > ... > > However, when we finish foo, the printed function result value is not using > the pretty printing setting: > ... > (gdb) finish > Run till exit from #0 foo () at test.c:11 > 0x00000000004004c1 in main () at test.c:18 > 18 v = foo (); > Value returned is $3 = {a = 1, b = 2} > ... > > This patch fixes that by using get_user_print_options instead of > get_no_prettyformat_print_options in print_return_value_1, which gives us: > ... > (gdb) finish > Run till exit from #0 foo () at test.c:11 > 0x00000000004004c1 in main () at test.c:18 > 18 v = foo (); > Value returned is $2 = { > a = 1, > b = 2 > } > ... > > Build & reg-tested on x86_64. > > OK for trunk? > > Thanks, > - Tom > > [gdb/cli] Honour 'print pretty' when printing result of finish command > > 2018-06-08 Tom de Vries > > PR cli/22573 > * infcmd.c (print_return_value_1): Use get_user_print_options instead of > get_no_prettyformat_print_options. > > * gdb.base/finish-pretty.c: New test. > * gdb.base/finish-pretty.exp: New file. Just in case, note that gdb/testsuite/ has its own ChangeLog. > diff --git a/gdb/testsuite/gdb.base/finish-pretty.c b/gdb/testsuite/gdb.base/finish-pretty.c > new file mode 100644 > index 0000000000..5d30b1c16d > --- /dev/null > +++ b/gdb/testsuite/gdb.base/finish-pretty.c > @@ -0,0 +1,24 @@ Please add a copyright header. > +struct s > +{ > + int a; > + int b; > +}; > + > +static struct s __attribute((noinline, noclone)) Do we need that? (Tests are built with -O0.) > +foo (void) > +{ > + struct s r; > + r.a = 1; > + r.b = 2; > + return r; > +} > + > +int > +main (void) > +{ > + struct s v; > + > + v = foo (); > + > + return v.a + v.b; > +} > diff --git a/gdb/testsuite/gdb.base/finish-pretty.exp b/gdb/testsuite/gdb.base/finish-pretty.exp > new file mode 100644 > index 0000000000..52852c7bad > --- /dev/null > +++ b/gdb/testsuite/gdb.base/finish-pretty.exp > @@ -0,0 +1,34 @@ > +# Copyright 2018 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 . > + Please add small intro comment describing what the testcase is about. > +if { [prepare_for_testing "failed to prepare" finish-pretty finish-pretty.c] } { > + return -1 > +} Write: standard_testfile if { [prepare_for_testing "failed to prepare" $testfile $srcfile] } { return -1 } > + > +proc finish_pretty { } { > + global gdb_prompt Not used, AFAICT. > + > + gdb_test "break foo" "Breakpoint \[0123456789\].*" \ > + "set break on foo" > + gdb_test "run" "Breakpoint.* foo.*" \ > + "run to foo" Please don't use naked "run" unless required for the testcase. It won't work when testing against "target remote". You can try that with: make check-parallel \ RUNTESTFLAGS="--target_board=native-gdbserver" TESTS="*/finish-pretty.exp" Instead, use "runto_main", or better, since you want to run to "foo", use "runto foo", like: if ![runto foo] { fail "can't run to foo" return } > + gdb_test "set print pretty" ".*" \ > + "pretty printing switched on" Use gdb_test_no_output. Please resend a v2 with the issue addressed, and it should be ready to go. > + gdb_test "finish" {.*Value returned is \$1 = \{\r\n a = 1, \r\n b = 2\r\n\}} \ > + "finish foo" > +} > + > +finish_pretty > + > Thanks, Pedro Alves