]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
[gdb/tdep] Add "maint set console-translation-mode <binary|text>" command
authorTom de Vries <tdevries@suse.de>
Sat, 28 Jun 2025 11:03:14 +0000 (13:03 +0200)
committerTom de Vries <tdevries@suse.de>
Sat, 28 Jun 2025 11:03:14 +0000 (13:03 +0200)
On MSYS2, say we record a brief gdb session using TERM=dumb script:
...
$ gdb -q
(gdb) print 1
$1 = 1
(gdb) q
...

When looking at the resulting typescript, we notice something odd:
...
$ gdb -q^M
(gdb) print 1^M
$1 = 1^M^M
(gdb) q^M
...

For some reason, we have "$1 = 1\r\r\n(gdb) ".

Looking at the documentation of _setmode [1], it mentions translation mode
_O_TEXT as a mode in which "\n" is translated into "\r\n" on output.

So, it looks like this translation happens twice.

Add a command "maint set console-translation-mode <binary|text>" command that
allows us to set the translation mode of stdout/stderr to binary, such that we
get instead:
...
$ gdb -q -ex "maint set console-translation-mode binary"^M
(gdb) print 1^M
$1 = 1^M
(gdb) q^M
...

Since we run into this in the testsuite, add
"maint set console-translation-mode binary" to INTERNAL_GDBFLAGS.

Based on "maint set testsuite-mode on/off" from these patches [2][3] by Pierre
Muller.

Compared to that proposal, I dropped the name testsuite-mode, because the
behaviour is not specific to the testsuite.

Also I chose values binary/text instead of on/off because eventually there may
be other translation mode values that we need [4].

Co-Authored-By: Pierre Muller <muller@sourceware.org>
Reviewed-By: Eli Zaretskii <eliz@gnu.org>
[1] https://learn.microsoft.com/en-us/cpp/c-runtime-library/reference/setmode
[2] https://sourceware.org/legacy-ml/gdb-patches/2013-09/msg00939.html
[3] https://sourceware.org/legacy-ml/gdb-patches/2013-09/msg00940.html
[4] https://learn.microsoft.com/en-us/cpp/c-runtime-library/translation-mode-constants

gdb/NEWS
gdb/doc/gdb.texinfo
gdb/mingw-hdep.c
gdb/testsuite/lib/gdb.exp

index 6c8a008d39d31659709f9e259c8f930662514b00..2abe376a5837e46bb3763ccf699098446ff9d856 100644 (file)
--- a/gdb/NEWS
+++ b/gdb/NEWS
@@ -59,6 +59,12 @@ maintenance check symtabs
 maintenance canonicalize
   Show the canonical form of a C++ name.
 
+maintenance set console-translation-mode <binary|text>
+maintenance show console-translation-mode
+  Controls the translation mode of GDB stdout/stderr.  MS-Windows only.  In
+  binary mode, no translation is done.  In text mode, a Line Feed is
+  translated into a Carriage Return-Line Feed combination.
+
 set riscv numeric-register-names on|off
 show riscv numeric-register-names
   Controls whether GDB refers to risc-v registers by their numeric names
index 4ef640698bd814a2b2ed99f44eb2ee35bd80b6b4..b6d626b40318178469443155c4a6ea0a28948417 100644 (file)
@@ -42755,6 +42755,23 @@ reports and error and the command is aborted.
 
 @item show watchdog
 Show the current setting of the target wait timeout.
+
+@kindex maint set console-translation-mode
+@kindex maint show console-translation-mode
+@item maint set console-translation-mode @r{[}binary|text@r{]}
+@itemx maint show console-translation-mode
+Controls the translation mode of @value{GDBN} stdout/stderr.  MS-Windows
+only.  Useful for running the @value{GDBN} testsuite.
+
+The translation mode values are as follows:
+@table @code
+@item binary
+No translation.
+@item text
+Translate @samp{\n} (LF, a single Line Feed) into @samp{\r\n} (CR-LF, a
+Carriage Return-Line Feed combination).
+@end table
+
 @end table
 
 @node Remote Protocol
index 84a7b9f7a528129ce2189d6be212337981a1ffda..481bd41e1527a55f1e263d6cda90d32f63c97a4c 100644 (file)
@@ -23,6 +23,8 @@
 #include "gdbsupport/gdb_select.h"
 #include "inferior.h"
 #include "cli/cli-style.h"
+#include "command.h"
+#include "cli/cli-cmds.h"
 
 #include <windows.h>
 #include <signal.h>
@@ -445,3 +447,65 @@ install_sigint_handler (c_c_handler_ftype *fn)
   current_handler = fn;
   return result;
 }
+
+/* Set stdout and stderr handles to translation mode MODE.  */
+
+static void
+set_console_translation_mode (int mode)
+{
+  setmode (fileno (stdout), mode);
+  setmode (fileno (stderr), mode);
+}
+
+/* Arg in "maint set console-translation-mode <arg>.  */
+
+static std::string maint_console_translation_mode;
+
+/* Current value of "maint set/show console-translation-mode".  */
+
+static std::string console_translation_mode = "unknown";
+
+/* Sets the console translation mode.  */
+
+static void
+set_maint_console_translation_mode (const char *args, int from_tty,
+                                   struct cmd_list_element *c)
+{
+  if (maint_console_translation_mode == "binary")
+    set_console_translation_mode (O_BINARY);
+  else if (maint_console_translation_mode == "text")
+    set_console_translation_mode (O_TEXT);
+  else
+    error (_("Invalid console translation mode: %s"),
+          maint_console_translation_mode.c_str ());
+
+  console_translation_mode = maint_console_translation_mode;
+}
+
+/* Shows the console translation mode.  */
+
+static void
+show_maint_console_translation_mode (struct ui_file *file, int from_tty,
+                                    struct cmd_list_element *c,
+                                    const char *value)
+{
+  gdb_printf (file, _("Console translation mode is %s.\n"),
+             console_translation_mode.c_str ());
+}
+
+extern void _initialize_mingw_hdep ();
+
+void
+_initialize_mingw_hdep ()
+{
+  add_setshow_string_cmd ("console-translation-mode",
+                         class_maintenance,
+                         &maint_console_translation_mode, _("\
+Set the translation mode of stdout/stderr."), _("\
+Show the translation mode of stdout/stderr."), _("\
+Use \"binary\", or \"text\""),
+                          set_maint_console_translation_mode,
+                          show_maint_console_translation_mode,
+                          &maintenance_set_cmdlist,
+                          &maintenance_show_cmdlist);
+}
index 3f1cd55d7273a0a9ecdd870213cb450e8843ecb8..777d64d14d1cb806b6d9fe4b3045b34510862131 100644 (file)
@@ -272,6 +272,10 @@ if ![info exists INTERNAL_GDBFLAGS] {
 
     # Handle the case that "interactive-mode auto" reports off.
     append INTERNAL_GDBFLAGS { -iex "set interactive-mode on"}
+
+    if { [ishost "*-*-mingw*"] } {
+       append INTERNAL_GDBFLAGS { -iex "maint set console-translation-mode binary"}
+    }
 }
 
 # The variable gdb_prompt is a regexp which matches the gdb prompt.