X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Ftui%2Ftui-winsource.c;h=fbee2e3e1813bc8acbcc393f9a704bb1d5230406;hb=7c392d1de1400202eb86f7679628c4b7c14f8108;hp=fad8d7ba11ec86c7ca2c60b28095870449054bef;hpb=61c33f105c71d27386e5b3cc6e1c5f71efe7ed01;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/tui/tui-winsource.c b/gdb/tui/tui-winsource.c index fad8d7ba11..fbee2e3e18 100644 --- a/gdb/tui/tui-winsource.c +++ b/gdb/tui/tui-winsource.c @@ -1,6 +1,6 @@ /* TUI display source/assembly window. - Copyright (C) 1998-2019 Free Software Foundation, Inc. + Copyright (C) 1998-2020 Free Software Foundation, Inc. Contributed by Hewlett-Packard Company. @@ -167,11 +167,10 @@ tui_source_window_base::style_changed () void tui_source_window_base::update_source_window (struct gdbarch *gdbarch, - struct symtab *s, - struct tui_line_or_address line_or_addr) + const struct symtab_and_line &sal) { horizontal_offset = 0; - update_source_window_as_is (gdbarch, s, line_or_addr); + update_source_window_as_is (gdbarch, sal); } @@ -180,10 +179,9 @@ tui_source_window_base::update_source_window void tui_source_window_base::update_source_window_as_is (struct gdbarch *gdbarch, - struct symtab *s, - struct tui_line_or_address line_or_addr) + const struct symtab_and_line &sal) { - bool ret = set_contents (gdbarch, s, line_or_addr); + bool ret = set_contents (gdbarch, sal); if (!ret) erase_source_content (); @@ -192,15 +190,6 @@ tui_source_window_base::update_source_window_as_is update_breakpoint_info (nullptr, false); show_source_content (); update_exec_info (); - if (type == SRC_WIN) - { - symtab_and_line sal; - - sal.line = line_or_addr.u.line_no + (content.size () - 2); - sal.symtab = s; - sal.pspace = SYMTAB_PSPACE (s); - set_current_source_symtab_and_line (sal); - } } } @@ -210,66 +199,27 @@ tui_source_window_base::update_source_window_as_is void tui_update_source_windows_with_addr (struct gdbarch *gdbarch, CORE_ADDR addr) { + struct symtab_and_line sal {}; if (addr != 0) - { - struct symtab_and_line sal = find_pc_line (addr, 0); - struct tui_line_or_address l; - - if (TUI_DISASM_WIN != nullptr) - { - l.loa = LOA_ADDRESS; - l.u.addr = addr; - TUI_DISASM_WIN->update_source_window (gdbarch, sal.symtab, l); - } + sal = find_pc_line (addr, 0); - if (TUI_SRC_WIN != nullptr) - { - l.loa = LOA_LINE; - l.u.line_no = sal.line; - TUI_SRC_WIN->update_source_window (gdbarch, sal.symtab, l); - } - } - else - { - for (struct tui_source_window_base *win_info : tui_source_windows ()) - win_info->erase_source_content (); - } + for (struct tui_source_window_base *win_info : tui_source_windows ()) + win_info->update_source_window (gdbarch, sal); } -/* Function to ensure that the source and/or disassemly windows - reflect the input address. */ +/* Function to ensure that the source and/or disassembly windows + reflect the symtab and line. */ void -tui_update_source_windows_with_line (struct symtab *s, int line) +tui_update_source_windows_with_line (struct symtab_and_line sal) { - struct gdbarch *gdbarch; - CORE_ADDR pc; - struct tui_line_or_address l; - - if (!s) + if (!sal.symtab) return; - gdbarch = get_objfile_arch (SYMTAB_OBJFILE (s)); + find_line_pc (sal.symtab, sal.line, &sal.pc); + struct gdbarch *gdbarch = get_objfile_arch (SYMTAB_OBJFILE (sal.symtab)); - switch (tui_current_layout ()) - { - case DISASSEM_COMMAND: - case DISASSEM_DATA_COMMAND: - find_line_pc (s, line, &pc); - tui_update_source_windows_with_addr (gdbarch, pc); - break; - default: - l.loa = LOA_LINE; - l.u.line_no = line; - TUI_SRC_WIN->update_source_window (gdbarch, s, l); - if (tui_current_layout () == SRC_DISASSEM_COMMAND) - { - find_line_pc (s, line, &pc); - l.loa = LOA_ADDRESS; - l.u.addr = pc; - TUI_DISASM_WIN->update_source_window (gdbarch, s, l); - } - break; - } + for (struct tui_source_window_base *win_info : tui_source_windows ()) + win_info->update_source_window (gdbarch, sal); } void @@ -366,33 +316,26 @@ tui_source_window_base::rerender () { if (!content.empty ()) { - struct tui_line_or_address line_or_addr; struct symtab_and_line cursal = get_current_source_symtab_and_line (); - line_or_addr = start_line_or_addr; - update_source_window (gdbarch, cursal.symtab, line_or_addr); + if (start_line_or_addr.loa == LOA_LINE) + cursal.line = start_line_or_addr.u.line_no; + else + cursal.pc = start_line_or_addr.u.addr; + update_source_window (gdbarch, cursal); } else if (deprecated_safe_get_selected_frame () != NULL) { - struct tui_line_or_address line; struct symtab_and_line cursal = get_current_source_symtab_and_line (); struct frame_info *frame = deprecated_safe_get_selected_frame (); struct gdbarch *gdbarch = get_frame_arch (frame); struct symtab *s = find_pc_line_symtab (get_frame_pc (frame)); - if (type == SRC_WIN) - { - line.loa = LOA_LINE; - line.u.line_no = cursal.line; - } - else - { - line.loa = LOA_ADDRESS; - find_line_pc (s, cursal.line, &line.u.addr); - } - update_source_window (gdbarch, s, line); + if (type != SRC_WIN) + find_line_pc (s, cursal.line, &cursal.pc); + update_source_window (gdbarch, cursal); } else erase_source_content (); @@ -403,17 +346,28 @@ tui_source_window_base::rerender () void tui_source_window_base::refill () { - symtab *s = nullptr; + symtab_and_line sal {}; if (type == SRC_WIN) { - symtab_and_line cursal = get_current_source_symtab_and_line (); - s = (cursal.symtab == NULL - ? find_pc_line_symtab (get_frame_pc (get_selected_frame (NULL))) - : cursal.symtab); + sal = get_current_source_symtab_and_line (); + if (sal.symtab == NULL) + { + struct frame_info *fi = deprecated_safe_get_selected_frame (); + if (fi != nullptr) + sal = find_pc_line (get_frame_pc (fi), 0); + } } - update_source_window_as_is (gdbarch, s, content[0].line_or_addr); + if (sal.pspace == nullptr) + sal.pspace = current_program_space; + + if (start_line_or_addr.loa == LOA_LINE) + sal.line = start_line_or_addr.u.line_no; + else + sal.pc = start_line_or_addr.u.addr; + + update_source_window_as_is (gdbarch, sal); } /* Scroll the source forward or backward horizontally. */