Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Abdul Basit Ijaz <abdul.b.ijaz@intel.com>
To: gdb-patches@sourceware.org
Cc: abdul.b.ijaz@intel.com, JiniSusan.George@amd.com, tom@tromey.com,
	eliz@gnu.org
Subject: [PATCH v6 09/10] gdb, mi: Skip trampoline functions for the -stack-list-arguments command.
Date: Thu, 28 Mar 2024 13:05:27 +0100	[thread overview]
Message-ID: <20240328120528.30382-10-abdul.b.ijaz@intel.com> (raw)
In-Reply-To: <20240328120528.30382-1-abdul.b.ijaz@intel.com>

From: "Ijaz, Abdul B" <abdul.b.ijaz@intel.com>

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.

2024-03-28 Ijaz, Abdul B <abdul.b.ijaz@intel.com>
---
 gdb/doc/gdb.texinfo                         |  4 ++++
 gdb/mi/mi-cmd-stack.c                       |  7 +++++++
 gdb/testsuite/gdb.mi/mi-func-trampoline.exp | 13 ++++++++++---
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 90221e9b9c1..6b2f40c906c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -35183,6 +35183,10 @@ 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 for the
+@code{-stack-list-arguments}, @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 830edcb816e..9b288c3fe03 100644
--- a/gdb/mi/mi-cmd-stack.c
+++ b/gdb/mi/mi-cmd-stack.c
@@ -404,6 +404,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 34a2c464f21..44daba74cde 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 <http://www.gnu.org/licenses/> .
 
-# 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 " \
@@ -66,3 +70,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}\\\]"
-- 
2.34.1

Intel Deutschland GmbH
Registered Address: Am Campeon 10, 85579 Neubiberg, Germany
Tel: +49 89 99 8853-0, www.intel.de <http://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


  parent reply	other threads:[~2024-03-28 12:09 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2024-03-28 12:05 [PATCH v6 00/10] GDB support for DW_AT_trampoline Abdul Basit Ijaz
2024-03-28 12:05 ` [PATCH v6 01/10] gdb, dwarf: add support for DW_AT_trampoline in DWARF reader Abdul Basit Ijaz
2024-03-28 12:05 ` [PATCH v6 02/10] gdb/symtab: add lookup for trampoline functions Abdul Basit Ijaz
2024-03-28 12:05 ` [PATCH v6 03/10] gdb: handle stepping through functions with DW_AT_trampoline Abdul Basit Ijaz
2024-03-28 13:58   ` Eli Zaretskii
2024-03-28 14:31     ` Ijaz, Abdul B
2024-03-28 12:05 ` [PATCH v6 04/10] gdb: Skip trampoline frames for the backtrace command Abdul Basit Ijaz
2024-03-28 12:05 ` [PATCH v6 05/10] gdb: Skip trampoline functions for the finish and reverse-finish commands Abdul Basit Ijaz
2024-03-28 13:59   ` Eli Zaretskii
2024-03-28 12:05 ` [PATCH v6 06/10] gdb: Skip trampoline functions for the up command Abdul Basit Ijaz
2024-03-28 14:01   ` Eli Zaretskii
2024-03-28 12:05 ` [PATCH v6 07/10] gdb: Skip trampoline functions for the return command Abdul Basit Ijaz
2024-03-28 14:01   ` Eli Zaretskii
2024-03-28 12:05 ` [PATCH v6 08/10] gdb, mi: Skip trampoline functions for the -stack-list-frames command Abdul Basit Ijaz
2024-03-28 14:02   ` Eli Zaretskii
2024-03-28 12:05 ` Abdul Basit Ijaz [this message]
2024-03-28 14:03   ` [PATCH v6 09/10] gdb, mi: Skip trampoline functions for the -stack-list-arguments command Eli Zaretskii
2024-03-28 12:05 ` [PATCH v6 10/10] gdb: Filter trampoline frames in backtrace when using Python frame-filters Abdul Basit Ijaz

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20240328120528.30382-10-abdul.b.ijaz@intel.com \
    --to=abdul.b.ijaz@intel.com \
    --cc=JiniSusan.George@amd.com \
    --cc=eliz@gnu.org \
    --cc=gdb-patches@sourceware.org \
    --cc=tom@tromey.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox