From 5479c4c7c9e7179d95c6520cdef98ae175874cab Mon Sep 17 00:00:00 2001 From: Tom de Vries Date: Thu, 13 Apr 2023 00:18:12 +0200 Subject: [PATCH] [gdb/tui] Fix left margin in disassembly window MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit With a hello world a.out, and maint set tui-left-margin-verbose on, we have this disassembly window: ... ┌───────────────────────────────────────────────────────────┐ │___ 0x555555555149
endbr64 │ │___ 0x55555555514d push %rbp │ │___ 0x55555555514e mov %rsp,%rbp │ │B+> 0x555555555151 lea 0xeac(%rip),%rax│ │___ 0x555555555158 mov %rax,%rdi │ ... Note the space between "B+>" and 0x555555555151. The space shows that a bit of the left margin is not written, which is a problem because that location is showing a character previously written, which happens to be a space, but also may be something else, for instance a '[' as reported in PR tui/30325. The problem is caused by confusion about the meaning of: ... #define TUI_EXECINFO_SIZE 4 ... There's the meaning of defining the size of this zero-terminated char array: ... char element[TUI_EXECINFO_SIZE]; ... which is used to print the "B+>" bit, which is 3 chars wide. And there's the meaning of defining part of the size of the left margin: ... int left_margin () const { return 1 + TUI_EXECINFO_SIZE + extra_margin (); } ... where it represents 4 chars. The discrepancy between the two causes the space between "B+>" and "0x555555555151". Fix this by redefining TUI_EXECINFO_SIZE to 3, and using: ... char element[TUI_EXECINFO_SIZE + 1]; ... such that we have: ... |B+>0x555555555151 lea 0xeac(%rip),%rax │ ... This changes the layout of the disassembly window back to what it was before commit 9e820dec13e ("Use a curses pad for source and disassembly windows"), the commit that introduced the PR30325 regression. This also changes the source window from: ... │___000005__{ | ... to: ... │___000005_{ | ... Tested on x86_64-linux. Bug: https://sourceware.org/bugzilla/show_bug.cgi?id=30325 Approved-By: Tom Tromey --- gdb/tui/tui-winsource.c | 7 ++++--- gdb/tui/tui-winsource.h | 2 +- 2 files changed, 5 insertions(+), 4 deletions(-) diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index 6c69fb7a907..84f9d97c554 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -666,12 +666,13 @@ 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]; + /* Add 1 for '\0'. */ + char element[TUI_EXECINFO_SIZE + 1]; /* Initialize all but last element. */ char space = tui_left_margin_verbose ? '_' : ' '; - memset (element, space, TUI_EXECINFO_SIZE - 1); + memset (element, space, TUI_EXECINFO_SIZE); /* Initialize last element. */ - element[TUI_EXECINFO_SIZE - 1] = '\0'; + element[TUI_EXECINFO_SIZE] = '\0'; /* Now update the exec info content based upon the state of each line as indicated by the source content. */ diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h index 7370ae95d8b..a8ff94f5769 100644 --- a/gdb/tui/tui-winsource.h +++ b/gdb/tui/tui-winsource.h @@ -58,7 +58,7 @@ DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags); #define TUI_BP_HIT_POS 0 #define TUI_BP_BREAK_POS 1 #define TUI_EXEC_POS 2 -#define TUI_EXECINFO_SIZE 4 +#define TUI_EXECINFO_SIZE 3 /* Elements in the Source/Disassembly Window. */ struct tui_source_element -- 2.30.2