From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id GP6LNQVeBWbUdhkAWB0awg (envelope-from ) for ; Thu, 28 Mar 2024 08:09:41 -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=Nutpdsc3; dkim-atps=neutral Received: by simark.ca (Postfix, from userid 112) id D4D371E0C0; Thu, 28 Mar 2024 08:09:41 -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 BE5E01E0BB for ; Thu, 28 Mar 2024 08:09:39 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 79C133858C31 for ; Thu, 28 Mar 2024 12:09:39 +0000 (GMT) Received: from mgamail.intel.com (mgamail.intel.com [192.198.163.16]) by sourceware.org (Postfix) with ESMTPS id B75373858401 for ; Thu, 28 Mar 2024 12:07:12 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org B75373858401 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 B75373858401 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=1711627644; cv=none; b=DokNDGx15pFnRIbpAm+rfnvHqED5aSJCBqRoqmWTVPPT15TsCvOkLRcNJR1wv3lsD5wb/LZQNUCz3vGAyIXYpMHPFoQ3vkuiUrI4ajx/gffRh02VXHUt6dUyYw1e89eJeb4ZiDEge6/4LbDebA5LDHTXMfOKb7VdXDZoEfc9vH4= ARC-Message-Signature: i=1; a=rsa-sha256; d=sourceware.org; s=key; t=1711627644; c=relaxed/simple; bh=ODQItpvsoyKdq62Vj24ItRaJdGtS0OSYvRnyBdn65gk=; h=DKIM-Signature:From:To:Subject:Date:Message-Id:MIME-Version; b=lNfib+yaxQu3ow5RKwLbFmHLhSk+mWaa+bjpVMwESEoJ7BvHMsc8/R7JrejPjA1KDb0Lub6tTFLSy1UMJQFtBSQXrSGr3ymQKeSB+vtHb+Dw0CMoM1zew2Ecl0hxvNJ9NdqaYHGFyTWgOfiftQrvFaPv8xZQ6qwHFr9fzaa81BQ= 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=1711627632; x=1743163632; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=ODQItpvsoyKdq62Vj24ItRaJdGtS0OSYvRnyBdn65gk=; b=Nutpdsc3xSfsFIR83DLZv/gLhm64NjBw2aNHHDY4dexoof5d8oG60wnS yaPPPzd8PoHc+LqR5ryqdiG+OIVXHq3OOStti2QFSyUDIrfyWp2y5gNMd x7V4tcyQGInsVHpneY+AwvecTLjQhtKLltXoN8T6yacjA76oTo+kDlkha /SfDm4YGytYij3lxzvOrHCf0wieIdRs+Aq32OHZdCcjziwaOZ2GGDOK9B 1Shi5xUnSZLibsrFIs3ebur2SE/7zr+2ck55C3ixneCxWrMWLeRa2ajkv kWYt6iLX7wuyRrzBKyhG28wXi8TUpyP0hsQBxH7Svza2zFCH0JVmNuaDz Q==; X-CSE-ConnectionGUID: 49vCbOGmTFaDrpLm8UjhzA== X-CSE-MsgGUID: OLuJmZmzQGGex+6jeZlgPA== X-IronPort-AV: E=McAfee;i="6600,9927,11026"; a="7374706" X-IronPort-AV: E=Sophos;i="6.07,161,1708416000"; d="scan'208";a="7374706" 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:07:11 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="6.07,161,1708416000"; d="scan'208";a="21277872" 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:07:10 -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 10/10] gdb: Filter trampoline frames in backtrace when using Python frame-filters. Date: Thu, 28 Mar 2024 13:05:28 +0100 Message-Id: <20240328120528.30382-11-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=-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, 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" In case of the Python frame-filters, this change filters trampoline functions when the option 'skip-trampoline-functions' is set to 'on'. GDB recently added the option to hide frames that are marked by the compiler with "DW_AT_trampoline", see commit 'Skip trampoline frames for the backtrace command'. This implements the same functionality when python frame filters are in use. 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-framefilter 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_") Once frame filters are enabled the backtrace command output before this change looks like: ''' (gdb) info frame-filter global frame-filters: Priority Enabled Name 100 Yes TestTrampolineFrameFilter (gdb) backtrace 3 \#0 second (x=20, y=9) at test.f90:4 \#1 0x0000000000405209 in second_.t74p.t75p () at test.f90:12 \#2 0x00000000004051e3 in first (num1=16, num2=3) at test.f90:10 (gdb) backtrace -3 \#2 0x00000000004051e3 in first (num1=16, num2=3) at test.f90:10 \#3 0x0000000000405309 in first_.t95p.t96p () at test.f90:21 \#4 0x0000000000405234 in func_trampoline () at test.f90:17 ''' After this change: ''' (gdb) info frame-filter global frame-filters: Priority Enabled Name 100 Yes TestTrampolineFrameFilter (gdb) backtrace 3 \#0 second (x=20, y=9) at test.f90:4 \#2 0x00000000004051e3 in first (num1=16, num2=3) at test.f90:10 \#4 0x0000000000405234 in func_trampoline () at test.f90:17 (gdb) backtrace -3 \#2 0x00000000004051e3 in first (num1=16, num2=3) at test.f90:10 \#4 0x0000000000405234 in func_trampoline () at test.f90:17 ''' New test gdb.python/py-framefilter-trampoline.exp is added to test this change. 2024-03-28 Ijaz, Abdul B --- gdb/python/py-frame.c | 11 +++ .../gdb.python/py-framefilter-trampoline.exp | 77 +++++++++++++++++++ .../gdb.python/py-framefilter-trampoline.py | 31 ++++++++ 3 files changed, 119 insertions(+) create mode 100644 gdb/testsuite/gdb.python/py-framefilter-trampoline.exp create mode 100644 gdb/testsuite/gdb.python/py-framefilter-trampoline.py diff --git a/gdb/python/py-frame.c b/gdb/python/py-frame.c index bbb42afb2ed..5c07ba58b23 100644 --- a/gdb/python/py-frame.c +++ b/gdb/python/py-frame.c @@ -70,6 +70,17 @@ frame_object_to_frame_info (PyObject *obj) if (frame_obj->frame_id_is_next) frame = get_prev_frame (frame); + if (skip_trampoline_functions) + { + for (int i = 0; (SAFE_TRAMPOLINE_CHAIN (i, frame) + && in_trampoline_frame (frame)); ++i) + { + frame = get_prev_frame (frame); + if (frame == nullptr) + return nullptr; + } + } + return frame; } diff --git a/gdb/testsuite/gdb.python/py-framefilter-trampoline.exp b/gdb/testsuite/gdb.python/py-framefilter-trampoline.exp new file mode 100644 index 00000000000..76dbdaa970a --- /dev/null +++ b/gdb/testsuite/gdb.python/py-framefilter-trampoline.exp @@ -0,0 +1,77 @@ +# Copyright (C) 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 . + +# This file is part of the GDB testsuite. It tests skipping of trampolines +# in the backtrace command in case Python-based frame-filters are enabled. + +load_lib gdb-python.exp + +require allow_python_tests 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 + +set testfile py-framefilter-trampoline +set srcfile "${srcdir}/gdb.fortran/func-trampoline.f90" +set binfile [standard_output_file $testfile] + +if {[build_executable $testfile.exp $testfile $srcfile {debug f90}] == -1} { + return -1 +} + +# Start with a fresh gdb. +gdb_exit +gdb_start + +gdb_test "info frame-filter" \ + "No frame filters\\." \ + "info frame filter before loading filters" + +gdb_reinitialize_dir $srcdir/$subdir +gdb_load ${binfile} + +if {![runto_main]} { + return +} +gdb_test_no_output "set python print-stack full" \ + "set python print-stack to full" + +# Load frame-filters +set remote_python_file [gdb_remote_download host \ + ${srcdir}/${subdir}/${testfile}.py] +gdb_test_no_output "source ${remote_python_file}" "load python file" + +set inner_loc [gdb_get_line_number "second-breakpt"] +set middle_loc [gdb_get_line_number "first-breakpt"] +set outer_loc [gdb_get_line_number "main-outer-loc"] +set fill "\[^\r\n\]*" + +set inner_desc "second \\(x=20, y=9\\) at ${fill}$srcfile:$inner_loc" +set middle_desc "first \\(num1=16, num2=3\\) at ${fill}$srcfile:$middle_loc" +set outer_desc ".* at .*$srcfile:$outer_loc" + +# Set breakpoint inside the innermost function 'second'. +gdb_breakpoint "$srcfile:$inner_loc" +gdb_continue_to_breakpoint "innermost-body" ".*$srcfile:$inner_loc.*" + +# Test with frame filter. +gdb_test "bt" [multi_line \ + "#$decimal.* $middle_desc" \ + "#$decimal.* $outer_desc.*"] diff --git a/gdb/testsuite/gdb.python/py-framefilter-trampoline.py b/gdb/testsuite/gdb.python/py-framefilter-trampoline.py new file mode 100644 index 00000000000..0e9dfd7af2a --- /dev/null +++ b/gdb/testsuite/gdb.python/py-framefilter-trampoline.py @@ -0,0 +1,31 @@ +# Copyright (C) 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 . + +# This file is part of the GDB testsuite. It tests if trampolines are +# skipped when Python-based frame-filters are enabled. + +import gdb + +class TestTrampolineFrameFilter(): + def __init__(self): + self.name = "TestTrampolineFrameFilter" + self.priority = 100 + self.enabled = True + gdb.frame_filters[self.name] = self + + def filter(self, frame_iter): + return frame_iter + +TestTrampolineFrameFilter() -- 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