[gdb/tui] Add maint set/show tui-left-margin-verbose
authorTom de Vries <tdevries@suse.de>
Wed, 12 Apr 2023 22:18:12 +0000 (00:18 +0200)
committerTom de Vries <tdevries@suse.de>
Wed, 12 Apr 2023 22:18:12 +0000 (00:18 +0200)
The TUI has two types of windows derived from tui_source_window_base:
- tui_source_window (the source window), and
- tui_disasm_window (the disassembly window).

The two windows share a common concept: the left margin.

With a hello world a.out, we can see the source window:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│        5  {                                               │
│B+>     6    printf ("hello\n");                           │
│        7    return 0;                                     │
│        8  }                                               │
│        9                                                  │

...
where the left margin is the part holding "B+>" and the line number, and the
disassembly window:
...
┌───────────────────────────────────────────────────────────┐
│    0x555555555149 <main>           endbr64                │
│    0x55555555514d <main+4>         push   %rbp            │
│    0x55555555514e <main+5>         mov    %rsp,%rbp       │
│B+> 0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
│    0x555555555158 <main+15>        mov    %rax,%rdi       │
...
where the left margin is just the bit holding "B+>".

Because the left margin contains some spaces, it's not clear where it starts
and ends, making it harder to observe problems related to it.

Add a new maintenance command "maint set tui-left-margin-verbose", that when
set to on replaces the spaces in the left margin with either '_' or '0',
giving us this for the source window:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│___000005__{                                               │
│B+>000006__  printf ("hello\n");                           │
│___000007__  return 0;                                     │
│___000008__}                                               │
...
and this for the disassembly window:
...
┌───────────────────────────────────────────────────────────┐
│___ 0x555555555149 <main>           endbr64                │
│___ 0x55555555514d <main+4>         push   %rbp            │
│___ 0x55555555514e <main+5>         mov    %rsp,%rbp       │
│B+> 0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
│___ 0x555555555158 <main+15>        mov    %rax,%rdi       │
...

Note the space between "B+>" and 0x555555555151.  The space shows that a bit
of the left margin is not written, a problem reported as PR tui/30325.

Specifically, PR tui/30325 is about the fact that the '[' character from the
string "[ No Assembly Available ]" ends up in that same spot:
...
│B+>[0x555555555151 <main+8>         lea    0xeac(%rip),%rax│
...
which only happens for certain window widths.

The new command allows us to spot the problem with any window width.

Likewise, when we revert the fix from commit 1b6d4bb2232 ("Redraw both spaces
between line numbers and source code"), we have:
...
┌─/home/vries/hello.c───────────────────────────────────────┐
│___000005_ {                                               │
│B+>000006_   printf ("hello\n");                           │
│___000007_   return 0;                                     │
│___000008_ }                                               │
...
showing a similar problem at the space between '_' and '{'.

Tested on x86_64-linux.

Reviewed-By: Eli Zaretskii <eliz@gnu.org>
Approved-By: Tom Tromey <tom@tromey.com>
gdb/doc/gdb.texinfo
gdb/tui/tui-source.c
gdb/tui/tui-win.c
gdb/tui/tui-win.h
gdb/tui/tui-winsource.c

index 45a0580bc29ca8a4929115425e62cff081d6399e..c11457952d2be73688d5cc941f2ec3949a959e1e 100644 (file)
@@ -41249,6 +41249,17 @@ has been resized.  This setting is intended for use by the test suite,
 where it would otherwise be difficult to determine when a resize and
 refresh has been completed.
 
+@kindex maint set tui-left-margin-verbose
+@kindex maint show tui-left-margin-verbose
+@item maint set tui-left-margin-verbose
+@item maint show tui-left-margin-verbose
+Control whether the left margin of the TUI source and disassembly windows
+uses @samp{_} and @samp{0} at locations where otherwise there would be a
+space.  The default is @code{off}, which means spaces are used.  The
+setting is intended to make it clear where the left margin begins and
+ends, to avoid incorrectly interpreting a space as being part of the
+the left margin.
+
 @kindex maint set per-command
 @kindex maint show per-command
 @item maint set per-command
index 73d444175339432cae6bc0a95b862625b978a8da..aa3e58407c4205a2aa101699f6c07b13ac1a108a 100644 (file)
@@ -234,6 +234,9 @@ tui_source_window::show_line_number (int offset) const
   char text[20];
   /* To completely overwrite the previous border when the source window height
      is increased, both spaces after the line number have to be redrawn.  */
-  xsnprintf (text, sizeof (text), "%*d  ", m_digits - 1, lineno);
+  char space = tui_left_margin_verbose ? '_' : ' ';
+  xsnprintf (text, sizeof (text),
+            tui_left_margin_verbose ? "%0*d%c%c" : "%*d%c%c", m_digits - 1,
+            lineno, space, space);
   waddstr (handle.get (), text);
 }
index 008189eb99b20ff8718094fb75e4ffb88e56d72e..3b17cb8dd29763fee6ee46a8399a9878e378c52d 100644 (file)
@@ -1111,6 +1111,10 @@ tui_window_command (const char *args, int from_tty)
   help_list (tui_window_cmds, "tui window ", all_commands, gdb_stdout);
 }
 
+/* See tui-win.h.  */
+
+bool tui_left_margin_verbose = false;
+
 /* Function to initialize gdb commands, for tui window
    manipulation.  */
 
@@ -1284,6 +1288,18 @@ position indicator is styled."),
                           &style_set_list,
                           &style_show_list);
 
+  add_setshow_boolean_cmd ("tui-left-margin-verbose", class_maintenance,
+                          &tui_left_margin_verbose, _("\
+Set whether the left margin should use '_' and '0' instead of spaces."),
+                          _("\
+Show whether the left margin should use '_' and '0' instead of spaces."),
+                          _("\
+When enabled, the left margin will use '_' and '0' instead of spaces."),
+                          nullptr,
+                          nullptr,
+                          &maintenance_set_cmdlist,
+                          &maintenance_show_cmdlist);
+
   tui_border_style.changed.attach (tui_rehighlight_all, "tui-win");
   tui_active_border_style.changed.attach (tui_rehighlight_all, "tui-win");
 }
index 4b33f1f2b5421c137260ba83bd17a6533e02a7e1..3d35f1dfb7f511104c4df89d15b46b48a35501e4 100644 (file)
@@ -55,4 +55,7 @@ extern bool compact_source;
    current position indicator.  */
 extern bool style_tui_current_position;
 
+/* Whether to replace the spaces in the left margin with '_' and '0'.  */
+extern bool tui_left_margin_verbose;
+
 #endif /* TUI_TUI_WIN_H */
index 52a0f7af00ff28a5670d02deb62ae7a4becc54da..6c69fb7a907fd64763a7e3c74607d55f9583dfb1 100644 (file)
@@ -666,7 +666,12 @@ tui_source_window_base::update_exec_info (bool refresh_p)
   for (int i = 0; i < m_content.size (); i++)
     {
       struct tui_source_element *src_element = &m_content[i];
-      char element[TUI_EXECINFO_SIZE] = "   ";
+      char element[TUI_EXECINFO_SIZE];
+      /* Initialize all but last element.  */
+      char space = tui_left_margin_verbose ? '_' : ' ';
+      memset (element, space, TUI_EXECINFO_SIZE - 1);
+      /* Initialize last element.  */
+      element[TUI_EXECINFO_SIZE - 1] = '\0';
 
       /* Now update the exec info content based upon the state
         of each line as indicated by the source content.  */