void gdb_disassembly (struct gdbarch *gdbarch, struct ui_out *uiout, char *file_string, int flags, int how_many, CORE_ADDR low, CORE_ADDR high) { struct ui_file *stb = mem_fileopen (); struct cleanup *cleanups = make_cleanup_ui_file_delete (stb); struct disassemble_info di = gdb_disassemble_info (gdbarch, stb); struct symtab *symtab; struct linetable_entry *le = NULL; int nlines = -1; /* Assume symtab is valid for whole PC range. */ symtab = find_pc_line_symtab (low); if (symtab != NULL && SYMTAB_LINETABLE (symtab) != NULL) { /* Convert the linetable to a bunch of my_line_entry's. */ le = SYMTAB_LINETABLE (symtab)->item; nlines = SYMTAB_LINETABLE (symtab)->nitems; } if (!(flags & DISASSEMBLY_SOURCE) || nlines <= 0 || symtab == NULL || SYMTAB_LINETABLE (symtab) == NULL) do_assembly_only (gdbarch, uiout, &di, low, high, how_many, flags, stb); else if (flags & DISASSEMBLY_SOURCE) do_mixed_source_and_assembly (gdbarch, uiout, &di, nlines, le, low, high, symtab, how_many, flags, stb); do_cleanups (cleanups); gdb_flush (gdb_stdout); }
static void tui_refresh_frame_and_register_information (int registers_too_p) { struct frame_info *fi; CORE_ADDR pc; struct cleanup *old_chain; int frame_info_changed_p; if (!has_stack_frames ()) return; old_chain = make_cleanup_restore_target_terminal (); target_terminal_ours_for_output (); fi = get_selected_frame (NULL); /* Ensure that symbols for this frame are read in. Also, determine the source language of this frame, and switch to it if desired. */ if (get_frame_pc_if_available (fi, &pc)) { struct symtab *s; s = find_pc_line_symtab (pc); /* 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 or the PC is not known). */ frame_info_changed_p = tui_show_frame_info (fi); /* Refresh the register window if it's visible. */ if (tui_is_window_visible (DATA_WIN) && (frame_info_changed_p || registers_too_p)) { tui_refreshing_registers = 1; tui_check_data_values (fi); tui_refreshing_registers = 0; } do_cleanups (old_chain); }
/* Function to display the disassembly window with disassembled code. */ void tui_show_disassem (struct gdbarch *gdbarch, CORE_ADDR start_addr) { struct symtab *s = find_pc_line_symtab (start_addr); struct tui_win_info *win_with_focus = tui_win_with_focus (); struct tui_line_or_address val; val.loa = LOA_ADDRESS; val.u.addr = start_addr; tui_add_win_to_layout (DISASSEM_WIN); tui_update_source_window (TUI_DISASM_WIN, gdbarch, 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_line_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, win_info->generic.content[0] ->which_element.source.line_or_addr, FALSE); } return; }
/* Function to display the "main" routine. */ void tui_display_main (void) { if ((tui_source_windows ())->count > 0) { struct gdbarch *gdbarch; CORE_ADDR addr; tui_get_begin_asm_address (&gdbarch, &addr); if (addr != (CORE_ADDR) 0) { struct symtab *s; tui_update_source_windows_with_addr (gdbarch, addr); s = find_pc_line_symtab (addr); if (s != NULL) tui_update_locator_fullname (symtab_to_fullname (s)); else tui_update_locator_fullname ("??"); } } }