X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-winsource.h;h=435203d369e099c6bead68a2fd01b28f6691ebc9;hb=d0922fcf02c6f60ca17cbddccd8b9c8f789eef8c;hp=6fae8d8c5717a53f227903975aa8b7e3b041cb66;hpb=13274fc342aae3c94dbb38f01ba7d8f2e3821ddf;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h index 6fae8d8c57..435203d369 100644 --- a/gdb/tui/tui-winsource.h +++ b/gdb/tui/tui-winsource.h @@ -1,7 +1,6 @@ /* TUI display source/assembly window. - Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004, 2007, 2008, 2009 - Free Software Foundation, Inc. + Copyright (C) 1998-2019 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -20,61 +19,231 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef TUI_SOURCEWIN_H -#define TUI_SOURCEWIN_H +#ifndef TUI_TUI_WINSOURCE_H +#define TUI_TUI_WINSOURCE_H #include "tui/tui-data.h" +#include "symtab.h" -struct tui_win_info; +/* Flags to tell what kind of breakpoint is at current line. */ +enum tui_bp_flag +{ + TUI_BP_ENABLED = 0x01, + TUI_BP_DISABLED = 0x02, + TUI_BP_HIT = 0x04, + TUI_BP_CONDITIONAL = 0x08, + TUI_BP_HARDWARE = 0x10 +}; + +DEF_ENUM_FLAGS_TYPE (enum tui_bp_flag, tui_bp_flags); + +/* Position of breakpoint markers in the exec info string. */ +#define TUI_BP_HIT_POS 0 +#define TUI_BP_BREAK_POS 1 +#define TUI_EXEC_POS 2 +#define TUI_EXECINFO_SIZE 4 + +/* Elements in the Source/Disassembly Window. */ +struct tui_source_element +{ + tui_source_element () + { + line_or_addr.loa = LOA_LINE; + line_or_addr.u.line_no = 0; + } + + DISABLE_COPY_AND_ASSIGN (tui_source_element); + + tui_source_element (tui_source_element &&other) + : line (std::move (other.line)), + line_or_addr (other.line_or_addr), + is_exec_point (other.is_exec_point), + break_mode (other.break_mode) + { + } + + std::string line; + struct tui_line_or_address line_or_addr; + bool is_exec_point = false; + tui_bp_flags break_mode = 0; +}; + + +/* The base class for all source-like windows, namely the source and + disassembly windows. */ + +struct tui_source_window_base : public tui_win_info +{ +protected: + explicit tui_source_window_base (enum tui_win_type type); + ~tui_source_window_base (); + + DISABLE_COPY_AND_ASSIGN (tui_source_window_base); + + void do_scroll_horizontal (int num_to_scroll) override; + + /* Erase the content and display STRING. */ + void do_erase_source_content (const char *string); + + void rerender () override; + + virtual bool set_contents (struct gdbarch *gdbarch, + const struct symtab_and_line &sal) = 0; + +public: + + /* Refill the source window's source cache and update it. If this + is a disassembly window, then just update it. */ + void refill (); + + /* Set the location of the execution point. */ + void set_is_exec_point_at (struct tui_line_or_address l); + + void update_tab_width () override; + + virtual bool location_matches_p (struct bp_location *loc, int line_no) = 0; + + void update_exec_info (); + + /* Update the window to display the given location. Does nothing if + the location is already displayed. */ + virtual void maybe_update (struct frame_info *fi, symtab_and_line sal) = 0; + + void update_source_window_as_is (struct gdbarch *gdbarch, + const struct symtab_and_line &sal); + void update_source_window (struct gdbarch *gdbarch, + const struct symtab_and_line &sal); + + /* Scan the source window and the breakpoints to update the + break_mode information for each line. Returns true if something + changed and the execution window must be refreshed. See + tui_update_all_breakpoint_info for a description of + BEING_DELETED. */ + bool update_breakpoint_info (struct breakpoint *being_deleted, + bool current_only); + + /* Erase the source content. */ + virtual void erase_source_content () = 0; + + /* Used for horizontal scroll. */ + int horizontal_offset = 0; + struct tui_line_or_address start_line_or_addr; + + /* Architecture associated with code at this location. */ + struct gdbarch *gdbarch = nullptr; + + std::vector content; + +private: + + void show_source_content (); + + /* Called when the user "set style enabled" setting is changed. */ + void style_changed (); + + /* A token used to register and unregister an observer. */ + gdb::observers::token m_observable; +}; + + +/* A wrapper for a TUI window iterator that only iterates over source + windows. */ + +struct tui_source_window_iterator +{ +public: + + typedef tui_source_window_iterator self_type; + typedef struct tui_source_window_base *value_type; + typedef struct tui_source_window_base *&reference; + typedef struct tui_source_window_base **pointer; + typedef std::forward_iterator_tag iterator_category; + typedef int difference_type; + + explicit tui_source_window_iterator (bool dummy) + : m_iter (SRC_WIN) + { + advance (); + } + + tui_source_window_iterator () + : m_iter (tui_win_type (DISASSEM_WIN + 1)) + { + } + + bool operator!= (const self_type &other) const + { + return m_iter != other.m_iter; + } + + value_type operator* () const + { + return (value_type) *m_iter; + } + + self_type &operator++ () + { + ++m_iter; + advance (); + return *this; + } + +private: + + void advance () + { + tui_window_iterator end; + while (m_iter != end && *m_iter == nullptr) + ++m_iter; + } + + tui_window_iterator m_iter; +}; + +/* A range adapter for source windows. */ + +struct tui_source_windows +{ + tui_source_window_iterator begin () const + { + return tui_source_window_iterator (true); + } + + tui_source_window_iterator end () const + { + return tui_source_window_iterator (); + } +}; /* Update the execution windows to show the active breakpoints. This is called whenever a breakpoint is inserted, removed or has its - state changed. */ -extern void tui_update_all_breakpoint_info (void); - -/* Scan the source window and the breakpoints to update the hasBreak - information for each line. Returns 1 if something changed and the - execution window must be refreshed. */ -extern int tui_update_breakpoint_info (struct tui_win_info *win, - int current_only); + state changed. Normally BEING_DELETED is nullptr; if not nullptr, + it indicates a breakpoint that is in the process of being deleted, + and which should therefore be ignored by the update. This is done + because the relevant observer is notified before the breakpoint is + removed from the list of breakpoints. */ +extern void tui_update_all_breakpoint_info (struct breakpoint *being_deleted); /* Function to display the "main" routine. */ extern void tui_display_main (void); -extern void tui_update_source_window (struct tui_win_info *, - struct gdbarch *, struct symtab *, - struct tui_line_or_address, - int); -extern void tui_update_source_window_as_is (struct tui_win_info *, - struct gdbarch *, struct symtab *, - struct tui_line_or_address, - int); extern void tui_update_source_windows_with_addr (struct gdbarch *, CORE_ADDR); -extern void tui_update_source_windows_with_line (struct symtab *, - int); -extern void tui_clear_source_content (struct tui_win_info *, int); -extern void tui_erase_source_content (struct tui_win_info *, int); -extern void tui_show_source_content (struct tui_win_info *); -extern void tui_horizontal_source_scroll (struct tui_win_info *, - enum tui_scroll_direction, - int); -extern enum tui_status tui_set_exec_info_content (struct tui_win_info *); -extern void tui_show_exec_info_content (struct tui_win_info *); -extern void tui_erase_exec_info_content (struct tui_win_info *); -extern void tui_clear_exec_info_content (struct tui_win_info *); -extern void tui_update_exec_info (struct tui_win_info *); - -extern void tui_set_is_exec_point_at (struct tui_line_or_address, - struct tui_win_info *); -extern enum tui_status tui_alloc_source_buffer (struct tui_win_info *); -extern int tui_line_is_displayed (int, - struct tui_win_info *, - int); -extern int tui_addr_is_displayed (CORE_ADDR, - struct tui_win_info *, - int); - +extern void tui_update_source_windows_with_line (struct symtab_and_line sal); + +/* Extract some source text from PTR. LINE_NO is the line number. If + it is positive, it is printed at the start of the line. FIRST_COL + is the first column to extract, and LINE_WIDTH is the number of + characters to display. NDIGITS is used to format the line number + (if it is positive). If NDIGITS is greater than 0, then that many + digits are used; otherwise the line number is formatted with 6 + digits and the text is aligned to the next tab stop. Returns a + string holding the desired text. PTR is updated to point to the + start of the next line. */ + +extern std::string tui_copy_source_line (const char **ptr, + int line_no, int first_col, + int line_width, int ndigits); /* Constant definitions. */ #define SCROLL_THRESHOLD 2 /* Threshold for lazy scroll. */ -#endif +#endif /* TUI_TUI_WINSOURCE_H */