diff options
author | Andrew Burgess <andrew.burgess@embecosm.com> | 2021-01-25 18:43:19 +0000 |
---|---|---|
committer | Andrew Burgess <andrew.burgess@embecosm.com> | 2021-01-28 17:00:30 +0000 |
commit | f237f998d1168139d599c550d54169cd8f94052d (patch) | |
tree | 950aea5216a480dd88366bbe0d565272f17c7170 /gdb/tui/tui-location.h | |
parent | cdeba395cffb0eda272cb239d27e899794efe658 (diff) | |
download | gdb-f237f998d1168139d599c550d54169cd8f94052d.zip gdb-f237f998d1168139d599c550d54169cd8f94052d.tar.gz gdb-f237f998d1168139d599c550d54169cd8f94052d.tar.bz2 |
gdb/tui: remove special handling of locator/status window
The locator window, or status window as it is sometimes called is
handled differently to all the other windows.
The reason for this is that the class representing this
window (tui_locator_window) does two jobs, first this class represents
a window just like any other that has space on the screen and fills
the space with content. The second job is that this class serves as a
storage area to hold information about the current location that the
TUI windows represent, so the class has members like 'addr' and
'line_no', for example which are used within this class, and others
when they want to know which line/address the TUI windows should be
showing to the user.
Because of this dual purpose we must always have an instance of the
tui_locator_window so that there is somewhere to store this location
information.
The result of this is that the locator window must never be deleted
like other windows, which results in some special case code.
In this patch I propose splitting the two roles of the
tui_locator_window class. The tui_locator_window class will retain
just its window drawing parts, and will be treated just like any other
window. This should allow all special case code for this window to be
deleted.
The other role, that of tracking the current tui location will be
moved into a new class (tui_location_tracker), of which there will be
a single global instance. All of the places where we previously use
the locator window to get location information will now be updated to
get this from the tui_location_tracker.
There should be no user visible changes after this commit.
gdb/ChangeLog:
* Makefile.in (SUBDIR_TUI_SRCS): Add tui/tui-location.c.
(HFILES_NO_SRCDIR): Add tui/tui-location.h.
* tui/tui-data.h (TUI_STATUS_WIN): Define.
(tui_locator_win_info_ptr): Delete declaration.
* tui/tui-disasm.c: Add 'tui/tui-location.h' include.
(tui_disasm_window::set_contents): Fetch state from tui_location
global.
(tui_get_begin_asm_address): Likewise.
* tui/tui-layout.c (tui_apply_current_layout): Remove special case
for locator window.
(get_locator_window): Delete.
(initialize_known_windows): Treat locator window just like all the
rest.
* tui/tui-source.c: Add 'tui/tui-location.h' include.
(tui_source_window::set_contents): Fetch state from tui_location
global.
(tui_source_window::showing_source_p): Likewise.
* tui/tui-stack.c: Add 'tui/tui-location.h' include.
(_locator): Delete.
(tui_locator_win_info_ptr): Delete.
(tui_locator_window::make_status_line): Fetch state from
tui_location global.
(tui_locator_window::rerender): Remove check of 'handle',
reindent function body.
(tui_locator_window::set_locator_fullname): Delete.
(tui_locator_window::set_locator_info): Delete.
(tui_update_locator_fullname): Delete.
(tui_show_frame_info): Likewise.
(tui_show_locator_content): Access window through TUI_STATUS_WIN.
* tui/tui-stack.h (tui_locator_window::set_locator_info): Moved to
tui/tui-location.h and renamed to
tui_location_tracker::set_location.
(tui_locator_window::set_locator_fullname): Moved to
tui/tui-location.h and renamed to
tui_location_tracker::set_fullname.
(tui_locator_window::full_name): Delete.
(tui_locator_window::proc_name): Delete.
(tui_locator_window::line_no): Delete.
(tui_locator_window::addr): Delete.
(tui_locator_window::gdbarch): Delete.
(tui_update_locator_fullname): Delete declaration.
* tui/tui-wingeneral.c (tui_refresh_all): Removed special handling
for locator window.
* tui/tui-winsource.c: Add 'tui/tui-location.h' include.
(tui_display_main): Call function on tui_location directly.
* tui/tui.h (enum tui_win_type): Add STATUS_WIN.
* tui/tui-location.c: New file.
* tui/tui-location.h: New file.
Diffstat (limited to 'gdb/tui/tui-location.h')
-rw-r--r-- | gdb/tui/tui-location.h | 93 |
1 files changed, 93 insertions, 0 deletions
diff --git a/gdb/tui/tui-location.h b/gdb/tui/tui-location.h new file mode 100644 index 0000000..804142f --- /dev/null +++ b/gdb/tui/tui-location.h @@ -0,0 +1,93 @@ +/* Copyright (C) 2021 Free Software Foundation, Inc. + + This file is part of GDB. + + 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/>. */ + +#ifndef TUI_TUI_LOCATION_H +#define TUI_TUI_LOCATION_H + +#include "tui/tui.h" +#include "tui/tui.h" +#include "gdb_curses.h" /* For WINDOW. */ +#include "observable.h" + +/* Class used to track the current location that the TUI is displaying. An + instance of this class will be created; as events occur within GDB the + location information within this instance will be updated. As windows + like the status window, source window, or disassembler window need to + update themselves, they will ask this instance which location they + should be displaying. */ + +struct tui_location_tracker +{ + /* Update the current location with the provided arguments. Returns true + if any of the locator's fields were actually changed, and false + otherwise. */ + bool set_location (struct gdbarch *gdbarch, + const struct symtab_and_line &sal, + const char *procname); + + /* Update the current location with the with the provided argument. + Return true if any of the fields actually changed, otherwise false. */ + bool set_location (struct symtab *symtab); + + /* Return the address of the current location. */ + CORE_ADDR addr () const + { return m_addr; } + + /* Return the architecture for the current location. */ + struct gdbarch *gdbarch () const + { return m_gdbarch; } + + /* Return the full name of the file containing the current location. */ + const std::string &full_name () const + { return m_full_name; } + + /* Return the name of the function containing the current location. */ + const std::string &proc_name () const + { return m_proc_name; } + + /* Return the line number for the current location. */ + int line_no () const + { return m_line_no; } + +private: + + /* Update M_FULL_NAME from SYMTAB. Return true if M_FULL_NAME actually + changed, otherwise, return false. */ + bool set_fullname (struct symtab *symtab); + + /* The full name for the file containing the current location. */ + std::string m_full_name; + + /* The name of the function we're currently within. */ + std::string m_proc_name; + + /* The line number for the current location. */ + int m_line_no = 0; + + /* The address of the current location. */ + CORE_ADDR m_addr = 0; + + /* Architecture associated with code at this location. */ + struct gdbarch *m_gdbarch = nullptr; +}; + +/* The single global instance of the location tracking class. Tracks the + current location that the TUI windows are displaying. */ + +extern tui_location_tracker tui_location; + +#endif /* TUI_TUI_LOCATION_H */ |