From patchwork Sat Dec 10 16:23:26 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 61756 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 9F84B3851896 for ; Sat, 10 Dec 2022 16:23:37 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 9F84B3851896 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670689417; bh=Obf6YStL7sg0WdEKiWdC5naj0yyZ9Aggn4mvfC5G7vI=; h=To:Subject:Date:In-Reply-To:References:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To: From; b=Zv3XURcymw773wUyV7HL/C7CQPbTWLlcjXM7+QUl+Af1jzU8JGyA1UqqjTPeL5Ips FTLf2WrYsFggD8YsczqNViHPQfdxkDtlxrKNLOm+YdqrhZ8celanmklbNXNAQ3lJnL XiJwK4M7tzJIfoxj5d8ME2dWh5qg7TblBP1/TRg0= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic310-11.consmr.mail.ir2.yahoo.com (sonic310-11.consmr.mail.ir2.yahoo.com [77.238.177.32]) by sourceware.org (Postfix) with ESMTPS id CF7AB3844699 for ; Sat, 10 Dec 2022 16:22:20 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org CF7AB3844699 X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1670689339; bh=b3A4Fy17ed5kBu0+zbfcyF7AhzROFrIP0ZsffmDL70F=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=WihC4Rv8bccaif/vK4Sbk6DTwg39x498n1T1XzKfvUbWm1YUn7ojXYt1hK6J5irRPloE53hVrZ/ZmmsYAlv2LJCfsMB2PSwhvssUXYlynJBzHidar75hhYTOT0wcXnLc4fatQpRxJU/2fOSm5cW+PfC7hq1wkQ5mvYMhnMdBH2pABp27bmwvi//uhzXv14sPefUvsmTqHm3tL62bfBGSeg1nywTpjaPOz1XSHZSXHK2Z8r70C45I+hV+tfgEfy6QIRylGa0oNfZrsPtzukRZ3R3ejgwN6nCRN36+zvssIA66X9atCLqfbPVPZHPMLiGswnfLPJKCyOKcnM18qmvt/w== X-YMail-OSG: bsLAYEAVM1mWbxtiNVp0tUVIy4ZxgvLhXhTP7q8F89GLu2W9mKnZ7Bev_iXDK3W gsdZQUyArRLjRPh_jxT6T7buGMEHQOMkrtZC1TW2IPoWDK2dixthZpWi6qGQpDvz9zreuj2z1_u0 FNdVg2Yrp2GdopTBOVmz9CpWEKzxdi5S77DtLX3bWWZadtA.hf8S5yGP4TjNFIlS05dWdJ6gguVq e51KK4WvMLSh7uZYiu7pdGtG.EfZ7_gn5Crcky5jGg0J.ri2OM_KWiikyMOhwt0R7NKpp4_E8J2h spkClb6nMLEaD3t.4vF0TpLbzyiy2XKy2U_LOa.gLKd0yBlviJLzA5X9iarJK9xwWigKI_KgoHUa VruWT5_tO5lADgag26a4DSiFjyDV6mMJ4ocdYKGeDPqmTe44ezvFf.2sKhmzGcgBK7LiUaNwUsDs K1Kk.4sveNknn_PSBbo4SeewGKwG0ub3L2ql3FgO5yDcDTihxX73lsVZXCCzYaG8TVy1AeZP6vm. k_0dywgYhRR_YL46vW9AddXLMzFokX02Tx_HB3bdJ0N7kv_lJzNXMq_8LAicbcFVdYcnowlJrdTU h_VMSwCohKUn6dfHaj3IkC0Mf4KosFL4RSXuIMoyO.a6jjsBbC4Oq82a2W2wrsDVHg5dk1xdKD8a hWLdURofvR2mgw_FChs5uoV1uFEHqo9dso56.PzcWvrwBLEWUtGqmfKqBBvAXaRJMRgq.nlJvI3Q z3eroPdEbUvFL7PaCefLc2xea3z8dV8IK0P50Ur3qfzsi31qJ04GuqAUOEocgLWjrFLUj9eGbS_g us1Um5xxy382IFYO1BXi4q0R0F.7MAJwpgUit27Zgb6aYyVnATkQpsRO9dHMfE9S7mS_kOxshtcH Gd3JQPsh7P8m9VMxf94lyz_xV1flQHNz_B51Sjw_gtwdft34haVQUxeNRCgVzfGAmlFi8Y7yO8Jn rql4psGl1p3J_hcZsukwwak_cf5DAF3FkThXhbOj6WKTDhYfnCLkKLzt4_UMTF7lpozQNW4VLwQj hFAvJqZ1y6.t8VNKyHIigyUGSsB1pSEKcwXD5ZeKc2MK.J3QF2xTlkhw7RMqMdoqlHfsNymX.TOX nkm59JLZIThwylLRNVuu6haCX.AHrrvyjhG2fSN0XuonHz5nd5UNmxD1.iKLCafnslOVHiDsk.Pu H3BKt._JYRZ9OYduwt7lfCe60V7cD_mijWpIeqmvzn1KT4tTrEopILji783AVRMOdWFbi8xLS1Uu Y3JLAEhm9clzuseLnZDi05UC.hKJVhNBOhwuj9uogXW64WpZy2KyF_qb.OkS8Q2R.dt7qxPU1GKK nMGFlI.E1AewHF1SG4VIU7QU6dbaErxiTxlrSb4noLJj_Z4hy1wBWACCyygRLvmT8b6hxQnr9Yg4 ELdnpRFoSDra9YL9wH_3_D__oKlPNmvQrcPmObeYGG2HOzj9Yg2iuAg4E.n5Y6vFD4a5yiXLHzLw nyuw7jvFFQon890gMFnlXT2eXVdfrCFAb3OhjaYB4z1_pDz3vaK6n6GXpwfZEa29Xz3WCA5ltQu0 S4SrBB34_qaPOvvOKEF0QpSen3z966ygCDYOAS6ht0dZI_TIvcIKO4eP2V1Akn2IblUIsiJEF444 V7coe089xUdmwG.drTWkI9r7x5Kh_qLBVibVOJ5fGuCkEuSMGxTrRb0COixGbfM2VWfoDiQOjd5I hu234AD5caME5oD7odnim2MgIokA0xEyxpHX4s0.A5g0fTsOhunLFK9KskzSVTkYZri4K4XsSKr8 xRf0Yx9yhNrn.ZPbXUy1LTEaU2mWwzXdGI7t94ox6yDpX8CKarBPMLEwlztlgryKg8HrGN0LFJMq bqFy0eEESf8SR4zev7QdDhl_J8_EpdNi9DwlaOBePFCGFZs4yQ5jr_VEbWOBh_.WjA7a7cRQ_Fpy Qsh4SK9b2dMYxw2zAveqvNHv8_xSsN1txvnr2diDWW3xKxxYMb1.bL25WKDikk9Y5RCCF8cc5RxV 5cjqdlFfgKVEqt3M_NUl3E8AQwaTRWWbj85dnZ6nK_fCkT0Shs23uhNbbi_GsuMEnEODaqnQhK5i H7_c36hAMR4WdsE3GK_w2K4Iigj7mBhkiO1RhN2cYH88GU_lHSRl1gn5MTR13fqGl2XM4vArxvT1 i1Gk0l.bgyDVBxWUvv15.y7tbZB.vHG9aOL9zQhLZVR8EP6ut0qFtQ_omZBu3Svh5skeRbYb9aen PeOIXinXWIetvsvZBcjhdjbILTzwhr4TfWM_ZxQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic310.consmr.mail.ir2.yahoo.com with HTTP; Sat, 10 Dec 2022 16:22:19 +0000 Received: by hermes--production-ir2-5795fc58c8-xpjmk (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 3d85437d5a35860ed1c98bc98c221dd7; Sat, 10 Dec 2022 16:22:14 +0000 (UTC) To: gdb-patches@sourceware.org Subject: [PATCH 3/3] [RFC] Implement printing of return values of stepped-over functions Date: Sat, 10 Dec 2022 17:23:26 +0100 Message-Id: <20221210162326.854-3-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 In-Reply-To: <20221210162326.854-1-ssbssa@yahoo.de> References: <20221210162326.854-1-ssbssa@yahoo.de> MIME-Version: 1.0 X-Antivirus: Avast (VPS 221210-4, 12/10/2022), Outbound message X-Antivirus-Status: Clean X-Spam-Status: No, score=-9.4 required=5.0 tests=BAYES_00, DKIM_ADSP_CUSTOM_MED, DKIM_INVALID, DKIM_SIGNED, FREEMAIL_FROM, GIT_PATCH_0, KAM_DMARC_STATUS, NML_ADSP_CUSTOM_MED, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H2, SPF_HELO_NONE, SPF_PASS, TXREP autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Hannes Domani via Gdb-patches From: Hannes Domani Reply-To: Hannes Domani Errors-To: gdb-patches-bounces+patchwork=sourceware.org@sourceware.org Sender: "Gdb-patches" Considering this example (gdb.base/return.c): (gdb) n 44 printf("in main after func1\n"); (gdb) n 45 tmp2 = func2 (); (gdb) n 46 tmp3 = func3 (); (gdb) n 47 printf("exiting\n"); (gdb) n 48 return 0; When enabling the new functionality: (gdb) set print step-return-value on (gdb) n 44 printf("in main after func1\n"); (gdb) n 45 tmp2 = func2 (); printf returned $1 = 20 (gdb) n 46 tmp3 = func3 (); func2 returned $2 = -5 (gdb) n 47 printf("exiting\n"); func3 returned $3 = -5 (gdb) n 48 return 0; printf returned $4 = 8 It shows the return values of all function which were stepped over with 'next', and puts them into convenience variables, similar to 'finish'. --------- I wonder if it should always collect the return value and put into the value history, even if they are not printed, similar to how 'finish' works. Or maybe make them available from python somehow (plus the function symbols), so it could be used e.g. in a new special TUI window. --- gdb/doc/gdb.texinfo | 11 ++++++ gdb/infcmd.c | 91 +++++++++++++++++++++++++++++++++++++++++++++ gdb/infrun.c | 10 ++++- gdb/thread-fsm.h | 11 ++++++ 4 files changed, 122 insertions(+), 1 deletion(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 5b566669975..8ef2a74cd5f 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -6361,6 +6361,17 @@ debug information. This is the default. Show whether @value{GDBN} will stop in or step over functions without source line debug information. +@kindex set print step-return-value +@kindex show print step-return-value +@item set print step-return-value @r{[}on|off@r{]} +@itemx show print step-return-value +Control whether @value{GDBN} will show the return values of functions +that were stepped over with @code{next}. + +If @code{on}, it will print the return values, and enter them into the +value history (@pxref{Value History}). If @code{off}, the return values +are not shown, and not entered into the value history. + @kindex finish @kindex fin @r{(@code{finish})} @item finish diff --git a/gdb/infcmd.c b/gdb/infcmd.c index 9c96d9a39ee..b484da431f7 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -104,6 +104,10 @@ int stopped_by_random_signal; static bool finish_print = true; +/* Whether "next" should print return values of stepped-over functions. */ + +static bool step_return_value_print = false; + static void @@ -894,6 +898,8 @@ struct step_command_fsm : public thread_fsm /* If true, this is a stepi/nexti, otherwise a step/step. */ int single_inst; + std::vector return_values; + explicit step_command_fsm (struct interp *cmd_interp) : thread_fsm (cmd_interp) { @@ -901,6 +907,9 @@ struct step_command_fsm : public thread_fsm void clean_up (struct thread_info *thread) override; bool should_stop (struct thread_info *thread) override; + void print_return_values (struct ui_out *uiout) override; + void add_callee_info (frame_info_ptr frame) override; + void capture_return_value () override; enum async_reply_reason do_async_reply_reason () override; }; @@ -999,6 +1008,67 @@ step_command_fsm::should_stop (struct thread_info *tp) return true; } +/* Implementation of the 'print_return_values' FSM method for stepping + commands. */ + +void +step_command_fsm::print_return_values (struct ui_out *uiout) +{ + for (return_value_info &rv : return_values) + { + if (rv.value == nullptr) + continue; + + try + { + uiout->field_string ("return-from", rv.function->print_name (), + function_name_style.style ()); + uiout->text (" returned "); + uiout->field_fmt ("gdb-result-var", "$%d", + rv.value_history_index); + uiout->text (" = "); + + struct value_print_options opts; + get_user_print_options (&opts); + + string_file stb; + value_print (rv.value, &stb, &opts); + uiout->field_stream ("return-value", stb); + + uiout->text ("\n"); + } + catch (const gdb_exception &ex) + { + exception_print (gdb_stdout, ex); + } + } +} + +/* Implementation of the 'add_callee_info' FSM method for stepping + commands. */ + +void +step_command_fsm::add_callee_info (frame_info_ptr frame) +{ + if (!step_return_value_print) + return; + + return_value_info rv {}; + get_callee_info (&rv, frame); + if (rv.function != nullptr) + return_values.push_back (rv); +} + +/* Implementation of the 'capture_return_value' FSM method for stepping + commands. */ + +void +step_command_fsm::capture_return_value () +{ + if (!return_values.empty () && return_values.back ().value == nullptr) + get_return_value_info (&return_values.back ()); +} + /* Implementation of the 'clean_up' FSM method for stepping commands. */ void @@ -3078,6 +3148,18 @@ Printing of return value after `finish' is %s.\n"), value); } +/* Implement `show print step-return-value'. */ + +static void +show_print_step_return_value (struct ui_file *file, int from_tty, + struct cmd_list_element *c, + const char *value) +{ + gdb_printf (file, _("\ +Printing of return values of stepped-over functions is %s.\n"), + value); +} + /* This help string is used for the run, start, and starti commands. It is defined as a macro to prevent duplication. */ @@ -3423,4 +3505,13 @@ Show whether `finish' prints the return value."), nullptr, nullptr, show_print_finish, &setprintlist, &showprintlist); + + add_setshow_boolean_cmd ("step-return-value", class_support, + &step_return_value_print, _("\ +Set whether `next' prints the return value of stepped-over function."), _("\ +Show whether `next' prints the return value of stepped-over function."), + nullptr, + nullptr, + show_print_step_return_value, + &setprintlist, &showprintlist); } diff --git a/gdb/infrun.c b/gdb/infrun.c index e8ef3677245..8bb2807edee 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -6738,6 +6738,9 @@ process_event_stop_test (struct execution_control_state *ecs) case BPSTAT_WHAT_STEP_RESUME: infrun_debug_printf ("BPSTAT_WHAT_STEP_RESUME"); + if (ecs->event_thread->thread_fsm () != nullptr) + ecs->event_thread->thread_fsm ()->capture_return_value (); + delete_step_resume_breakpoint (ecs->event_thread); if (ecs->event_thread->control.proceed_to_finish && execution_direction == EXEC_REVERSE) @@ -7103,7 +7106,12 @@ process_event_stop_test (struct execution_control_state *ecs) } } else - insert_step_resume_breakpoint_at_caller (frame); + { + insert_step_resume_breakpoint_at_caller (frame); + + if (ecs->event_thread->thread_fsm () != nullptr) + ecs->event_thread->thread_fsm ()->add_callee_info (frame); + } keep_going (ecs); return; diff --git a/gdb/thread-fsm.h b/gdb/thread-fsm.h index 575b9a5e48f..dc23be73695 100644 --- a/gdb/thread-fsm.h +++ b/gdb/thread-fsm.h @@ -63,6 +63,17 @@ struct thread_fsm { } + /* Add callee information (function symbol) for later use for + return values. */ + virtual void add_callee_info (frame_info_ptr frame) + { + } + + /* Capture return value of callee which just returned. */ + virtual void capture_return_value () + { + } + enum async_reply_reason async_reply_reason () { /* If we didn't finish, then the stop reason must come from