Mirror of the gdb-patches mailing list
 help / color / mirror / Atom feed
From: Zander Work <zdw@google.com>
To: gdb-patches@sourceware.org
Cc: guinevere@redhat.com, tom@tromey.com, Zander Work <zdw@google.com>
Subject: [PATCH v2] Use "output-radix" setting to format function offsets
Date: Mon, 11 May 2026 18:32:38 -0700	[thread overview]
Message-ID: <20260512013237.646630-2-zdw@google.com> (raw)
In-Reply-To: <350b3a8d-3174-4703-b532-4ba49fe5ea05@redhat.com>

Thank you for the review Guinevere! I fixed the formatting issue you
flagged, and added your review tag.

Global maintainers: I haven't done a FSF copyright assignment, please
let me know how I should do that.

Below is the full original patch context.

~~~~~

This is a patch for a discussion [1] I had previously where it was
determined that it was a bug for GDB to not use the "output-radix"
setting for function offsets.

This patch includes updates to the radix.exp tests, and I verified that
there were no new breakages added when running the full gdb testsuite
with this patch.

I didn't make any changes to NEWS or a /gdb/ Changelog entry for this,
if I should please let me know.

I also have not personally completed a FSF copyright assignment form.

Sample output with this patch:

```
(gdb) disas main
Dump of assembler code for function main:
   0x0000000000001149 <+0>:     endbr64
   0x000000000000114d <+4>:     push   %rbp
   0x000000000000114e <+5>:     mov    %rsp,%rbp
   0x0000000000001151 <+8>:     lea    0xeac(%rip),%rax        # 0x2004
   0x0000000000001158 <+15>:    mov    %rax,%rdi
   0x000000000000115b <+18>:    mov    $0x0,%eax
   0x0000000000001160 <+23>:    call   0x1050 <printf@plt>
   0x0000000000001165 <+28>:    mov    $0x0,%eax
   0x000000000000116a <+33>:    pop    %rbp
   0x000000000000116b <+34>:    ret
End of assembler dump.
(gdb) set radix 0x10
Input and output radices now set to decimal 16, hex 10, octal 20.
(gdb) disas main
Dump of assembler code for function main:
   0x0000000000001149 <+0x0>:   endbr64
   0x000000000000114d <+0x4>:   push   %rbp
   0x000000000000114e <+0x5>:   mov    %rsp,%rbp
   0x0000000000001151 <+0x8>:   lea    0xeac(%rip),%rax        # 0x2004
   0x0000000000001158 <+0xf>:   mov    %rax,%rdi
   0x000000000000115b <+0x12>:  mov    $0x0,%eax
   0x0000000000001160 <+0x17>:  call   0x1050 <printf@plt>
   0x0000000000001165 <+0x1c>:  mov    $0x0,%eax
   0x000000000000116a <+0x21>:  pop    %rbp
   0x000000000000116b <+0x22>:  ret
End of assembler dump.
```

[1] https://sourceware.org/pipermail/gdb/2026-April/052170.html

Reviewed-By: Guinevere Larsen <guinevere@redhat.com>
---
 gdb/disasm.c                     | 18 ++++++++++---
 gdb/printcmd.c                   |  2 +-
 gdb/testsuite/gdb.base/radix.c   | 35 ++++++++++++++++++++++++++
 gdb/testsuite/gdb.base/radix.exp | 43 ++++++++++++++++++++++++++++++++
 gdb/valprint.c                   | 13 ++++++++++
 gdb/valprint.h                   |  6 +++++
 6 files changed, 112 insertions(+), 5 deletions(-)
 create mode 100644 gdb/testsuite/gdb.base/radix.c

diff --git a/gdb/disasm.c b/gdb/disasm.c
index 81c466c188a..64a9289e070 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -375,10 +375,20 @@ gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn *insn
 	  m_uiout->field_string ("func-name", name,
 				 function_name_style.style ());
 	/* For negative offsets, avoid displaying them as +-N; the sign of
-	   the offset takes the place of the "+" here.  */
-	if (offset >= 0)
-	  m_uiout->text ("+");
-	m_uiout->field_signed ("offset", offset);
+	   the offset takes the place of the "+" here.  For MI consumers,
+           emit the integer value; otherwise, print the formatted offset based
+           on the current 'output-radix'.  */
+	if (m_uiout->is_mi_like_p ())
+	  {
+	    if (offset >= 0)
+	      m_uiout->text ("+");
+	    m_uiout->field_signed ("offset", offset);
+	  }
+	else
+	  {
+	    std::string s = format_pc_offset (offset);
+	    m_uiout->field_string ("offset", s.c_str ());
+	  }
 	m_uiout->text (">:\t");
       }
     else
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index ae498395436..5fb8c666447 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -567,7 +567,7 @@ print_address_symbolic (struct gdbarch *gdbarch, CORE_ADDR addr,
     gdb_puts ("<", stream);
   fputs_styled (name.c_str (), function_name_style.style (), stream);
   if (offset != 0)
-    gdb_printf (stream, "%+d", offset);
+    gdb_puts (format_pc_offset (offset).c_str (), stream);
 
   /* Append source filename and line number if desired.  Give specific
      line # of this addr, if we have it; else line # of the nearest symbol.  */
diff --git a/gdb/testsuite/gdb.base/radix.c b/gdb/testsuite/gdb.base/radix.c
new file mode 100644
index 00000000000..8a4d1287208
--- /dev/null
+++ b/gdb/testsuite/gdb.base/radix.c
@@ -0,0 +1,35 @@
+/* This testcase is part of GDB, the GNU debugger.
+
+   Copyright 2026 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 <http://www.gnu.org/licenses/>.  */
+
+#include <unistd.h>
+#include <stdio.h>
+
+static int v;
+
+int
+main (void)
+{
+  v = 0;
+
+  puts ("hello world");
+
+  printf ("this is another string\n");
+
+  v += 3;
+
+  return v;
+}
diff --git a/gdb/testsuite/gdb.base/radix.exp b/gdb/testsuite/gdb.base/radix.exp
index 7a4320bbf36..4b8e2d74b49 100644
--- a/gdb/testsuite/gdb.base/radix.exp
+++ b/gdb/testsuite/gdb.base/radix.exp
@@ -17,6 +17,11 @@
 # This file was written by Fred Fish. (fnf@cygnus.com)
 # And rewritten by Michael Chastain (mec.gnu@mindspring.com)
 
+standard_testfile
+
+if {[build_executable "failed to prepare" $testfile $srcfile debug]} {
+    return -1
+}
 
 # Start with a fresh gdb.
 
@@ -189,3 +194,41 @@ gdb_test "set radix 7" \
 gdb_test "show output-radix" \
     "Default output radix for printing of values is 10\\." \
     "output radix unchanged after rejection through set radix command"
+
+with_test_prefix "pc offset radix" {
+    clean_restart $testfile
+
+    if { ![runto_main] } {
+      return -1
+    }
+
+    proc test_pc_offset_radix { oradix offset_re } {
+      global gdb_prompt
+
+      gdb_test "set output-radix $oradix" \
+	  "Output radix now set to decimal $oradix.*\\."
+
+      set test "x/i with output-radix $oradix"
+
+      gdb_test_multiple "x/i \$pc" "$test 1" {
+	-re -wrap "<main\\+$offset_re>:.*" {
+	   pass $gdb_test_name
+	}
+      }
+
+      gdb_test "ni 3" "\[0-9\]+.*" "Next instruction for radix $oradix"
+
+      gdb_test_multiple "x/i \$pc" "$test 2" {
+	-re -wrap "<main\\+$offset_re>:.*" {
+	   pass $gdb_test_name
+	}
+      }
+    }
+
+    test_pc_offset_radix 8  {0[0-7]+}
+    test_pc_offset_radix 10 {[1-9][0-9]*}
+    test_pc_offset_radix 16 {0x[0-9a-f]+}
+
+    gdb_test "set output-radix 10" "Output radix now set to decimal 10.*\\." \
+	"restore output-radix"
+}
diff --git a/gdb/valprint.c b/gdb/valprint.c
index 62b1b33bb66..d0d0472ca7a 100644
--- a/gdb/valprint.c
+++ b/gdb/valprint.c
@@ -171,6 +171,19 @@ show_output_radix (struct ui_file *file, int from_tty,
 	      value);
 }
 
+/* See valprint.h.  */
+
+std::string
+format_pc_offset (int offset)
+{
+  std::string sign = (offset < 0) ? "-" : "+";
+
+  std::string body = int_string (offset < 0 ? -offset : offset, output_radix,
+                                 0, 0, 1);
+
+  return sign + body;
+}
+
 /* By default we print arrays without printing the index of each element in
    the array.  This behavior can be changed by setting PRINT_ARRAY_INDEXES.  */
 
diff --git a/gdb/valprint.h b/gdb/valprint.h
index 0ce3e0781f6..5511707cba3 100644
--- a/gdb/valprint.h
+++ b/gdb/valprint.h
@@ -320,6 +320,12 @@ extern int build_address_symbolic (struct gdbarch *,
 				   int *line,
 				   int *unmapped);
 
+/* Format OFFSET, the offset portion of a "<symbol+offset>" display, as
+   a string with an explicit sign prefix ("+" or "-").  The numeric
+   portion is rendered using the current "output-radix".  */
+
+extern std::string format_pc_offset (int offset);
+
 /* Check to see if RECURSE is greater than or equal to the allowed
    printing max-depth (see 'set print max-depth').  If it is then print an
    ellipsis expression to STREAM and return true, otherwise return false.
-- 
2.54.0.563.g4f69b47b94-goog


  reply	other threads:[~2026-05-12  1:36 UTC|newest]

Thread overview: 11+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2026-05-09  4:45 Zander Work
2026-05-11 14:14 ` Guinevere Larsen
2026-05-12  1:32   ` Zander Work [this message]
2026-05-12 11:33     ` Eli Zaretskii
2026-05-12 13:05       ` Zander Work
2026-05-12 13:10         ` Eli Zaretskii
2026-05-14 14:23         ` Simon Marchi
2026-05-14 15:15           ` Zander Work
2026-05-13 16:38       ` Tom Tromey
2026-05-13 16:50         ` Zander Work
2026-05-13 16:37 ` Tom Tromey

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=20260512013237.646630-2-zdw@google.com \
    --to=zdw@google.com \
    --cc=gdb-patches@sourceware.org \
    --cc=guinevere@redhat.com \
    --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