From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id aPQdEstdBWbUdhkAWB0awg (envelope-from ) for ; Thu, 28 Mar 2024 08:08:43 -0400 Authentication-Results: simark.ca; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=NrHTVFYR; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id 44E1B1E0C0; Thu, 28 Mar 2024 08:08:43 -0400 (EDT) Received: from server2.sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (prime256v1) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 2FA211E030 for ; Thu, 28 Mar 2024 08:08:41 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BDAED385829B for ; Thu, 28 Mar 2024 12:08:40 +0000 (GMT) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.16]) by sourceware.org (Postfix) with ESMTPS id 3155B3858CDB for ; Thu, 28 Mar 2024 12:06:54 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org 3155B3858CDB 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 3155B3858CDB Authentication-Results: server2.sourceware.org; arc=none smtp.remote-ip=192.198.163.16 ARC-Seal: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711627630; cv=none; b=r+nDxA4fRKgsdOxqgI0Qno+E1QrWjcqMfnGDDQcec00wfUXA3hR+W0JBK/1S3iGJODSkIGqhEBDkoc3s/Jd5zlX9zjjH/Aup5I/I4Yo70R60bWKpOwwb0zIiC/wP/l9QRcQpUXNyqje9G37rjSxf1tKYFWWw5S9935JIK2sntpo= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711627630; c=relaxed/simple; bh=eRen82/tbgxApaSjQFena0M4eMtmguc8BShwdQl+kCc=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=En5oTgNx5hYlJGWlAznGft02/dEFMVZFhsq2RRbR0m12F/K/nc5/j6CnQoOycF9mbb8IofQjOnEDI9QyNOBn3YUVBsDiYzA4vB3XB0EsQUBMAUfQke5j/B4AXOE21OCg3fW67DRbW+abytDx5JMBRXRYhr7wkeo5Xkr7SMBRfVU= ARC-Authentication-Results: i=1; server2.sourceware.org DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1711627614; x=1743163614; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=eRen82/tbgxApaSjQFena0M4eMtmguc8BShwdQl+kCc=; b=NrHTVFYRiTgFG1wiLJJWgUTfFL/OeK32BG7rK/A3sx2ZhMrYUCPq2S2X Gw14himfzVPz6kUeU1Ta0ggQpDEpV7FubzWU/Zoc5FhGWDwD4qzV58Woq vAK74UWQB0fDj1CPxkmVITWjIxSH4w40ZW/cykpAW6GCUm/3nuCBoGnR+ CoqIRZbCERwmEFlp+EBMrX24XTV1XgqrRyAo5CwQtWPAC1mH5ILKzLV1m UwkTCkBJTLTziQwT1mONhm/r4SilxgaINxFue0BOuPdr3ZdvYmXRulE8A AgOKn3ahKvjWx4qyEcCqY1mKj1s0NQwl8MlptKpn2RR/W7k6ZG457xauS A==; X-CSE-ConnectionGUID: 6tEXn6EiRxSCR3H0znHa+A== X-CSE-MsgGUID: 0LqlQSdlQIeUd9dTTv9i1Q== X-IronPort-AV: E=McAfee;i="6600,9927,11026"; a="7374670" X-IronPort-AV: E=Sophos;i="6.07,161,1708416000"; d="scan'208";a="7374670" Received: from orviesa003.jf.intel.com ([10.64.159.143]) by fmvoesa110.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Mar 2024 05:06:52 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,161,1708416000"; d="scan'208";a="21277767" Received: from abijaz-mobl2.ger.corp.intel.com (HELO localhost) ([10.246.42.1]) by ORVIESA003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 28 Mar 2024 05:06:51 -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 v6 08/10] gdb, mi: Skip trampoline functions for the -stack-list-frames command. Date: Thu, 28 Mar 2024 13:05:26 +0100 Message-Id: <20240328120528.30382-9-abdul.b.ijaz@intel.com> X-Mailer: git-send-email 2.34.1 In-Reply-To: <20240328120528.30382-1-abdul.b.ijaz@intel.com> References: <20240328120528.30382-1-abdul.b.ijaz@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Spam-Status: No, score=-10.9 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, KAM_SHORT, RCVD_IN_DNSWL_LOW, SPF_HELO_NONE, SPF_NONE, 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.30 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org From: "Ijaz, Abdul B" This change skips trampoline functions for the '-stack-list-frames' command when the option 'skip-trampoline-functions' is set to 'on'. Before this change, GDB prints the frames indicated by the compiler with DIE "DW_AT_trampoline" in the backtrace for mi command stack-list-frames, 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-backtrace 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-frames' command output looks like: ''' (gdb) -stack-list-frames -stack-list-frames ^done, stack=[ frame={level="0",addr="0x0000000000405194",func="second", file="test.f90",fullname="/home/test.f90",line="4", arch="i386:x86-64"}, frame={level="1",addr="0x0000000000405209", func="second_.t74p.t75p", file="test.f90",fullname="/home/test.f90",line="12", arch="i386:x86-64"}, frame={level="2",addr="0x00000000004051e3",func="first", file="test.f90",fullname="/home/test.f90",line="10", arch="i386:x86-64"}, frame={level="3",addr="0x0000000000405309", func="first_.t95p.t96p",file="test.f90", fullname="/home/test.f90",line="21",arch="i386:x86-64"}, frame={level="4",addr="0x0000000000405234", func="func_trampoline",file="test.f90", fullname="/home/test.f90",line="17",arch="i386:x86-64"}] ''' After this change: ''' (gdb) -stack-list-frames -stack-list-frames ^done, stack=[frame={level="0",addr="0x0000000000405194",func="second", file="test.f90",fullname="/home/test.f90",line="4", arch="i386:x86-64"}, frame={level="2",addr="0x00000000004051e3",func="first", file="test.f90",fullname="/home/test.f90",line="10", arch="i386:x86-64"}, frame={level="4",addr="0x0000000000405234", func="func_trampoline",file="test.f90",fullname="/home/test.f90", line="17",arch="i386:x86-64"}] ''' New test gdb.mi/mi-func-trampoline.exp is added for testing the change. 2024-03-28 Ijaz, Abdul B --- gdb/doc/gdb.texinfo | 4 +- gdb/mi/mi-cmd-stack.c | 7 +++ gdb/testsuite/gdb.mi/mi-func-trampoline.exp | 68 +++++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 gdb/testsuite/gdb.mi/mi-func-trampoline.exp diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo index a6f74373dfe..90221e9b9c1 100644 --- a/gdb/doc/gdb.texinfo +++ b/gdb/doc/gdb.texinfo @@ -34866,7 +34866,9 @@ an error if @var{low-frame} is larger than the actual number of frames. On the other hand, @var{high-frame} may be larger than the actual number of frames, in which case only existing frames will be returned. If the option @code{--no-frame-filters} is supplied, then -Python frame filters will not be executed. +Python frame filters will not be executed. If the option +@code{skip-trampoline-functions} is set, @value{GDBN} will skip the trampoline +frames while printing a backtrace. @subsubheading @value{GDBN} Command diff --git a/gdb/mi/mi-cmd-stack.c b/gdb/mi/mi-cmd-stack.c index b78c169e70b..830edcb816e 100644 --- a/gdb/mi/mi-cmd-stack.c +++ b/gdb/mi/mi-cmd-stack.c @@ -177,6 +177,13 @@ mi_cmd_stack_list_frames (const char *command, const char *const *argv, 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); + } + /* Print the location and the address always, even for level 0. If args is 0, don't print the arguments. */ print_frame_info (user_frame_print_options, diff --git a/gdb/testsuite/gdb.mi/mi-func-trampoline.exp b/gdb/testsuite/gdb.mi/mi-func-trampoline.exp new file mode 100644 index 00000000000..34a2c464f21 --- /dev/null +++ b/gdb/testsuite/gdb.mi/mi-func-trampoline.exp @@ -0,0 +1,68 @@ +# Copyright 2024 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 . + +# Test -stack-list-frames command for functions with trampoline +# calls. Also checks if trampoline frames are filtered while printing +# stack. + +require allow_fortran_tests + +if {![test_compiler_info {ifx-*} f90]} { + untested "This test is only applicable for IFX, which emits the\ + trampoline DIE in Dwarf." + return -1 +} + +load_lib fortran.exp +load_lib mi-support.exp + +set MIFLAGS "-i=mi" + +if {[mi_clean_restart]} { + return +} + +set testfile mi-func-trampoline +set srcfile "${srcdir}/gdb.fortran/func-trampoline.f90" +set binfile [standard_output_file $testfile] + +if { [gdb_compile "${srcfile}" "${binfile}" executable \ + {debug f90} ] != "" } { + untested "failed to compile" + return -1 +} + +mi_delete_breakpoints +mi_gdb_reinitialize_dir $srcdir/$subdir +mi_gdb_load ${binfile} + +set inner_loc [gdb_get_line_number "second-breakpt"] +set fill "\[^\r\n\]*" + +set frame1_regx "\{level=\"0\",addr=\"$hex\",func=\"second\",file=\".*func-trampoline.f90\",fullname=\"${fullname_syntax}func-trampoline.f90\",line=\"$inner_loc\",arch=\".*\"\}" +set frame2_regx "\{level=\"2\",addr=\"$hex\",func=\"first\",.*\}" +set frame3_regx "\{level=\"4\",addr=\"$hex\",func=\"func_trampoline\",.*\}" + +# Set breakpoint inside the innermost function 'second'. +mi_create_breakpoint "-t $srcfile:$inner_loc" \ + "insert breakpoint at line $inner_loc " \ + -number 1 -disp del -func second ".*trampoline.f90" $inner_loc $hex +mi_run_cmd +mi_expect_stop \ + "breakpoint-hit" "second" ".*" ".*trampoline.f90" "\[0-9\]+" { "" "disp=\"del\"" } \ + "run to breakpoint at line $inner_loc" + +mi_gdb_test "100-stack-list-frames" \ + "100\\^done,stack=\\\[frame=${frame1_regx},frame=${frame2_regx},frame=${frame3_regx}\\\]" -- 2.34.1 Intel Deutschland GmbH Registered Address: Am Campeon 10, 85579 Neubiberg, Germany Tel: +49 89 99 8853-0, www.intel.de Managing Directors: Christin Eisenschmid, Sharon Heck, Tiffany Doon Silva Chairperson of the Supervisory Board: Nicole Lau Registered Office: Munich Commercial Register: Amtsgericht Muenchen HRB 186928