diff options
author | Tom Tromey <tom@tromey.com> | 2019-07-06 15:04:12 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-08-15 12:29:28 -0600 |
commit | a54700c6c45ea424b668f2201ef14906f2052412 (patch) | |
tree | e379e5c24176b5ea9c3017b56a66374f144932f4 | |
parent | e2a678a557b52816a7aa45902a6519bc1cae918e (diff) | |
download | binutils-a54700c6c45ea424b668f2201ef14906f2052412.zip binutils-a54700c6c45ea424b668f2201ef14906f2052412.tar.gz binutils-a54700c6c45ea424b668f2201ef14906f2052412.tar.bz2 |
Move contents of tui_show_frame_info to new method
This moves much of the body of tui_show_frame_info to a new method on
tui_source_window_base. This removes a check for the type of a
window.
gdb/ChangeLog
2019-08-15 Tom Tromey <tom@tromey.com>
* tui/tui-winsource.h (struct tui_source_window_base)
<maybe_update>: Declare.
* tui/tui-stack.c (tui_show_frame_info): Call maybe_update
method.
* tui/tui-source.h (struct tui_source_window) <maybe_update>:
Declare.
* tui/tui-source.c (tui_source_window::maybe_update): New method.
* tui/tui-disasm.h (struct tui_disasm_window) <maybe_update>:
Declare.
* tui/tui-disasm.c (tui_disasm_window::maybe_update): New method.
-rw-r--r-- | gdb/ChangeLog | 13 | ||||
-rw-r--r-- | gdb/tui/tui-disasm.c | 31 | ||||
-rw-r--r-- | gdb/tui/tui-disasm.h | 4 | ||||
-rw-r--r-- | gdb/tui/tui-source.c | 26 | ||||
-rw-r--r-- | gdb/tui/tui-source.h | 4 | ||||
-rw-r--r-- | gdb/tui/tui-stack.c | 58 | ||||
-rw-r--r-- | gdb/tui/tui-winsource.h | 6 |
7 files changed, 85 insertions, 57 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 58fa44d..b0da5a1 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,18 @@ 2019-08-15 Tom Tromey <tom@tromey.com> + * tui/tui-winsource.h (struct tui_source_window_base) + <maybe_update>: Declare. + * tui/tui-stack.c (tui_show_frame_info): Call maybe_update + method. + * tui/tui-source.h (struct tui_source_window) <maybe_update>: + Declare. + * tui/tui-source.c (tui_source_window::maybe_update): New method. + * tui/tui-disasm.h (struct tui_disasm_window) <maybe_update>: + Declare. + * tui/tui-disasm.c (tui_disasm_window::maybe_update): New method. + +2019-08-15 Tom Tromey <tom@tromey.com> + * tui/tui-stack.c (tui_make_status_line): Use string constructor. 2019-08-15 Tom Tromey <tom@tromey.com> diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index a442a00..fcb33bc 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -380,3 +380,34 @@ tui_disasm_window::location_matches_p (struct bp_location *loc, int line_no) return (content[line_no].line_or_addr.loa == LOA_ADDRESS && content[line_no].line_or_addr.u.addr == loc->address); } + +void +tui_disasm_window::maybe_update (struct frame_info *fi, symtab_and_line sal, + int line_no, CORE_ADDR addr) +{ + CORE_ADDR low; + + if (find_pc_partial_function (get_frame_pc (fi), + NULL, &low, NULL) == 0) + { + /* There is no symbol available for current PC. There is no + safe way how to "disassemble backwards". */ + low = get_frame_pc (fi); + } + else + low = tui_get_low_disassembly_address (get_frame_arch (fi), + low, get_frame_pc (fi)); + + struct tui_line_or_address a; + + a.loa = LOA_ADDRESS; + a.u.addr = low; + if (!tui_addr_is_displayed (addr, this, TRUE)) + tui_update_source_window (this, get_frame_arch (fi), + sal.symtab, a, TRUE); + else + { + a.u.addr = addr; + set_is_exec_point_at (a); + } +} diff --git a/gdb/tui/tui-disasm.h b/gdb/tui/tui-disasm.h index 19672a7..20bc429 100644 --- a/gdb/tui/tui-disasm.h +++ b/gdb/tui/tui-disasm.h @@ -44,6 +44,10 @@ struct tui_disasm_window : public tui_source_window_base bool location_matches_p (struct bp_location *loc, int line_no) override; + void maybe_update (struct frame_info *fi, symtab_and_line sal, + int line_no, CORE_ADDR addr) + override; + protected: void do_scroll_vertical (int num_to_scroll) override; diff --git a/gdb/tui/tui-source.c b/gdb/tui/tui-source.c index 619d937..34b8f54 100644 --- a/gdb/tui/tui-source.c +++ b/gdb/tui/tui-source.c @@ -293,3 +293,29 @@ tui_source_window::location_matches_p (struct bp_location *loc, int line_no) && filename_cmp (fullname, symtab_to_fullname (loc->symtab)) == 0); } + +void +tui_source_window::maybe_update (struct frame_info *fi, symtab_and_line sal, + int line_no, CORE_ADDR addr) +{ + int start_line = (line_no - (viewport_height / 2)) + 1; + if (start_line <= 0) + start_line = 1; + + bool source_already_displayed = (sal.symtab != 0 + && showing_source_p (fullname)); + + struct tui_line_or_address l; + + l.loa = LOA_LINE; + l.u.line_no = start_line; + if (!(source_already_displayed + && tui_line_is_displayed (line_no, this, TRUE))) + tui_update_source_window (this, get_frame_arch (fi), + sal.symtab, l, TRUE); + else + { + l.u.line_no = line_no; + set_is_exec_point_at (l); + } +} diff --git a/gdb/tui/tui-source.h b/gdb/tui/tui-source.h index 49d79ab..dc4470e 100644 --- a/gdb/tui/tui-source.h +++ b/gdb/tui/tui-source.h @@ -47,6 +47,10 @@ struct tui_source_window : public tui_source_window_base bool showing_source_p (const char *filename) const; + void maybe_update (struct frame_info *fi, symtab_and_line sal, + int line_no, CORE_ADDR addr) + override; + protected: void do_scroll_vertical (int num_to_scroll) override; diff --git a/gdb/tui/tui-stack.c b/gdb/tui/tui-stack.c index 1d7491d..09ee87f 100644 --- a/gdb/tui/tui-stack.c +++ b/gdb/tui/tui-stack.c @@ -364,7 +364,6 @@ tui_show_frame_info (struct frame_info *fi) if (fi) { struct tui_locator_window *locator = tui_locator_win_info_ptr (); - int source_already_displayed; CORE_ADDR pc; symtab_and_line sal = find_frame_sal (fi); @@ -373,10 +372,6 @@ tui_show_frame_info (struct frame_info *fi) if (sal.symtab != nullptr) fullname = symtab_to_fullname (sal.symtab); - source_already_displayed = (sal.symtab != 0 - && TUI_SRC_WIN != nullptr - && TUI_SRC_WIN->showing_source_p (fullname)); - if (get_frame_pc_if_available (fi, &pc)) locator_changed_p = tui_set_locator_info (get_frame_arch (fi), @@ -399,58 +394,7 @@ tui_show_frame_info (struct frame_info *fi) tui_show_locator_content (); for (struct tui_source_window_base *win_info : tui_source_windows ()) { - if (win_info == TUI_SRC_WIN) - { - int start_line = (locator->line_no - - (win_info->viewport_height / 2)) + 1; - if (start_line <= 0) - start_line = 1; - - struct tui_line_or_address l; - - l.loa = LOA_LINE; - l.u.line_no = start_line; - if (!(source_already_displayed - && 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 = locator->line_no; - win_info->set_is_exec_point_at (l); - } - } - else - { - CORE_ADDR low; - - if (find_pc_partial_function (get_frame_pc (fi), - NULL, &low, NULL) == 0) - { - /* There is no symbol available for current PC. There is no - safe way how to "disassemble backwards". */ - low = get_frame_pc (fi); - } - else - low = tui_get_low_disassembly_address (get_frame_arch (fi), - low, get_frame_pc (fi)); - - struct tui_line_or_address a; - - a.loa = LOA_ADDRESS; - a.u.addr = low; - 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 = locator->addr; - win_info->set_is_exec_point_at (a); - } - } - + win_info->maybe_update (fi, sal, locator->line_no, locator->addr); win_info->update_exec_info (); } diff --git a/gdb/tui/tui-winsource.h b/gdb/tui/tui-winsource.h index abb7ea3..f2fd1eb 100644 --- a/gdb/tui/tui-winsource.h +++ b/gdb/tui/tui-winsource.h @@ -23,6 +23,7 @@ #define TUI_TUI_WINSOURCE_H #include "tui/tui-data.h" +#include "symtab.h" /* Flags to tell what kind of breakpoint is at current line. */ enum tui_bp_flag @@ -116,6 +117,11 @@ public: 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, + int line_no, CORE_ADDR addr) = 0; + /* Does the locator belong to this window? */ bool m_has_locator = false; /* Execution information window. */ |