diff --git a/gdb/tui/tui-disasm.c b/gdb/tui/tui-disasm.c index 163552aede4..e6ddfcd90cc 100644 --- a/gdb/tui/tui-disasm.c +++ b/gdb/tui/tui-disasm.c @@ -27,6 +27,7 @@ #include "value.h" #include "source.h" #include "disasm.h" +#include "valprint.h" #include "tui/tui.h" #include "tui/tui-command.h" #include "tui/tui-data.h" @@ -48,6 +49,7 @@ struct tui_asm_line { CORE_ADDR addr; std::string addr_string; + std::string func_string; size_t addr_size; std::string insn; }; @@ -101,7 +103,8 @@ static CORE_ADDR tui_disassemble (struct gdbarch *gdbarch, std::vector &asm_lines, CORE_ADDR pc, int count, - size_t *addr_size = nullptr) + size_t *addr_size = nullptr, + bool for_ui = false) { bool term_out = source_styling && gdb_stdout->can_emit_style_escape (); string_file gdb_dis_out (term_out); @@ -110,7 +113,7 @@ tui_disassemble (struct gdbarch *gdbarch, asm_lines.clear (); /* Now construct each line. */ - for (int i = 0; i < count; ++i) + while (asm_lines.size() < count) { tui_asm_line tal; CORE_ADDR orig_pc = pc; @@ -135,8 +138,45 @@ tui_disassemble (struct gdbarch *gdbarch, /* And capture the address the instruction is at. */ tal.addr = orig_pc; - print_address (gdbarch, orig_pc, &gdb_dis_out); - tal.addr_string = std::move (gdb_dis_out.string ()); + if(for_ui) + { + std::string name, filename; + int unmapped = 0, offset = 0, line = 0; + + if (0 == build_address_symbolic (gdbarch, orig_pc, asm_demangle, false, + &name, &offset, &filename, &line, &unmapped)) + { + if (0 == offset) + { + tui_asm_line tal2 = tal; + fputs_styled (name.c_str (), function_name_style.style (), &gdb_dis_out); + fputs_filtered (":", &gdb_dis_out); + tal2.func_string = name; + tal2.addr_string = std::move (gdb_dis_out.string ()); + tal2.addr_size = 0; + tal2.insn.clear (); + gdb_dis_out.clear (); + + asm_lines.push_back (std::move (tal2)); + } + + fputs_styled (paddress (gdbarch, orig_pc), address_style.style (), &gdb_dis_out); + fputs_filtered (" <", &gdb_dis_out); + if (unmapped) + fputs_filtered ("*", &gdb_dis_out); + fprintf_styled (&gdb_dis_out, address_style.style(), "%+d", offset); + if (unmapped) + fputs_filtered ("*", &gdb_dis_out); + fputs_filtered (">", &gdb_dis_out); + tal.addr_string = std::move (gdb_dis_out.string ()); + tal.func_string = std::move (name); + } + } + else + { + print_address (gdbarch, orig_pc, &gdb_dis_out); + tal.addr_string = std::move (gdb_dis_out.string ()); + } gdb_dis_out.clear (); if (addr_size != nullptr) @@ -342,7 +382,12 @@ tui_disasm_window::set_contents (struct gdbarch *arch, /* Get temporary table that will hold all strings (addr & insn). */ std::vector asm_lines; size_t addr_size = 0; - tui_disassemble (m_gdbarch, asm_lines, pc, max_lines, &addr_size); + tui_disassemble (m_gdbarch, asm_lines, pc, max_lines, &addr_size, true); + + /* Set title to current function name */ + title.clear(); + if (asm_lines.size()) + title = asm_lines.front().func_string; /* Align instructions to the same column. */ insn_pos = (1 + (addr_size / tab_len)) * tab_len;