/* The selected frame has changed. This is happens after a target stop or when the user explicitly changes the frame (up/down/thread/...). */ static void tui_selected_frame_level_changed_hook (int level) { struct frame_info *fi; fi = deprecated_selected_frame; /* Ensure that symbols for this frame are read in. Also, determine the source language of this frame, and switch to it if desired. */ if (fi) { struct symtab *s; s = find_pc_symtab (get_frame_pc (fi)); /* elz: this if here fixes the problem with the pc not being displayed in the tui asm layout, with no debug symbols. The value of s would be 0 here, and select_source_symtab would abort the command by calling the 'error' function */ if (s) select_source_symtab (s); /* Display the frame position (even if there is no symbols). */ tui_show_frame_info (fi); /* Refresh the register window if it's visible. */ if (tui_is_window_visible (DATA_WIN)) { tui_refreshing_registers = 1; tui_check_data_values (fi); tui_refreshing_registers = 0; } } }
void gdb_disassembly (struct ui_out *uiout, CORE_ADDR low, CORE_ADDR high, int mixed_source_and_assembly, int how_many) { struct ui_stream *stb = ui_out_stream_new (uiout); struct cleanup *cleanups = make_cleanup_ui_out_stream_delete (stb); struct disassemble_info di = gdb_disassemble_info (current_gdbarch, stb->stream); /* To collect the instruction outputted from opcodes. */ struct symtab *symtab = NULL; struct linetable_entry *le = NULL; int nlines = -1; /* Assume symtab is valid for whole PC range */ symtab = find_pc_symtab (low); if (symtab != NULL && symtab->linetable != NULL) { /* Convert the linetable to a bunch of my_line_entry's. */ le = symtab->linetable->item; nlines = symtab->linetable->nitems; } if (!mixed_source_and_assembly || nlines <= 0 || symtab == NULL || symtab->linetable == NULL) do_assembly_only (uiout, &di, low, high, how_many, stb); else if (mixed_source_and_assembly) do_mixed_source_and_assembly (uiout, &di, nlines, le, low, high, symtab, how_many, stb); do_cleanups (cleanups); gdb_flush (gdb_stdout); }
/* Function to display the disassembly window with disassembled code. */ void tui_show_disassem (CORE_ADDR start_addr) { struct symtab *s = find_pc_symtab (start_addr); struct tui_win_info * win_with_focus = tui_win_with_focus (); union tui_line_or_address val; val.addr = start_addr; tui_add_win_to_layout (DISASSEM_WIN); tui_update_source_window (TUI_DISASM_WIN, s, val, FALSE); /* ** if the focus was in the src win, put it in the asm win, if the ** source view isn't split */ if (tui_current_layout () != SRC_DISASSEM_COMMAND && win_with_focus == TUI_SRC_WIN) tui_set_win_focus_to (TUI_DISASM_WIN); return; }
/* Scroll the source forward or backward horizontally. */ void tui_horizontal_source_scroll (struct tui_win_info *win_info, enum tui_scroll_direction direction, int num_to_scroll) { if (win_info->generic.content != NULL) { struct gdbarch *gdbarch = win_info->detail.source_info.gdbarch; int offset; struct symtab *s = NULL; if (win_info->generic.type == SRC_WIN) { struct symtab_and_line cursal = get_current_source_symtab_and_line (); if (cursal.symtab == NULL) s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL))); else s = cursal.symtab; } if (direction == LEFT_SCROLL) offset = win_info->detail.source_info.horizontal_offset + num_to_scroll; else { offset = win_info->detail.source_info.horizontal_offset - num_to_scroll; if (offset < 0) offset = 0; } win_info->detail.source_info.horizontal_offset = offset; tui_update_source_window_as_is (win_info, gdbarch, s, ((struct tui_win_element *) win_info->generic.content[0])->which_element.source.line_or_addr, FALSE); } return; }
/* Scroll the source forward or backward vertically. */ void tui_vertical_source_scroll (enum tui_scroll_direction scroll_direction, int num_to_scroll) { if (TUI_SRC_WIN->generic.content != NULL) { struct tui_line_or_address l; struct symtab *s; tui_win_content content = (tui_win_content) TUI_SRC_WIN->generic.content; struct symtab_and_line cursal = get_current_source_symtab_and_line (); if (cursal.symtab == (struct symtab *) NULL) s = find_pc_symtab (get_frame_pc (get_selected_frame (NULL))); else s = cursal.symtab; l.loa = LOA_LINE; if (scroll_direction == FORWARD_SCROLL) { l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no + num_to_scroll; if (l.u.line_no > s->nlines) /* line = s->nlines - win_info->generic.content_size + 1; */ /* elz: fix for dts 23398. */ l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no; } else { l.u.line_no = content[0]->which_element.source.line_or_addr.u.line_no - num_to_scroll; if (l.u.line_no <= 0) l.u.line_no = 1; } print_source_lines (s, l.u.line_no, l.u.line_no + 1, 0); } }
/* ** tuiShowFrameInfo(). ** Function to print the frame inforrmation for the TUI. */ void tuiShowFrameInfo (struct frame_info *fi) { TuiWinInfoPtr winInfo; register int i; if (fi) { register int startLine, i; register struct symtab *s; CORE_ADDR low; TuiGenWinInfoPtr locator = locatorWinInfoPtr (); int sourceAlreadyDisplayed; s = find_pc_symtab (fi->pc); if (s == 0) return; startLine = 0; sourceAlreadyDisplayed = tuiSourceIsDisplayed (s->filename); tuiUpdateLocatorDisplay (fi); for (i = 0; i < (sourceWindows ())->count; i++) { TuiWhichElement *item; winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; item = &((TuiWinElementPtr) locator->content[0])->whichElement; if (winInfo == srcWin) { startLine = (item->locator.lineNo - (winInfo->generic.viewportHeight / 2)) + 1; if (startLine <= 0) startLine = 1; } else { if (find_pc_partial_function (fi->pc, (char **) NULL, &low, (CORE_ADDR) NULL) == 0) error ("No function contains program counter for selected frame.\n"); else low = tuiGetLowDisassemblyAddress (low, fi->pc); } if (winInfo == srcWin) { TuiLineOrAddress l; l.lineNo = startLine; if (!(sourceAlreadyDisplayed && tuiLineIsDisplayed (item->locator.lineNo, winInfo, TRUE))) tuiUpdateSourceWindow (winInfo, s, l, TRUE); else { l.lineNo = item->locator.lineNo; tuiSetIsExecPointAt (l, winInfo); } } else { if (winInfo == disassemWin) { TuiLineOrAddress a; a.addr = low; if (!tuiAddrIsDisplayed (item->locator.addr, winInfo, TRUE)) tuiUpdateSourceWindow (winInfo, s, a, TRUE); else { a.addr = item->locator.addr; tuiSetIsExecPointAt (a, winInfo); } } } tuiUpdateExecInfo (winInfo); } } else { tuiUpdateLocatorDisplay (fi); for (i = 0; i < (sourceWindows ())->count; i++) { winInfo = (TuiWinInfoPtr) (sourceWindows ())->list[i]; tuiClearSourceContent (winInfo, EMPTY_SOURCE_PROMPT); tuiUpdateExecInfo (winInfo); } } return; } /* tuiShowFrameInfo */