Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Christina Joos <christina.joos@intel.com>
To: gdb-patches@sourceware.org
Cc: thiago.bauermann@linaro.org, tom@tromey.com, luis.machado.foss@gmail.com
Subject: [PATCH v5 07/13] gdb: Refactor 'stack.c:print_frame_info'.
Date: Thu, 24 Sep 2026 10:33:04 +0200	[thread overview]
Message-ID: <20260924083311.1961530-8-christina.joos@intel.com> (raw)
In-Reply-To: <20260924083311.1961530-1-christina.joos@intel.com>

This patch restructures the 'stack.c:print_frame_info' function by
introducing two new functions in stack.c.  The new functions
will also be called in a later patch "gdb: Implement 'bt shadow'
subcommand to print the shadow stack backtrace."

Approved-By: Tom Tromey <tom@tromey.com>
---
 gdb/stack.c | 156 +++++++++++++++++++++++++++++++---------------------
 1 file changed, 93 insertions(+), 63 deletions(-)

diff --git a/gdb/stack.c b/gdb/stack.c
index 958db4dfe12..fda20904029 100644
--- a/gdb/stack.c
+++ b/gdb/stack.c
@@ -996,6 +996,86 @@ get_user_print_what_frame_info (std::optional<enum print_what> *what)
 	(user_frame_print_options.print_frame_info);
 }
 
+/* Return true if PRINT_WHAT is configured to print the location of a
+   frame.  */
+
+static bool
+should_print_location (print_what print_what)
+{
+  return (print_what == LOCATION
+	  || print_what == SRC_AND_LOC
+	  || print_what == LOC_AND_ADDRESS
+	  || print_what == SHORT_LOCATION);
+}
+
+/* Print the source information for PC and SAL to UIOUT.  Based on the
+   user-defined configuration disassemble-next-line, display disassembly
+   of the next source line, in addition to displaying the source line
+   itself.  Print annotations describing source file and and line number
+   based on MID_STATEMENT information.  If SHOW_ADDRESS is true, print the
+   program counter PC including, if non-empty, PC_ADDRESS_FLAGS.  */
+
+static void
+print_source (ui_out *uiout, gdbarch *gdbarch, CORE_ADDR pc,
+	      symtab_and_line sal, bool show_address, int mid_statement,
+	      const std::string &pc_address_flags)
+{
+  if (sal.symtab == nullptr)
+    {
+      /* If disassemble-next-line is set to auto or on and doesn't have
+	 the line debug messages for $pc, output the next instruction.  */
+      if (disassemble_next_line == AUTO_BOOLEAN_AUTO
+	  || disassemble_next_line == AUTO_BOOLEAN_TRUE)
+	do_gdb_disassembly (gdbarch, 1, pc, pc + 1);
+
+      /* If we do not have symtab information, we cannot print any source
+	 line and must return here.  */
+      return;
+    }
+
+  if (annotation_level > 0
+      && annotate_source_line (sal.symtab, sal.line, mid_statement, pc))
+    {
+      /* The call to ANNOTATE_SOURCE_LINE already printed the annotation
+	 for this source line, so we avoid the two cases below and do not
+	 print the actual source line.  The documentation for annotations
+	 makes it clear that the source line annotation is printed
+	 __instead__ of printing the source line, not as well as.
+
+	 However, if we fail to print the source line, which usually means
+	 either the source file is missing, or the requested line is out
+	 of range of the file, then we don't print the source annotation,
+	 and will pass through the "normal" print source line code below,
+	 the expectation is that this code will print an appropriate
+	 error.  */
+    }
+  else if (deprecated_print_frame_info_listing_hook)
+    deprecated_print_frame_info_listing_hook (sal.symtab, sal.line,
+					      sal.line + 1, 0);
+  else
+    {
+      /* We used to do this earlier, but that is clearly wrong.  This
+	 function is used by many different parts of gdb, including
+	 normal_stop in infrun.c, which uses this to print out the current
+	 PC when we stepi/nexti into the middle of a source line.  Only
+	 the command line really wants this behavior.  Other UIs probably
+	 would like the ability to decide for themselves if it is
+	 desired.  */
+      if (show_address)
+	{
+	  print_pc (uiout, gdbarch, pc_address_flags, pc);
+	  uiout->text ("\t");
+	}
+
+      print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
+    }
+
+    /* If disassemble-next-line is set to on and there is line debug
+       messages, output assembly codes for next line.  */
+    if (disassemble_next_line == AUTO_BOOLEAN_TRUE)
+      do_gdb_disassembly (gdbarch, -1, sal.pc, sal.end);
+}
+
 /* Print information about frame FRAME.  The output is format according
    to PRINT_LEVEL and PRINT_WHAT and PRINT_ARGS.  For the meaning of
    PRINT_WHAT, see enum print_what comments in frame.h.
@@ -1012,8 +1092,6 @@ do_print_frame_info (struct ui_out *uiout, const frame_print_options &fp_opts,
 		     int set_current_sal)
 {
   struct gdbarch *gdbarch = get_frame_arch (frame);
-  int source_print;
-  int location_print;
 
   if (!current_uiout->is_mi_like_p ()
       && fp_opts.print_frame_info != print_frame_info_auto)
@@ -1084,73 +1162,25 @@ do_print_frame_info (struct ui_out *uiout, const frame_print_options &fp_opts,
      to get the line containing FRAME->pc.  */
   symtab_and_line sal = find_frame_sal (frame);
 
-  location_print = (print_what == LOCATION
-		    || print_what == SRC_AND_LOC
-		    || print_what == LOC_AND_ADDRESS
-		    || print_what == SHORT_LOCATION);
-  if (location_print || !sal.symtab)
-    print_frame (uiout, fp_opts, frame, print_level,
-		 print_what, print_args, sal);
-
-  source_print = (print_what == SRC_LINE || print_what == SRC_AND_LOC);
+  if (should_print_location (print_what) || sal.symtab == nullptr)
+    print_frame (uiout, fp_opts, frame, print_level, print_what,
+		 print_args, sal);
 
-  /* If disassemble-next-line is set to auto or on and doesn't have
-     the line debug messages for $pc, output the next instruction.  */
-  if ((disassemble_next_line == AUTO_BOOLEAN_AUTO
-       || disassemble_next_line == AUTO_BOOLEAN_TRUE)
-      && source_print && !sal.symtab)
-    do_gdb_disassembly (get_frame_arch (frame), 1,
-			get_frame_pc (frame), get_frame_pc (frame) + 1);
-
-  if (source_print && sal.symtab)
+  if (print_what == SRC_LINE || print_what == SRC_AND_LOC)
     {
       int mid_statement = ((print_what == SRC_LINE)
 			   && frame_show_address (frame, sal));
-      if (annotation_level > 0
-	  && annotate_source_line (sal.symtab, sal.line, mid_statement,
-				   get_frame_pc (frame)))
-	{
-	  /* The call to ANNOTATE_SOURCE_LINE already printed the
-	     annotation for this source line, so we avoid the two cases
-	     below and do not print the actual source line.  The
-	     documentation for annotations makes it clear that the source
-	     line annotation is printed __instead__ of printing the source
-	     line, not as well as.
-
-	     However, if we fail to print the source line, which usually
-	     means either the source file is missing, or the requested
-	     line is out of range of the file, then we don't print the
-	     source annotation, and will pass through the "normal" print
-	     source line code below, the expectation is that this code
-	     will print an appropriate error.  */
-	}
-      else if (deprecated_print_frame_info_listing_hook)
-	deprecated_print_frame_info_listing_hook (sal.symtab, sal.line,
-						  sal.line + 1, 0);
-      else
-	{
-	  const value_print_options &opts = get_user_print_options ();
-	  /* We used to do this earlier, but that is clearly
-	     wrong.  This function is used by many different
-	     parts of gdb, including normal_stop in infrun.c,
-	     which uses this to print out the current PC
-	     when we stepi/nexti into the middle of a source
-	     line.  Only the command line really wants this
-	     behavior.  Other UIs probably would like the
-	     ability to decide for themselves if it is desired.  */
-	  if (opts.addressprint && mid_statement)
-	    {
-	      print_pc (uiout, gdbarch, frame, get_frame_pc (frame));
-	      uiout->text ("\t");
-	    }
 
-	  print_source_lines (sal.symtab, sal.line, sal.line + 1, 0);
-	}
+      const value_print_options &opts = get_user_print_options ();
+
+      const bool print_address = opts.addressprint && mid_statement;
+
+      std::string pc_address_flags
+	= gdbarch_get_pc_address_flags (gdbarch, frame, get_frame_pc (frame));
+
+      print_source (uiout, gdbarch, get_frame_pc (frame), sal,
+		    print_address, mid_statement, pc_address_flags);
 
-      /* If disassemble-next-line is set to on and there is line debug
-	 messages, output assembly codes for next line.  */
-      if (disassemble_next_line == AUTO_BOOLEAN_TRUE)
-	do_gdb_disassembly (get_frame_arch (frame), -1, sal.pc, sal.end);
     }
 
   if (set_current_sal)
-- 
2.53.0

________________________________________
Intel Deutschland GmbH 

Registered Address: Dornacher Strasse 1, 85622 Feldkirchen, Germany 

Tel: +49 (89) 99143-0 

www.intel.de 

Managing Directors: Candice Moore, Jeffrey Schneiderman, Ramachandran Sitaraman

Chairperson of the Supervisory Board: Sonja Pierer

Registered Seat: Munich Commercial Register B: Amtsgericht Munich HRB 186928

This e-mail and any attachments may contain confidential material for
the sole use of the intended recipient(s). Any review or distribution
by others is strictly prohibited. If you are not the intended
recipient, please contact the sender and delete all copies.


  parent reply	other threads:[~2026-09-24  8:36 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-09-24  8:32 [PATCH v5 00/13] Add new command to print the shadow stack backtrace Christina Joos
2026-09-24  8:32 ` [PATCH v5 01/13] gdb: Generalize handling of the shadow stack pointer Christina Joos
2026-09-24 21:03   ` Thiago Jung Bauermann
2026-09-24  8:32 ` [PATCH v5 02/13] aarch64: Implement gdbarch function top_addr_empty_shadow_stack Christina Joos
2026-09-24 21:04   ` Thiago Jung Bauermann
2026-09-24  8:33 ` [PATCH v5 03/13] gdb: Add get_main_func_start_pc to refactor frame.c:inside_main_func Christina Joos
2026-09-24  8:33 ` [PATCH v5 04/13] gdb: Refactor 'stack.c:print_frame' Christina Joos
2026-09-24  8:33 ` [PATCH v5 05/13] gdb: Introduce 'stack.c:print_pc' function without frame argument Christina Joos
2026-09-24  8:33 ` [PATCH v5 06/13] gdb: Refactor 'find_symbol_funname' and 'info_frame_command_core' in stack.c Christina Joos
2026-09-24  8:33 ` Christina Joos [this message]
2026-09-24  8:33 ` [PATCH v5 08/13] gdb: Add command option 'bt -shadow' to print the shadow stack backtrace Christina Joos
2026-09-24  9:37   ` Eli Zaretskii
2026-09-24  8:33 ` [PATCH v5 09/13] gdb: Provide gdbarch hook to distinguish shadow stack backtrace elements Christina Joos
2026-09-24  9:29   ` Eli Zaretskii
2026-09-24 13:10     ` Joos, Christina
2026-09-24  8:33 ` [PATCH v5 10/13] gdb: Implement the hook 'is_no_return_shadow_stack_address' for amd64 linux Christina Joos
2026-09-24  8:33 ` [PATCH v5 11/13] gdb: Enable inferior calls in the shadow stack backtrace Christina Joos
2026-09-24  8:33 ` [PATCH v5 12/13] gdb: Enable signal trampolines " Christina Joos
2026-09-24  8:33 ` [PATCH v5 13/13] gdb, mi: Add -shadow-stack-list-frames command Christina Joos
2026-09-24  9:39   ` Eli Zaretskii

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=20260924083311.1961530-8-christina.joos@intel.com \
    --to=christina.joos@intel.com \
    --cc=gdb-patches@sourceware.org \
    --cc=luis.machado.foss@gmail.com \
    --cc=thiago.bauermann@linaro.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