From patchwork Mon Aug 3 19:34:48 2026 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ijaz, Abdul B" X-Patchwork-Id: 140535 Return-Path: X-Original-To: patchwork@sourceware.org Delivered-To: patchwork@sourceware.org Received: from vm01.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 5F62C4BB3BF1 for ; Mon, 3 Aug 2026 19:37:12 +0000 (GMT) X-Original-To: gdb-patches@sourceware.org Delivered-To: gdb-patches@sourceware.org Received: from mgamail.intel.com (mgamail.intel.com [198.175.65.14]) by sourceware.org (Postfix) with ESMTPS id 4F0524BB1C3D for ; Mon, 3 Aug 2026 19:37:00 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 4F0524BB1C3D Authentication-Results: sourceware.org; dmarc=pass (p=none dis=none) header.from=intel.com Authentication-Results: sourceware.org; spf=pass smtp.mailfrom=intel.com ARC-Filter: OpenARC Filter v1.0.0 sourceware.org 4F0524BB1C3D Authentication-Results: sourceware.org; arc=none smtp.remote-ip=198.175.65.14 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785785820; cv=none; b=YH/yJjp5fjhqfNugenRO2+Xt1n/L9d9Hab73lUy6grlq2xZyW237eHh4sHbTHkD91zNrEoF513SQ+zgeKyIesplNC/iaP0Caayb6FmOHxydX5ISnLABq1uINEnrBaDSrC2d4nle95k0lDeWz38rkzZsBWEAjeXUkEdkN8JCJROo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1785785820; c=relaxed/simple; bh=7XJAvTrFrkqfMet6bw2cauptG7DW2U1pRUDrdVAixhQ=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=gbzZHBKg9futOpTRPx8tKGiO5ufCQ27fUSZjm4JECPmS0N3R+cNT+uVWuApdm0Fn/0QdykD8L7L8FFOjqQvbLKnn/NndlS/Z39+PAwxhvWltlPyrohUHBH5dswSHsxGGiYJtxUKDx/+ar8Q2A8r9c2x+yzLW0hgAIETr9uEu0Cw= ARC-Authentication-Results: i=1; sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=d7coDj/i DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 4F0524BB1C3D Authentication-Results: sourceware.org; dkim=pass (2048-bit key, unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=d7coDj/i DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1785785820; x=1817321820; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=7XJAvTrFrkqfMet6bw2cauptG7DW2U1pRUDrdVAixhQ=; b=d7coDj/ig4oL/8hkKX6OA9+B+vxd8kZFdtI5S6JStTVvpHm7nRjJ2r3S UGg8iwkU4ukOa+EN/Z4LpuOnfEMEnv+j0Yx/qDd3kdmB9NwAxeQ/1CT5k Qz3FZZDYHvPWTIICY68dYwAPopUTrpsTRf7LWArh5ANMMSMz3VGUgs0KB O1Q0jkXAXcrir8gV+jCpQskysCDAoWIDAkuu0XD/q2UvW/IpViWrD7xbw UnVGW0p+TPFCLd1SgaFG681ZmwHxvYv/l08e6h/FZyWbVxcLMMujwzAwv 9iVUlVnFAalfgA5Ad3vpZxNQDWwJHyqih8BcwDO+OXY0MKCDsYjFJk0ri Q==; X-CSE-ConnectionGUID: hlphv9u3RQyOiRPE9ZpVHA== X-CSE-MsgGUID: whv39AtsTkOHq0+9FHOWBg== X-IronPort-AV: E=McAfee;i="6800,10657,11864"; a="90218589" X-IronPort-AV: E=Sophos;i="6.25,203,1779174000"; d="scan'208";a="90218589" Received: from fmviesa005.fm.intel.com ([10.60.135.145]) by orvoesa106.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2026 12:36:36 -0700 X-CSE-ConnectionGUID: LX2WkBS+TUi5VABEmaZ+Dg== X-CSE-MsgGUID: jZl06nHDQa+mVIwdmLAJnw== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.25,203,1779174000"; d="scan'208";a="266425978" Received: from fdaddami-mobl1.amr.corp.intel.com (HELO localhost) ([10.245.115.173]) by fmviesa005-auth.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 03 Aug 2026 12:36:18 -0700 From: Abdul Basit Ijaz To: gdb-patches@sourceware.org Cc: abdul.b.ijaz@intel.com, JiniSusan.George@amd.com, tom@tromey.com, eliz@gnu.org Subject: [PATCH v11 09/10] gdb, mi: Skip trampoline functions for the -stack-list-arguments command. Date: Mon, 3 Aug 2026 21:34:48 +0200 Message-Id: <20260803193449.33375-10-abdul.b.ijaz@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20260803193449.33375-1-abdul.b.ijaz@intel.com> References: <20260803193449.33375-1-abdul.b.ijaz@intel.com> MIME-Version: 1.0 X-Spam-Status: No, score=-11.0 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, SPF_HELO_NONE, TXREP, T_SPF_TEMPERROR shortcircuit=no autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on sourceware.org X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces~patchwork=sourceware.org@sourceware.org This change skips trampoline functions for the '-stack-list-arguments' command when the option 'skip-trampoline-functions' is set to 'on'. Before this change, GDB prints the arguments of frames indicated by the compiler with DIE "DW_AT_trampoline" in the backtrace for the mi command stack-list-arguments, but for better user experience, all such frames can be hidden from the user. In this example the IFX compiler emits "DW_AT_trampoline" tag for the 'first' and 'second' trampoline functions like following: function second (x, y) result(z) integer, intent(in) :: x, y integer :: z z = x * y ! breakpt-args end function second function first (num1, num2) result(total) integer, intent(in) :: num1, num2 integer :: total total = second (num1 + 4, num2 * 3) ! first-breakpt total = total + 30 end function first Related Dwarf: 0x0000013f: DW_TAG_subprogram DW_AT_low_pc (0x0000000000404350) DW_AT_high_pc (0x000000000040435f) DW_AT_frame_base (DW_OP_reg6 RBP) DW_AT_linkage_name ("second_.t74p.t75p") DW_AT_name ("second_.t74p.t75p") DW_AT_trampoline ("second_") 0x0000015a: DW_TAG_subprogram DW_AT_low_pc (0x00000000004044a0) DW_AT_high_pc (0x00000000004044af) DW_AT_frame_base (DW_OP_reg6 RBP) DW_AT_linkage_name ("first_.t104p.t105p") DW_AT_name ("first_.t104p.t105p") DW_AT_trampoline ("first_") Before this change, the -stack-list-arguments' command output looks like: ''' (gdb) -stack-list-arguments 0 ^done, stack-args=[ frame={level="0",args=[name="x",name="y"]}, frame={level="1",args=[]}, frame={level="2",args=[name="num1",name="num2"]}, frame={level="3",args=[]}, frame={level="4",args=[]}] ''' After change: ''' (gdb) -stack-list-arguments 0 ^done, stack-args=[ frame={level="0",args=[name="x",name="y"]}, frame={level="1",args=[name="num1",name="num2"]}, frame={level="2",args=[]}] ''' The test gdb.mi/mi-func-treampoline is updated for testing the change. --- gdb/doc/gdb.texinfo | 3 +++ gdb/mi/mi-cmd-stack.c | 7 +++++++ gdb/testsuite/gdb.mi/mi-func-trampoline.exp | 13 ++++++++++--- 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index 684716a869e..99909984241 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -35815,6 +35815,9 @@ variable object is updated, @value{GDBN} makes sure that the thread/frame combination the variable object is bound to still exists, and re-evaluates the variable object in context of that thread/frame. +If the option @code{skip-trampoline-functions} is set, @value{GDBN} will +not show trampoline functions in the stack. + The following is the complete set of @sc{gdb/mi} operations defined to access this functionality: diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index 1f66c02f8b4..66c758bd44e 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -401,6 +401,13 @@ mi_cmd_stack_list_args (const char *command, const char *const *argv, int argc) i++, fi = get_prev_frame (fi)) { QUIT; + if (skip_trampoline_functions) + { + for (int j = 0; (SAFE_TRAMPOLINE_CHAIN (j, fi) + && in_trampoline_frame (fi)); ++j) + fi = get_prev_frame (fi); + } + ui_out_emit_tuple tuple_emitter (uiout, "frame"); uiout->field_signed ("level", i); list_args_or_locals (user_frame_print_options, diff --git a/gdb/testsuite/gdb.mi/mi-func-trampoline.exp b/gdb/testsuite/gdb.mi/mi-func-trampoline.exp index f40a9722f91..4e0c3922eb6 100644 --- a/gdb/testsuite/gdb.mi/mi-func-trampoline.exp +++ b/gdb/testsuite/gdb.mi/mi-func-trampoline.exp @@ -13,9 +13,9 @@ # You should have received a copy of the GNU General Public License # along with this program. If not, see . -# Test -stack-list-frames command for functions with trampoline -# calls. Also checks if trampoline frames are filtered while printing -# stack. +# Test -stack-list-frames and -stack-list-arguments command for functions +# with trampoline calls. Also checks if trampoline frames are filtered +# while printing stack. require allow_fortran_tests @@ -55,6 +55,10 @@ set frame1_regx "\{level=\"0\",addr=\"$hex\",func=\"second\",file=\".*func-tramp set frame2_regx "\{level=\"2\",addr=\"$hex\",func=\"first\",.*\}" set frame3_regx "\{level=\"4\",addr=\"$hex\",func=\"func_trampoline\",.*\}" +set arg1_regx "\{level=\"0\",args=\\\[name=\"x\",name=\"y\"\\\]\}" +set arg2_regx "\{level=\"1\",args=\\\[name=\"num1\",name=\"num2\"\\\]\}" +set arg3_regx "\{level=\"2\",args=\\\[\\\]\}" + # Set breakpoint inside the innermost function 'second'. mi_create_breakpoint "-t $srcfile:$inner_loc" \ "insert breakpoint at line $inner_loc " \ @@ -67,3 +71,6 @@ mi_expect_stop \ mi_gdb_test "100-stack-list-frames" \ "100\\^done,stack=\\\[frame=${frame1_regx},frame=${frame2_regx},frame=${frame3_regx}\\\]" + +mi_gdb_test "200-stack-list-arguments 0" \ + "200\\^done,stack-args=\\\[frame=${arg1_regx},frame=${arg2_regx},frame=${arg3_regx}\\\]"