From patchwork Sat Dec 10 16:23:24 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 61755 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 41D643844689 for ; Sat, 10 Dec 2022 16:23:09 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 41D643844689 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670689389; bh=Y7pms7mXlY5MqYvvtzMnPeRle45K+1/SZP5TGISO9+A=; h=To:Subject:Date:References:List-Id:List-Unsubscribe:List-Archive: List-Post:List-Help:List-Subscribe:From:Reply-To:From; b=IO6QFYA/Vge/P1kCwJacan2ArDu5q6+jJrEYBZsewL2ryQqNjEURhTRez7MqjJKxE rhtJiOc/dLarOZbWYHgeD/wCp9P9/2SPZ355fh4X00mlnPRtijBKkooU3sMms1lvpo LS5nH6WY2ru69CGCHYb/NussOAoK6T5aagU3b5pM= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic303-20.consmr.mail.ir2.yahoo.com (sonic303-20.consmr.mail.ir2.yahoo.com [77.238.178.201]) by sourceware.org (Postfix) with ESMTPS id B901D3844B36 for ; Sat, 10 Dec 2022 16:22:18 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B901D3844B36 X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1670689337; bh=VSt+uoL+0r+Sc4OzFz2XhzSCp6X6Ourf0J0KwsGzd5m=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=k6T5JjAw70y92T+4dumiR+rIR8K6tx2SVzMwVAQJkXsThGV/YlhmI4zYNDUWiFAHVi58Ufo+imlzn/TUacpilYJpHEZwKkjFns2pWERLTKWfXtcH+qYlJ3q7WN7dIfKxBLrOBBHey6qlxHed+k1PZ2mSoCQISatmo81QLuFXqh5b3Z5RFDLZfE6sFPmw1/OXjOvU4OabfTzAPucgBZOa21DyTo82mZA+u7k9AisU+8eeML3KCBN2uetjZsLGi8kYEhSY5N4pEO/X924HhEZfTzJKkA3vvQ+oJvRs92yNVJh8+LDftlzZVynFdI5BZ99k6HxNFbiqOJnvsy+Y3yssEw== X-YMail-OSG: eJpl6LwVM1kEtB_cjGelrWUhDjgIeKAUor7Bg71UAiISuba8BOEYNBWUDnyUVCq 18hKYtCPJ5g1PTuNAjSZs40v8VdMbu24led812d6luyHCMqgqNy7u2dZ5oRNQzFfCqikatNlPc9C MpOjR1fKlcJK8XKACCH7PUBsJsW3oG__AJ8HE_un0x2BwsQKlC41K3cN3HDbO7lKmHNQ0f5Qvlp6 I_sLmJGHI0YZsA5fbJJr6boDOx6K921S7zQ6Azp_XBOJJoc5kVUmsNv3LWbYt4tOUWhnXC3qnqWW I6gG5gqtfQfKMcDH8toLn.Fo3oOLwOK.g5Ez.Z0YjxCpMKT5UlGg7gz_2.UnQy0Eb5u5w66H9mql se1gdk093Bx958NaA70kAupQGQOv4BML6sZxHoB_VaZuHH92OPL3X34OsxrILwigtugWQRmce6SS XOuEWBgKCusivomsWD6bWCHKeuQ5kk.UfP74bNilha1dTp3zNjDt6yE8niXGNJqE5taG5NlDeb.y O3B6T7__ZRvshELzYdlEO7UOwbiYpVsHNyyP7xIXSsn1LOuV43blKvKXvhu0b9LvD7sLtHrjNfSY zTW_6fpgiiOh57YIv.qtAQZsVFr9eg9g9xgvvASZ.zW6prUby7GLAQdc.InbpjZTZBKYSwH1bQrU A_DuD2b3rBXfqrVmGL4MFkgTKPy.sl.jCG5xSDnGhqfcBliE3l1CMJ8ONmpwNF7E6P2eXzbul.Yt _cAfAi80Jtz0txRHLyEwrNCEyhU9WGabGldL2p807VEn6HKlmrrmFfA9ld3f0JWBXh1NCNrilEWd PvTHj3WWNY7KKLeW9ROqoSEIFj1ldjj.W4nJYxBUbmMaBMlN7LxyV5mKpxpE1Cl2SxcAh3D8B_.S D0S_.o5KDQ2e1HTH.azArTmXkJPbFgQZKILw8QY26Cl3q7tAHvBzW9wTE65r3H._MPD1VQKaqW92 ckRdnahi8XZCzVAWx2lCM2w8FPdwpQY.aN4mHlh2zemE6J7wE2sMr44edtoeZm_reYvSHig9k70w rG2QPXZtG8SxvdjJk4ilnPmWv1vOCq1MKoYt09c3ByoZEUGY0Kr9CPrfAp6lblHfbiC0F1HzNdnt U4hvIs2uiEz.hl6usm.fhX8jFtRgMxr_FAY8Lt5W96IhTNqBMo7lOclkBja6HGOO5iQWlbZvmsve gveerqSqPYwl3CZuVgpe5o8CAt65z2rq47ZdxQ91k4jSrZFAS1sC_uxut3lyzN0qGthFuwJB2_Jy kIKXRIlEZ49aHUFANbKL88.3VnNQkdp6pZNx5biCDkCK29etrundUAdVRlV9Wdz_0V8rOtoHaZzd yaCspGbhS.aXJ.0lpKyNqYlvIW0ypVtmsktZM2hVSOR3_cTqJMjYV7QFkhhydxv5BI0JpF6XW58. 11w_AF9sWKA_PQeHH8wVlQaim9OeaAOUZyykYwVkXx55tXoyGLPxEQtrOn4fMZiqUniXzZIKJ1PE Tq8fiKnA3DGBtvvulW.zACPfTBoutiG9dd7NM3LiB8lVpqGvDIPm_OGEJ8PQbSA0oKRx3yv.39Yo I5bxyo.sEMg.M71cHnCg3yOefGAU4o3eA5QNVw7RtKdWN5f.f3iWMw5c2oB9IWqMFbwSbNuWkLgw I0D.qUvAmxsZ7ySSKMJ7wgz3H5qqn9MEZ9S2cjqBSQ34i.BkFLfvrrXgUYH9vSKizfyPOtbPd.tY 8rdac8qYfvDayMRGFV0b8Bw01t8egqrgyqhwgQAwVMpN06l9WfxLmEbed.u25dahTJ_QTFA0B5tw VX9y_toyKtT5HtNaQKjPFGYoQw_eHhYPFklXIBMgD_yGYAoxlIPeC9ilNG481nP20V1Mbb3.CliD lK5gMu8.pHfJgZRWH2i8UEHjJ6RFBaKtSIz2yAPVHp2a5pexNSMH.DgqYIZtkPZFkyCVqBaGOac_ tYwyPnEXWIzoWvK6_jPk94gdXncMUXQF3QWgQ___1SNhhQE_jMyt7GgFBYWvqsxjstOmgUXHEQEa ZBp0yvFqhaCqRD.bBJ32h00i5r.uG4O8PLp3VmlZG6upzMwitsfH22QWQVxFNXxcRTOBgr74Ygi4 uKNd5of33JYGBsO6U9V6kGeBCDYAGYYjW_B35efs8AHv127BnR5A0W7h2fH47ckCP.kFbb2LGOJJ 6zYPdZ0bdrCkrEsW57_YTxaVAy05ZFI4MBq.ScNsH6ROlgJuKfYuU0ezCewelyVL36CfHrbaWuWn Aorbzu24dEuReCrGaecft4mvQwQ-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic303.consmr.mail.ir2.yahoo.com with HTTP; Sat, 10 Dec 2022 16:22:17 +0000 Received: by hermes--production-ir2-5795fc58c8-xpjmk (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 3d85437d5a35860ed1c98bc98c221dd7; Sat, 10 Dec 2022 16:22:11 +0000 (UTC) To: gdb-patches@sourceware.org Subject: [PATCH 1/3] Change thread_fsm::return_value to thread_fsm::print_return_values Date: Sat, 10 Dec 2022 17:23:24 +0100 Message-Id: <20221210162326.854-1-ssbssa@yahoo.de> X-Mailer: git-send-email 2.35.1 MIME-Version: 1.0 X-Antivirus: Avast (VPS 221210-4, 12/10/2022), Outbound message X-Antivirus-Status: Clean References: <20221210162326.854-1-ssbssa.ref@yahoo.de> X-Spam-Status: No, score=-10.7 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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" A later patch implements print_return_values also for step_command_fsm, to print the return values of all stepped-over functions. This keeps all of the return value printing code in infrun.c, so print_return_value could be made static. --- gdb/infcmd.c | 12 ++++++------ gdb/infrun.c | 11 ++--------- gdb/infrun.h | 7 ------- gdb/thread-fsm.h | 6 ++---- 4 files changed, 10 insertions(+), 26 deletions(-) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index a27d3577b3a..a5fcf2f8ea5 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -1575,7 +1575,7 @@ print_return_value_1 (struct ui_out *uiout, struct return_value_info *rv) RV points at an object representing the captured return value/type and its position in the value history. */ -void +static void print_return_value (struct ui_out *uiout, struct return_value_info *rv) { if (rv->type == nullptr @@ -1623,7 +1623,7 @@ struct finish_command_fsm : public thread_fsm bool should_stop (struct thread_info *thread) override; void clean_up (struct thread_info *thread) override; - struct return_value_info *return_value () override; + void print_return_values (struct ui_out *uiout) override; enum async_reply_reason do_async_reply_reason () override; }; @@ -1684,13 +1684,13 @@ finish_command_fsm::clean_up (struct thread_info *thread) delete_longjmp_breakpoint (thread->global_num); } -/* Implementation of the 'return_value' FSM method for the finish +/* Implementation of the 'print_return_values' FSM method for the finish commands. */ -struct return_value_info * -finish_command_fsm::return_value () +void +finish_command_fsm::print_return_values (struct ui_out *uiout) { - return &return_value_info; + print_return_value (uiout, &return_value_info); } /* Implementation of the 'async_reply_reason' FSM method for the diff --git a/gdb/infrun.c b/gdb/infrun.c index c67458b30b6..e8ef3677245 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -8490,15 +8490,8 @@ print_stop_event (struct ui_out *uiout, bool displays) } tp = inferior_thread (); - if (tp->thread_fsm () != nullptr - && tp->thread_fsm ()->finished_p ()) - { - struct return_value_info *rv; - - rv = tp->thread_fsm ()->return_value (); - if (rv != nullptr) - print_return_value (uiout, rv); - } + if (tp->thread_fsm () != nullptr) + tp->thread_fsm ()->print_return_values (uiout); } /* See infrun.h. */ diff --git a/gdb/infrun.h b/gdb/infrun.h index c711b9b21cc..79323bcc65f 100644 --- a/gdb/infrun.h +++ b/gdb/infrun.h @@ -225,13 +225,6 @@ extern void print_exited_reason (struct ui_out *uiout, int exitstatus); inferior has stopped. */ extern void print_no_history_reason (struct ui_out *uiout); -/* Print the result of a function at the end of a 'finish' command. - RV points at an object representing the captured return value/type - and its position in the value history. */ - -extern void print_return_value (struct ui_out *uiout, - struct return_value_info *rv); - /* Print current location without a level number, if we have changed functions or hit a breakpoint. Print source line if we have one. If the execution command captured a return value, print it. If diff --git a/gdb/thread-fsm.h b/gdb/thread-fsm.h index 96f37ac9414..575b9a5e48f 100644 --- a/gdb/thread-fsm.h +++ b/gdb/thread-fsm.h @@ -58,11 +58,9 @@ struct thread_fsm function's return value here. */ virtual bool should_stop (struct thread_info *thread) = 0; - /* If this FSM saved a function's return value, you can use this - method to retrieve it. Otherwise, this returns NULL. */ - virtual struct return_value_info *return_value () + /* Print return values saved by this FSM. */ + virtual void print_return_values (struct ui_out *uiout) { - return nullptr; } enum async_reply_reason async_reply_reason () From patchwork Sat Dec 10 16:23:25 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Hannes Domani X-Patchwork-Id: 61754 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 A76FF3844685 for ; Sat, 10 Dec 2022 16:22:40 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org A76FF3844685 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1670689360; bh=/jmRIQAv5j8zquLRcDt2MxDa0DhJilkdq5Ktpe9ZewQ=; 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=RersH31vvMC9vm/b9pxw/UDw0HF5Awb2qC5Q1UX414TtZ6z783BZuaFllNtfakEDm sQDEf4m1woV1KCW584ZfmbMexFToUc7Xzrwv/3wcpWAwa7hNqNq8d4td4yVbJqkvFc /FfO0r4Xj/hIcdckH7mJ4cX+7HD4XmWQxQmfSVAg= X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from sonic304-22.consmr.mail.ir2.yahoo.com (sonic304-22.consmr.mail.ir2.yahoo.com [77.238.179.147]) by sourceware.org (Postfix) with ESMTPS id 365BD3844B1F for ; Sat, 10 Dec 2022 16:22:15 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 365BD3844B1F X-SONIC-DKIM-SIGN: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yahoo.com; s=s2048; t=1670689333; bh=xvc4dceKRQ6g6p7Ou9oiAivqkri/RQBFUte5WZTxcuj=; h=X-Sonic-MF:From:To:Subject:Date:From:Subject; b=KtMKaPJwTprOGlW1uvdpUF5CakhPC6w7bEuP6NhMGlh0VmbhYxJDho0NeioVxOFmJ5/g67dCR3jaTSMuyNla8wtNESBIWdTuHTO/ehkTBx/eiJ7/JvHPNoImwl5/sfnRm3OsnRlpUwZ+K6OJ4LprNXAUXi/+8rb7tjbQ79oCUL7C2bqQQINzpEEUef62Ja3B/IWFvVetB5RLbGGyP7Gqr2rQDB+QBhDxdWBoZuomcGVGoG2T2yFi/Aw22H+wiEnJ1B541fo9DxWvt8F+LbzIR9pbIxSvl0Tdaxc+qPwuoqZI7xFWQolUuvFHcNM3+QUqs7/mcdt9OyaTt96Ktk2a7w== X-YMail-OSG: OuZQoUkVM1lBpXhTyGvNymkkkIwl0pdiZ17Or8T6lwSz3_21Lb9JrIfO0nuTztq PhEGPRGDFmcJYBWCSvKHQ7pKeb4H0s6DJWOStpts3bLCqk1UVGuPp_ytjC3_BzTOdmsfPMfYG8ET QTFRZJ2WlXvOi2bOPkuQj3H27E1c4JgLFNBgeRmL_A1_FZbtndhd01dVo7UEdBkzabz7LqDte_zS gGaPY.Z3alKyvJwToEOcQexGIb4jKr_cM6I1btgHnGQh6WLBjhDRPm5XYHYukcAr5Q1xI8q.By48 mrv_foeco1NaXFKSEc8FfYo2LqvZiZrrOCw5euJuRSL2ovxcn73d60GTBsu3Kk7U8Z_52hno1I3Z ncFn_bEx8AQCQ.bqoaj94Lcu.1K2vJg5Lpv240s4QDLE7VTc.alJLfpY5aAR5KFRjNjjhaWbMKZh 1qS0ViXc2PyHuTFIaJ_wACISwhRRAOl9MZ4K1NVUfU8tnsk.aWgqHj5VRkPSMbaugri.nOnq458R o8NaW8P5M_uq0O8PS4zEvQ3AesMwyLBIpXyjNXpEcVk3Rr1MMA4N3ASUjPblKXdmbP88oPyNRz1V Ado.KgFXu_P6ew_VXCVyPfGfJrGmlPJjluzpJLKSRm.7sfTkC8VoZ05QTBFKb.a2aWwzLj2IZuwq k.qJqy8aZyOVQrw3OGZLkXbtzyT1aEvY3W45lQcvVJIdnRtef0X8uQ5qsyTUc6jdNqq5rLV0LZze anbiYYpME_jviwwwCRBhrdRIM1Z1u5vreTmOFegwIx_UQeTLtE0DA.auta9VAQPuu52SSB1expaL 8WAT8TT8QDpjwdm9Gt1GI1R_qrlpWoDiZ21ro5iVxSgNUVJ8ZKQSgFtEjFIIqZrIzxXRnIN.7HHj Q.6vHQNMUU6huSqw2_ao3VlEaihGHpsMb20KDzuIVjHI4rB.n3o7TmOm1QMz.6uf3D7O.T.WP8gC E5rtoD7DCOAbodxHSrOGxHsWvvN_k956QsMxChQZrltvcdY.iuHxMISoYDtjT9573ux9uLXpo0IA SXEJQA2mtvHAu4jv5OO73b6kpNOL5Wy4e1X2fd6YFG52BmeDcTPh6i_bJyp3GRodA5qZB_WKAfeG Z3NDgY_ScIP4yh6i2526Tc6SxbjmG5Lqn_dqyoYiF5oacBXERr66K2xIBBbJkfuHQ5j_AcRIHFG6 ticflHIPgWLg6xXFkLs1jGBjnURLoatUutaI_y2rAPBCoW6yJfRcQ6BeFbrpPU2YvQdUKV7_wZj0 xTAjWKARYhevyU9JZAu4bfBiblUpwmculA2ho_z7vlq5KFYu_mRco9krXXwzwjHdCF9ztOck21_z yNtpgqXsNzZ7VQnl7oPGkjzQ6w02pqTPwEP.Tq5G0WGVRoLTKIEcnA..yVodrUzN146y1tUSrPCM AgWa8xbtb6QgPng.AJPp7_8BKJTIsIHfLuvFYWfPOJRk2JZDh4oTQfHOmsOWqbHv2PR8Os_h381b .y2MOUfR3PMIR5VMN3keqLJ9hjfU.fLJ4eF7KnrVHuL65.oQW.bwetshBXDXFBkR9L82z5xv_Q._ gOvYRBFeDSpXdkiJkfJicpFNrTvL1ufpIwkTcuXpGRA4fBMJKjVoYXxU7kuLJc16KboZ0JhQUVHT jdQUSF5zv4oL1sZFMV7fsDXjRshsVyYWlJ1P2B40GPtbbKy3xRQDrO9RZZcbDnC17qTTMGWE_jqB PCAvBakCFww2I3ITcshRJUQnZ.zJUzAgqZj8BStBd_bPAztsZnCuA4Lk3ZCam9Yzo2yIkB27Qg31 Rdzd_UY7p6Ib5oHXkPUTjuKeP730dPNu5WmoHLq3lbyUSuX7iwzBTuG0jBsaWOzL7uYcXBRrf.WG 5YaPJsuNsF3iG2j1n5murSAPSfas6J092uZuByI0vQHORQkh_iglJDHIwNIk7JHG3PeDkBf537VW RTZ6CZuHGpoCgUuOFLXzl_QC58.iEZmauxVlY7fO79cuq4mBTiFb0M0kwgNpnotYGUWkVPBME1M0 E8Ts90Qt1NQfaUokQfeWE7H9l.QCa6_XU80tmo3.ApqpvHpkHQ03LxtzogmVcDzZ_sMRTwdOTPRY V_2EyRLYgb_g9uFCG.KNZeCQ7qCLM3O8CKAJNzkkKtCNKFBfQZ9WcgYtut8q03TVHFpSqv0zpgAS LqOFr_w_WwFFKpJCYMLewTk9hpdEtG_DYPvfpqspJ8_ddqWRYPawvux2HSO6ESA8Nmb_eCstHJy7 hp3fe0Q0D_C1Lj_Rrpn9TIqXkeFzj.zcGfOE1aw-- X-Sonic-MF: Received: from sonic.gate.mail.ne1.yahoo.com by sonic304.consmr.mail.ir2.yahoo.com with HTTP; Sat, 10 Dec 2022 16:22:13 +0000 Received: by hermes--production-ir2-5795fc58c8-xpjmk (Yahoo Inc. Hermes SMTP Server) with ESMTPA ID 3d85437d5a35860ed1c98bc98c221dd7; Sat, 10 Dec 2022 16:22:12 +0000 (UTC) To: gdb-patches@sourceware.org Subject: [PATCH 2/3] Move return_value_info and refactor code setting its members Date: Sat, 10 Dec 2022 17:23:25 +0100 Message-Id: <20221210162326.854-2-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=-10.5 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, 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" This moves the function and return_buf members from finish_command_fsm to return_value_info, and refactors the code setting its members into functions get_callee_info and get_return_value_info. And all of that is moved before step_command_fsm, since it will use them in the next patch. --- gdb/infcmd.c | 157 ++++++++++++++++++++++++++++----------------------- 1 file changed, 86 insertions(+), 71 deletions(-) diff --git a/gdb/infcmd.c b/gdb/infcmd.c index a5fcf2f8ea5..9c96d9a39ee 100644 --- a/gdb/infcmd.c +++ b/gdb/infcmd.c @@ -800,6 +800,86 @@ nexti_command (const char *count_string, int from_tty) step_1 (1, 1, count_string); } +/* The captured function return value/type and its position in the + value history. */ + +struct return_value_info +{ + /* The function that we're stepping out of. */ + struct symbol *function; + + /* If the current function uses the "struct return convention", + this holds the address at which the value being returned will + be stored, or zero if that address could not be determined or + the "struct return convention" is not being used. */ + CORE_ADDR return_buf; + + /* The captured return value. May be NULL if we weren't able to + retrieve it. See get_return_value. */ + struct value *value; + + /* The return type. In some cases, we'll not be able extract the + return value, but we always know the type. */ + struct type *type; + + /* If we captured a value, this is the value history index. */ + int value_history_index; +}; + +/* Get calle function symbol and return convention. */ + +static void +get_callee_info (return_value_info *rv, frame_info_ptr frame) +{ + rv->function = find_pc_function (get_frame_pc (frame)); + + /* Determine the return convention. If it is RETURN_VALUE_STRUCT_CONVENTION, + attempt to determine the address of the return buffer. */ + if (rv->function != nullptr) + { + enum return_value_convention return_value; + struct gdbarch *gdbarch = get_frame_arch (frame); + + struct type * val_type + = check_typedef (rv->function->type ()->target_type ()); + + return_value = gdbarch_return_value + (gdbarch, read_var_value (rv->function, nullptr, frame), + val_type, nullptr, nullptr, nullptr); + + if (return_value == RETURN_VALUE_STRUCT_CONVENTION + && val_type->code () != TYPE_CODE_VOID) + rv->return_buf + = gdbarch_get_return_buf_addr (gdbarch, val_type, frame); + } +} + +/* Get return value and add it to value history. */ + +static void +get_return_value_info (return_value_info *rv) +{ + rv->type = rv->function->type ()->target_type (); + if (rv->type == nullptr) + internal_error (_("finish_command: function has no target type")); + + if (check_typedef (rv->type)->code () != TYPE_CODE_VOID) + { + struct value *func; + + func = read_var_value (rv->function, nullptr, get_current_frame ()); + + if (rv->return_buf != 0) + /* Retrieve return value from the buffer where it was saved. */ + rv->value = value_at (rv->type, rv->return_buf); + else + rv->value = get_return_value (rv->function, func); + + if (rv->value != nullptr) + rv->value_history_index = record_latest_value (rv->value); + } +} + /* Data for the FSM that manages the step/next/stepi/nexti commands. */ @@ -1517,23 +1597,6 @@ get_return_value (struct symbol *func_symbol, struct value *function) return value; } -/* The captured function return value/type and its position in the - value history. */ - -struct return_value_info -{ - /* The captured return value. May be NULL if we weren't able to - retrieve it. See get_return_value. */ - struct value *value; - - /* The return type. In some cases, we'll not be able extract the - return value, but we always know the type. */ - struct type *type; - - /* If we captured a value, this is the value history index. */ - int value_history_index; -}; - /* Helper for print_return_value. */ static void @@ -1603,19 +1666,10 @@ struct finish_command_fsm : public thread_fsm the caller. */ breakpoint_up breakpoint; - /* The function that we're stepping out of. */ - struct symbol *function = nullptr; - /* If the FSM finishes successfully, this stores the function's return value. */ struct return_value_info return_value_info {}; - /* If the current function uses the "struct return convention", - this holds the address at which the value being returned will - be stored, or zero if that address could not be determined or - the "struct return convention" is not being used. */ - CORE_ADDR return_buf; - explicit finish_command_fsm (struct interp *cmd_interp) : thread_fsm (cmd_interp) { @@ -1637,32 +1691,14 @@ finish_command_fsm::should_stop (struct thread_info *tp) { struct return_value_info *rv = &return_value_info; - if (function != nullptr + if (rv->function != nullptr && bpstat_find_breakpoint (tp->control.stop_bpstat, breakpoint.get ()) != nullptr) { /* We're done. */ set_finished (); - rv->type = function->type ()->target_type (); - if (rv->type == nullptr) - internal_error (_("finish_command: function has no target type")); - - if (check_typedef (rv->type)->code () != TYPE_CODE_VOID) - { - struct value *func; - - func = read_var_value (function, nullptr, get_current_frame ()); - - if (return_buf != 0) - /* Retrieve return value from the buffer where it was saved. */ - rv->value = value_at (rv->type, return_buf); - else - rv->value = get_return_value (function, func); - - if (rv->value != nullptr) - rv->value_history_index = record_latest_value (rv->value); - } + get_return_value_info (rv); } else if (tp->control.stop_step) { @@ -1876,29 +1912,7 @@ finish_command (const char *arg, int from_tty) /* Find the function we will return from. */ frame_info_ptr callee_frame = get_selected_frame (nullptr); - sm->function = find_pc_function (get_frame_pc (callee_frame)); - sm->return_buf = 0; /* Initialize buffer address is not available. */ - - /* Determine the return convention. If it is RETURN_VALUE_STRUCT_CONVENTION, - attempt to determine the address of the return buffer. */ - if (sm->function != nullptr) - { - enum return_value_convention return_value; - struct gdbarch *gdbarch = get_frame_arch (callee_frame); - - struct type * val_type - = check_typedef (sm->function->type ()->target_type ()); - - return_value = gdbarch_return_value (gdbarch, - read_var_value (sm->function, nullptr, - callee_frame), - val_type, nullptr, nullptr, nullptr); - - if (return_value == RETURN_VALUE_STRUCT_CONVENTION - && val_type->code () != TYPE_CODE_VOID) - sm->return_buf = gdbarch_get_return_buf_addr (gdbarch, val_type, - callee_frame); - } + get_callee_info (&sm->return_value_info, callee_frame); /* Print info on the selected frame, including level number but not source. */ @@ -1908,10 +1922,11 @@ finish_command (const char *arg, int from_tty) gdb_printf (_("Run back to call of ")); else { - if (sm->function != nullptr && TYPE_NO_RETURN (sm->function->type ()) + if (sm->return_value_info.function != nullptr + && TYPE_NO_RETURN (sm->return_value_info.function->type ()) && !query (_("warning: Function %s does not return normally.\n" "Try to finish anyway? "), - sm->function->print_name ())) + sm->return_value_info.function->print_name ())) error (_("Not confirmed.")); gdb_printf (_("Run till exit from ")); } 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