[PATCH 50/66] Separate out locator window

Tom Tromey
2019-06-24T18:48:57Z

This introduces a new subclass of tui_gen_win_info for the locator,
letting us remove another element from union tui_which_element.

2019-06-23 Tom Tromey <tom@tromey.com>

* tui/tui-wingeneral.c (tui_refresh_all): Update.
* tui/tui-win.c (tui_resize_all, tui_adjust_win_heights)
(tui_source_window_base::set_new_height): Update.
* tui/tui-stack.c (tui_make_status_line): Change parameter type.
Update.
(tui_set_locator_fullname, tui_set_locator_info)
(tui_show_frame_info): Update.
* tui/tui-source.c (tui_set_source_content)
(tui_source_is_displayed): Update.
* tui/tui-layout.c (show_source_disasm_command, show_data)
(show_source_or_disasm_and_command): Update.
* tui/tui-disasm.c (tui_set_disassem_content)
(tui_get_begin_asm_address): Update.
* tui/tui-data.h (struct tui_locator_element): Remove.
(union tui_which_element) <locator>: Remove.
(struct tui_locator_window): New.
(tui_locator_win_info_ptr): Change return type.
* tui/tui-data.c (_locator): Change type.
(tui_locator_win_info_ptr): Change return type.
(init_content_element): Remove LOCATOR_WIN case. Add assert.
(tui_alloc_content): Add assert.
---
gdb/ChangeLog | 24 +++++++++++++
gdb/tui/tui-data.c | 12 +++----
gdb/tui/tui-data.h | 34 ++++++++++--------
gdb/tui/tui-disasm.c | 14 ++++----
gdb/tui/tui-layout.c | 42 +++++++++++------------
gdb/tui/tui-source.c | 12 +++----
gdb/tui/tui-stack.c | 74 +++++++++++++---------------------------
gdb/tui/tui-win.c | 6 ++--
gdb/tui/tui-wingeneral.c | 2 +-
9 files changed, 107 insertions(+), 113 deletions(-)

diff --git a/gdb/tui/tui-data.c b/gdb/tui/tui-data.c
index d74c4f7b2a9..4f5f710ba94 100644
--- a/gdb/tui/tui-data.c
+++ b/gdb/tui/tui-data.c
@@ -36,7 +36,7 @@ struct tui_win_info *tui_win_list[MAX_MAJOR_WINDOWS];
****************************/
static enum tui_layout_type current_layout = UNDEFINED_LAYOUT;
static int term_height, term_width;
-static struct tui_gen_win_info _locator (LOCATOR_WIN);
+static struct tui_locator_window _locator;
static struct std::vector<tui_source_window_base *> source_windows;
static struct tui_win_info *win_with_focus = NULL;
static struct tui_layout_def layout_def = {
@@ -185,7 +185,7 @@ tui_data_window::clear_detail ()

/* Accessor for the locator win info. Answers a pointer to the static
locator win info struct. */
-struct tui_gen_win_info *
+struct tui_locator_window *
tui_locator_win_info_ptr (void)
{
return &_locator;
@@ -365,6 +365,7 @@ init_content_element (struct tui_win_element *element,
enum tui_win_type type)
{
gdb_assert (type != EXEC_INFO_WIN);
+ gdb_assert (type != LOCATOR_WIN);

switch (type)
{
@@ -393,12 +394,6 @@ init_content_element (struct tui_win_element *element,
element->which_element.data.highlight = FALSE;
element->which_element.data.content = NULL;
break;
- case LOCATOR_WIN:
- element->which_element.locator.full_name[0] =
- element->which_element.locator.proc_name[0] = (char) 0;
- element->which_element.locator.line_no = 0;
- element->which_element.locator.addr = 0;
- break;
default:
break;
}
@@ -426,6 +421,7 @@ tui_alloc_content (int num_elements, enum tui_win_type type)
int i;

gdb_assert (type != EXEC_INFO_WIN);
+ gdb_assert (type != LOCATOR_WIN);

content = XNEWVEC (struct tui_win_element *, num_elements);

diff --git a/gdb/tui/tui-data.h b/gdb/tui/tui-data.h
index 23dd0fd9080..cdafc69a379 100644
--- a/gdb/tui/tui-data.h
+++ b/gdb/tui/tui-data.h
@@ -214,18 +214,6 @@ struct tui_command_element
# define MAX_LOCATOR_ELEMENT_LEN 1024
#endif

-/* Elements in the locator window content. */
-struct tui_locator_element
-{
- /* Resolved absolute filename as returned by symtab_to_fullname. */
- char full_name[MAX_LOCATOR_ELEMENT_LEN];
- char proc_name[MAX_LOCATOR_ELEMENT_LEN];
- int line_no;
- CORE_ADDR addr;
- /* Architecture associated with code at this location. */
- struct gdbarch *gdbarch;
-};
-
/* Flags to tell what kind of breakpoint is at current line. */
#define TUI_BP_ENABLED 0x01
#define TUI_BP_DISABLED 0x02
@@ -248,7 +236,6 @@ union tui_which_element
struct tui_gen_win_info *data_window; /* Data display elements. */
struct tui_data_element data; /* Elements of data_window. */
struct tui_command_element command; /* Command elements. */
- struct tui_locator_element locator; /* Locator elements. */
};

struct tui_win_element
@@ -284,6 +271,25 @@ private:
tui_exec_info_content *m_content = nullptr;
};

+/* Locator window class. */
+
+struct tui_locator_window : public tui_gen_win_info
+{
+ tui_locator_window ()
+ : tui_gen_win_info (LOCATOR_WIN)
+ {
+ full_name[0] = 0;
+ proc_name[0] = 0;
+ }
+
+ char full_name[MAX_LOCATOR_ELEMENT_LEN];
+ char proc_name[MAX_LOCATOR_ELEMENT_LEN];
+ int line_no = 0;
+ CORE_ADDR addr = 0;
+ /* Architecture associated with code at this location. */
+ struct gdbarch *gdbarch = nullptr;
+};
+
/* This defines information about each logical window. */
struct tui_win_info : public tui_gen_win_info
{
@@ -572,7 +578,7 @@ extern int tui_term_height (void);
extern void tui_set_term_height_to (int);
extern int tui_term_width (void);
extern void tui_set_term_width_to (int);
-extern struct tui_gen_win_info *tui_locator_win_info_ptr (void);
+extern struct tui_locator_window *tui_locator_win_info_ptr (void);
extern struct std::vector<tui_source_window_base *> &tui_source_windows ();
extern void tui_clear_source_windows (void);
extern void tui_clear_source_windows_detail (void);
diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c
index b3d39ea8031..6b88d96a9db 100644
--- a/gdb/tui/tui-disasm.c
+++ b/gdb/tui/tui-disasm.c
@@ -169,7 +169,7 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
int offset = TUI_DISASM_WIN->horizontal_offset;
int max_lines, line_width;
CORE_ADDR cur_pc;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
int tab_len = tui_tab_width;
struct tui_asm_line *asm_lines;
int insn_pos;
@@ -185,7 +185,7 @@ tui_set_disassem_content (struct gdbarch *gdbarch, CORE_ADDR pc)
base->gdbarch = gdbarch;
base->start_line_or_addr.loa = LOA_ADDRESS;
base->start_line_or_addr.u.addr = pc;
- cur_pc = locator->content[0]->which_element.locator.addr;
+ cur_pc = locator->addr;

/* Window size, excluding highlight box. */
max_lines = TUI_DISASM_WIN->height - 2;
@@ -316,15 +316,13 @@ tui_show_disassem_and_update_source (struct gdbarch *gdbarch,
void
tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
{
- struct tui_gen_win_info *locator;
- struct tui_locator_element *element;
+ struct tui_locator_window *locator;
struct gdbarch *gdbarch = get_current_arch ();
CORE_ADDR addr;

locator = tui_locator_win_info_ptr ();
- element = &locator->content[0]->which_element.locator;

- if (element->addr == 0)
+ if (locator->addr == 0)
{
struct bound_minimal_symbol main_symbol;

@@ -342,8 +340,8 @@ tui_get_begin_asm_address (struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
}
else /* The target is executing. */
{
- gdbarch = element->gdbarch;
- addr = element->addr;
+ gdbarch = locator->gdbarch;
+ addr = locator->addr;
}

*gdbarch_p = gdbarch;
diff --git a/gdb/tui/tui-layout.c b/gdb/tui/tui-layout.c
index a0745bf5384..cf8f13feeed 100644
--- a/gdb/tui/tui-layout.c
+++ b/gdb/tui/tui-layout.c
@@ -634,21 +634,21 @@ show_source_disasm_command (void)
TUI_SRC_WIN->m_has_locator = false;
}

- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
+ gdb_assert (locator != nullptr);

tui_show_source_content (TUI_SRC_WIN);
if (TUI_DISASM_WIN == NULL)
{
tui_win_list[DISASSEM_WIN]
= make_disasm_window (asm_height, src_height - 1);
- locator
- = init_and_make_win (locator,
- LOCATOR_WIN,
- 2 /* 1 */ ,
- tui_term_width (),
- 0,
- (src_height + asm_height) - 1,
- DONT_BOX_WINDOW);
+ init_and_make_win (locator,
+ LOCATOR_WIN,
+ 2 /* 1 */ ,
+ tui_term_width (),
+ 0,
+ (src_height + asm_height) - 1,
+ DONT_BOX_WINDOW);
}
else
{
@@ -703,8 +703,9 @@ show_data (enum tui_layout_type new_layout)
int total_height = (tui_term_height () - TUI_CMD_WIN->height);
int src_height, data_height;
enum tui_win_type win_type;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();

+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
+ gdb_assert (locator != nullptr);

data_height = total_height / 2;
src_height = total_height - data_height;
@@ -725,8 +726,7 @@ show_data (enum tui_layout_type new_layout)
else
tui_win_list[win_type]
= make_disasm_window (src_height, data_height - 1);
- locator
- = init_and_make_win (locator,
+ init_and_make_win (locator,
LOCATOR_WIN,
2 /* 1 */ ,
tui_term_width (),
@@ -870,7 +870,8 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type)
{
struct tui_win_info **win_info_ptr;
int src_height, cmd_height;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
+ gdb_assert (locator != nullptr);

if (TUI_CMD_WIN != NULL)
cmd_height = TUI_CMD_WIN->height;
@@ -890,14 +891,13 @@ show_source_or_disasm_and_command (enum tui_layout_type layout_type)
*win_info_ptr = make_source_window (src_height - 1, 0);
else
*win_info_ptr = make_disasm_window (src_height - 1, 0);
- locator
- = init_and_make_win (locator,
- LOCATOR_WIN,
- 2 /* 1 */ ,
- tui_term_width (),
- 0,
- src_height - 1,
- DONT_BOX_WINDOW);
+ init_and_make_win (locator,
+ LOCATOR_WIN,
+ 2 /* 1 */ ,
+ tui_term_width (),
+ 0,
+ src_height - 1,
+ DONT_BOX_WINDOW);
base = (tui_source_window_base *) *win_info_ptr;
}
else
diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c
index 54e53cf8dbd..e1448dbd961 100644
--- a/gdb/tui/tui-source.c
+++ b/gdb/tui/tui-source.c
@@ -157,7 +157,7 @@ tui_set_source_content (struct symtab *s,
else
{
int cur_line_no, cur_line;
- struct tui_gen_win_info *locator
+ struct tui_locator_window *locator
= tui_locator_win_info_ptr ();
struct tui_source_window_base *src
= (struct tui_source_window_base *) TUI_SRC_WIN;
@@ -194,12 +194,9 @@ tui_set_source_content (struct symtab *s,
element->which_element.source.line_or_addr.u.line_no =
cur_line_no;
element->which_element.source.is_exec_point =
- (filename_cmp (locator->content[0]
- ->which_element.locator.full_name,
+ (filename_cmp (locator->full_name,
symtab_to_fullname (s)) == 0
- && cur_line_no
- == locator->content[0]
- ->which_element.locator.line_no);
+ && cur_line_no == locator->line_no);

xfree (TUI_SRC_WIN->content[cur_line]
->which_element.source.line);
@@ -300,8 +297,7 @@ tui_source_is_displayed (const char *fullname)
{
return (TUI_SRC_WIN != NULL
&& TUI_SRC_WIN->content_in_use
- && (filename_cmp (tui_locator_win_info_ptr ()->content[0]
- ->which_element.locator.full_name,
+ && (filename_cmp (tui_locator_win_info_ptr ()->full_name,
fullname) == 0));
}

diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c
index efa24453b65..f761ac1f701 100644
--- a/gdb/tui/tui-stack.c
+++ b/gdb/tui/tui-stack.c
@@ -59,8 +59,8 @@ static void tui_update_command (const char *, int);
/* Create the status line to display as much information as we can on
this single line: target name, process number, current function,
current line, current PC, SingleKey mode. */
-static char*
-tui_make_status_line (struct tui_locator_element *loc)
+static char *
+tui_make_status_line (struct tui_locator_window *loc)
{
char *string;
char line_buf[50], *pname;
@@ -246,17 +246,13 @@ void
tui_show_locator_content (void)
{
char *string;
- struct tui_gen_win_info *locator;
+ struct tui_locator_window *locator;

locator = tui_locator_win_info_ptr ();

if (locator != NULL && locator->handle != NULL)
{
- struct tui_win_element *element;
-
- element = locator->content[0];
-
- string = tui_make_status_line (&element->which_element.locator);
+ string = tui_make_status_line (locator);
wmove (locator->handle, 0, 0);
/* We ignore the return value from wstandout and wstandend, casting
them to void in order to avoid a compiler warning. The warning
@@ -279,18 +275,10 @@ tui_show_locator_content (void)
static void
tui_set_locator_fullname (const char *fullname)
{
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
- struct tui_locator_element *element;
-
- if (locator->content[0] == NULL)
- {
- tui_set_locator_info (NULL, fullname, NULL, 0, 0);
- return;
- }
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();

- element = &locator->content[0]->which_element.locator;
- element->full_name[0] = 0;
- strcat_to_buf (element->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname);
+ locator->full_name[0] = 0;
+ strcat_to_buf (locator->full_name, MAX_LOCATOR_ELEMENT_LEN, fullname);
}

/* Update the locator, with the provided arguments.
@@ -305,39 +293,28 @@ tui_set_locator_info (struct gdbarch *gdbarch,
int lineno,
CORE_ADDR addr)
{
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
- struct tui_locator_element *element;
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
int locator_changed_p = 0;

- /* Allocate the locator content if necessary. */
- if (locator->content_size <= 0)
- {
- locator->content = tui_alloc_content (1, LOCATOR_WIN);
- locator->content_size = 1;
- locator_changed_p = 1;
- }
-
if (procname == NULL)
procname = "";

if (fullname == NULL)
fullname = "";

- element = &locator->content[0]->which_element.locator;
-
- locator_changed_p |= strncmp (element->proc_name, procname,
+ locator_changed_p |= strncmp (locator->proc_name, procname,
MAX_LOCATOR_ELEMENT_LEN) != 0;
- locator_changed_p |= lineno != element->line_no;
- locator_changed_p |= addr != element->addr;
- locator_changed_p |= gdbarch != element->gdbarch;
- locator_changed_p |= strncmp (element->full_name, fullname,
+ locator_changed_p |= lineno != locator->line_no;
+ locator_changed_p |= addr != locator->addr;
+ locator_changed_p |= gdbarch != locator->gdbarch;
+ locator_changed_p |= strncmp (locator->full_name, fullname,
MAX_LOCATOR_ELEMENT_LEN) != 0;

- element->proc_name[0] = (char) 0;
- strcat_to_buf (element->proc_name, MAX_LOCATOR_ELEMENT_LEN, procname);
- element->line_no = lineno;
- element->addr = addr;
- element->gdbarch = gdbarch;
+ locator->proc_name[0] = (char) 0;
+ strcat_to_buf (locator->proc_name, MAX_LOCATOR_ELEMENT_LEN, procname);
+ locator->line_no = lineno;
+ locator->addr = addr;
+ locator->gdbarch = gdbarch;
tui_set_locator_fullname (fullname);

return locator_changed_p;
@@ -366,7 +343,7 @@ tui_show_frame_info (struct frame_info *fi)
{
int start_line;
CORE_ADDR low;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
int source_already_displayed;
CORE_ADDR pc;

@@ -398,12 +375,9 @@ tui_show_frame_info (struct frame_info *fi)
start_line = 0;
for (struct tui_source_window_base *win_info : tui_source_windows ())
{
- union tui_which_element *item;
-
- item = &locator->content[0]->which_element;
if (win_info == TUI_SRC_WIN)
{
- start_line = (item->locator.line_no -
+ start_line = (locator->line_no -
(win_info->viewport_height / 2)) + 1;
if (start_line <= 0)
start_line = 1;
@@ -429,13 +403,13 @@ tui_show_frame_info (struct frame_info *fi)
l.loa = LOA_LINE;
l.u.line_no = start_line;
if (!(source_already_displayed
- && tui_line_is_displayed (item->locator.line_no,
+ && tui_line_is_displayed (locator->line_no,
win_info, TRUE)))
tui_update_source_window (win_info, get_frame_arch (fi),
sal.symtab, l, TRUE);
else
{
- l.u.line_no = item->locator.line_no;
+ l.u.line_no = locator->line_no;
win_info->set_is_exec_point_at (l);
}
}
@@ -447,13 +421,13 @@ tui_show_frame_info (struct frame_info *fi)

a.loa = LOA_ADDRESS;
a.u.addr = low;
- if (!tui_addr_is_displayed (item->locator.addr,
+ if (!tui_addr_is_displayed (locator->addr,
win_info, TRUE))
tui_update_source_window (win_info, get_frame_arch (fi),
sal.symtab, a, TRUE);
else
{
- a.u.addr = item->locator.addr;
+ a.u.addr = locator->addr;
win_info->set_is_exec_point_at (a);
}
}
diff --git a/gdb/tui/tui-win.c b/gdb/tui/tui-win.c
index 61b3a3251f1..64da13c3bb5 100644
--- a/gdb/tui/tui-win.c
+++ b/gdb/tui/tui-win.c
@@ -556,7 +556,7 @@ tui_resize_all (void)
struct tui_win_info *win_with_focus = tui_win_with_focus ();
struct tui_win_info *first_win;
struct tui_win_info *second_win;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
int win_type;
int new_height, split_diff, cmd_split_diff, num_wins_displayed = 2;

@@ -1099,7 +1099,7 @@ tui_adjust_win_heights (struct tui_win_info *primary_win_info,
{
int diff;
struct tui_win_info *win_info;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();
enum tui_layout_type cur_layout = tui_current_layout ();

diff = (new_height - primary_win_info->height) * (-1);
@@ -1255,7 +1255,7 @@ tui_source_window_base::set_new_height (int height)

if (has_locator ())
{
- tui_gen_win_info *gen_win_info = tui_locator_win_info_ptr ();
+ tui_locator_window *gen_win_info = tui_locator_win_info_ptr ();
tui_make_invisible (gen_win_info);
gen_win_info->origin.y = origin.y + height;
}
diff --git a/gdb/tui/tui-wingeneral.c b/gdb/tui/tui-wingeneral.c
index 98eb5abde16..9bc4e2b24ca 100644
--- a/gdb/tui/tui-wingeneral.c
+++ b/gdb/tui/tui-wingeneral.c
@@ -266,7 +266,7 @@ void
tui_refresh_all (struct tui_win_info **list)
{
int type;
- struct tui_gen_win_info *locator = tui_locator_win_info_ptr ();
+ struct tui_locator_window *locator = tui_locator_win_info_ptr ();

for (type = SRC_WIN; (type < MAX_MAJOR_WINDOWS); type++)
{
--
2.17.2