44#include "gdbsupport/selftest.h"
63 const char *ptr = str.c_str ();
66 while ((c = *ptr) !=
'\0')
72 if (style.parse (ptr, &n_read))
104 std::vector<tui_asm_line> &asm_lines,
105 CORE_ADDR pc,
int count,
106 size_t *addr_size =
nullptr)
115 for (
int i = 0; i < count; ++i)
118 CORE_ADDR orig_pc = pc;
124 catch (
const gdb_exception_error &except)
129 if (except.error != MEMORY_ERROR)
142 if (addr_size !=
nullptr)
150 *addr_size = std::max (*addr_size, new_size);
154 asm_lines.push_back (std::move (tal));
172 if (msym.
minsym !=
nullptr)
174 else if (msym_prev.
minsym !=
nullptr)
181 return section->
addr ();
195 max_lines = (from > 0) ? from : - from;
199 std::vector<tui_asm_line> asm_lines;
208 if (asm_lines.empty ())
210 new_low = asm_lines.back ().addr;
237 gdb::optional<CORE_ADDR> possible_new_low;
251 if (asm_lines.empty ())
253 last_addr = asm_lines.back ().addr;
258 if (last_addr >= pc && new_low != prev_low
259 && asm_lines.size () >= max_lines)
260 possible_new_low.emplace (new_low);
267 while ((last_addr > pc
268 || (last_addr == pc && asm_lines.size () < max_lines))
269 && new_low != prev_low);
276 if (asm_lines.size () < max_lines)
278 if (!possible_new_low.has_value ())
282 new_low = *possible_new_low;
284 last_addr = asm_lines.back ().addr;
285 gdb_assert (asm_lines.size () >= max_lines);
292 int pos = max_lines - 1;
297 if (pos >= max_lines)
300 CORE_ADDR old_next_addr = next_addr;
301 std::vector<tui_asm_line> single_asm_line;
305 if (next_addr <= old_next_addr)
307 gdb_assert (single_asm_line.size () == 1);
308 asm_lines[pos] = single_asm_line[0];
309 }
while (next_addr <= pc);
311 if (pos >= max_lines)
313 new_low = asm_lines[pos].addr;
318 gdb_assert (new_low <= pc);
334 CORE_ADDR pc = sal.
pc;
347 std::vector<tui_asm_line> asm_lines;
348 size_t addr_size = 0;
352 insn_pos = (1 + (addr_size / tab_len)) * tab_len;
357 for (i = 0; i < max_lines; i++)
364 if (i < asm_lines.size ())
367 = (asm_lines[i].addr_string
368 +
n_spaces (insn_pos - asm_lines[i].addr_size)
369 + asm_lines[i].insn);
370 addr = asm_lines[i].addr;
378 const char *ptr = line.c_str ();
404 if (sal.
symtab !=
nullptr)
412 if (main_symbol.
minsym !=
nullptr)
431 CORE_ADDR low, CORE_ADDR pc)
473 &&
m_content[line_no].line_or_addr.u.addr ==
loc->address);
485 &&
m_content[i].line_or_addr.u.addr == addr)
561 selftests::register_test (
"tui-disasm", selftests::tui::disasm::run_tests);
struct gdbarch * get_current_arch(void)
bool find_pc_partial_function(CORE_ADDR pc, const char **name, CORE_ADDR *address, CORE_ADDR *endaddr, const struct block **block)
void print_address(struct gdbarch *, CORE_ADDR, struct ui_file *)
int gdb_print_insn(struct gdbarch *gdbarch, CORE_ADDR memaddr, struct ui_file *stream, int *branch_delay_insns)
struct gdbarch * get_frame_arch(frame_info_ptr this_frame)
struct inferior * current_inferior(void)
bound_minimal_symbol lookup_minimal_symbol_by_pc_section(CORE_ADDR pc_in, struct obj_section *section, lookup_msym_prefer prefer, bound_minimal_symbol *previous)
struct bound_minimal_symbol lookup_minimal_symbol(const char *name, const char *sfile, struct objfile *objf)
struct obj_section * find_pc_section(CORE_ADDR pc)
int have_partial_symbols(void)
int have_full_symbols(void)
struct program_space * current_program_space
struct symtab_and_line get_current_source_symtab_and_line(void)
void set_default_source_symtab_and_line(void)
CORE_ADDR value_address() const
struct minimal_symbol * minsym
struct program_space * pspace
bool set_contents(struct gdbarch *gdbarch, const struct symtab_and_line &sal) override
bool location_matches_p(struct bp_location *loc, int line_no) override
void maybe_update(frame_info_ptr fi, symtab_and_line sal) override
void do_scroll_vertical(int num_to_scroll) override
void display_start_addr(struct gdbarch **gdbarch_p, CORE_ADDR *addr_p) override
bool addr_is_displayed(CORE_ADDR addr) const
enum tui_line_or_address_kind loa
union tui_line_or_address::@192 u
struct gdbarch * gdbarch() const
struct tui_line_or_address line_or_addr
struct tui_line_or_address m_start_line_or_addr
void update_source_window(struct gdbarch *gdbarch, const struct symtab_and_line &sal)
struct gdbarch * m_gdbarch
std::vector< tui_source_element > m_content
void set_is_exec_point_at(struct tui_line_or_address l)
void update_source_window_as_is(struct gdbarch *gdbarch, const struct symtab_and_line &sal)
bool find_line_pc(struct symtab *symtab, int line, CORE_ADDR *pc)
int tui_term_height(void)
unsigned int tui_tab_width
void _initialize_tui_disasm()
static CORE_ADDR tui_disassemble(struct gdbarch *gdbarch, std::vector< tui_asm_line > &asm_lines, CORE_ADDR pc, int count, size_t *addr_size=nullptr)
static CORE_ADDR tui_find_disassembly_address(struct gdbarch *gdbarch, CORE_ADDR pc, int from)
static CORE_ADDR tui_find_backward_disassembly_start_address(CORE_ADDR addr)
static size_t len_without_escapes(const std::string &str)
CORE_ADDR tui_get_low_disassembly_address(struct gdbarch *gdbarch, CORE_ADDR low, CORE_ADDR pc)
void tui_get_begin_asm_address(struct gdbarch **gdbarch_p, CORE_ADDR *addr_p)
tui_location_tracker tui_location
std::string tui_copy_source_line(const char **ptr, int *length)
const char * n_spaces(int n)