summaryrefslogtreecommitdiff
path: root/gdb/disasm.c
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-07-18 22:07:10 -0600
committerTom Tromey <tom@tromey.com>2019-08-06 11:37:51 -0600
commit046bebe1c0a367687bd693eb4594fcdcba0b8f7e (patch)
tree38fdfa265e21d04c7bed98491f3bb7b4a8185ad8 /gdb/disasm.c
parentddbcedf5de138bc83d5d16554a3f44163dcaef7a (diff)
downloadbinutils-gdb-046bebe1c0a367687bd693eb4594fcdcba0b8f7e.tar.gz
Add more styling to "disassemble"
This adds more styling to the disassemble command. In particular, addresses and function names in the disassembly are now styled. This required fixing a small latent bug in set_output_style. This function always passed NULL to emit_style_escape; but when writing to a file other than gdb_stdout, it should emit the style escape directly. (FWIW this is another argument for better integrating the pager with ui_file and getting rid of this entire layer.) gdb/ChangeLog 2019-08-06 Tom Tromey <tom@tromey.com> * utils.c (set_output_style): Sometimes pass stream to emit_style_escape. * ui-out.h (class ui_out) <can_emit_style_escape>: Declare. * record-btrace.c (btrace_insn_history): Update. * mi/mi-out.h (class mi_ui_out) <can_emit_style_escape>: New method. * disasm.h (gdb_pretty_print_disassembler): Add uiout parameter. Update initializers. <m_uiout>: New field. <m_di>: Move lower. * disasm.c (gdb_pretty_print_disassembler::pretty_print_insn): Remove "uiout" parameter. (dump_insns): Update. * cli-out.h (class cli_ui_out) <can_emit_style_escape>: Declare. * cli-out.c (cli_ui_out::can_emit_style_escape): New method. gdb/testsuite/ChangeLog 2019-08-06 Tom Tromey <tom@tromey.com> * gdb.base/style.exp: Add disassemble test. * gdb.base/style.c (some_called_function): New function. (main): Use it.
Diffstat (limited to 'gdb/disasm.c')
-rw-r--r--gdb/disasm.c49
1 files changed, 24 insertions, 25 deletions
diff --git a/gdb/disasm.c b/gdb/disasm.c
index 0d4c9733a03..68da682c15e 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -191,8 +191,7 @@ compare_lines (const void *mle1p, const void *mle2p)
/* See disasm.h. */
int
-gdb_pretty_print_disassembler::pretty_print_insn (struct ui_out *uiout,
- const struct disasm_insn *insn,
+gdb_pretty_print_disassembler::pretty_print_insn (const struct disasm_insn *insn,
gdb_disassembly_flags flags)
{
/* parts of the symbolic representation of the address */
@@ -204,37 +203,37 @@ gdb_pretty_print_disassembler::pretty_print_insn (struct ui_out *uiout,
struct gdbarch *gdbarch = arch ();
{
- ui_out_emit_tuple tuple_emitter (uiout, NULL);
+ ui_out_emit_tuple tuple_emitter (m_uiout, NULL);
pc = insn->addr;
if (insn->number != 0)
{
- uiout->field_unsigned ("insn-number", insn->number);
- uiout->text ("\t");
+ m_uiout->field_unsigned ("insn-number", insn->number);
+ m_uiout->text ("\t");
}
if ((flags & DISASSEMBLY_SPECULATIVE) != 0)
{
if (insn->is_speculative)
{
- uiout->field_string ("is-speculative", "?");
+ m_uiout->field_string ("is-speculative", "?");
/* The speculative execution indication overwrites the first
character of the PC prefix.
We assume a PC prefix length of 3 characters. */
if ((flags & DISASSEMBLY_OMIT_PC) == 0)
- uiout->text (pc_prefix (pc) + 1);
+ m_uiout->text (pc_prefix (pc) + 1);
else
- uiout->text (" ");
+ m_uiout->text (" ");
}
else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
- uiout->text (pc_prefix (pc));
+ m_uiout->text (pc_prefix (pc));
else
- uiout->text (" ");
+ m_uiout->text (" ");
}
else if ((flags & DISASSEMBLY_OMIT_PC) == 0)
- uiout->text (pc_prefix (pc));
- uiout->field_core_addr ("address", gdbarch, pc);
+ m_uiout->text (pc_prefix (pc));
+ m_uiout->field_core_addr ("address", gdbarch, pc);
std::string name, filename;
bool omit_fname = ((flags & DISASSEMBLY_OMIT_FNAME) != 0);
@@ -243,19 +242,19 @@ gdb_pretty_print_disassembler::pretty_print_insn (struct ui_out *uiout,
{
/* We don't care now about line, filename and unmapped. But we might in
the future. */
- uiout->text (" <");
+ m_uiout->text (" <");
if (!omit_fname)
- uiout->field_string ("func-name", name.c_str (),
- ui_out_style_kind::FUNCTION);
+ m_uiout->field_string ("func-name", name.c_str (),
+ ui_out_style_kind::FUNCTION);
/* For negative offsets, avoid displaying them as +-N; the sign of
the offset takes the place of the "+" here. */
if (offset >= 0)
- uiout->text ("+");
- uiout->field_signed ("offset", offset);
- uiout->text (">:\t");
+ m_uiout->text ("+");
+ m_uiout->field_signed ("offset", offset);
+ m_uiout->text (">:\t");
}
else
- uiout->text (":\t");
+ m_uiout->text (":\t");
m_insn_stb.clear ();
@@ -279,15 +278,15 @@ gdb_pretty_print_disassembler::pretty_print_insn (struct ui_out *uiout,
spacer = " ";
}
- uiout->field_stream ("opcodes", m_opcode_stb);
- uiout->text ("\t");
+ m_uiout->field_stream ("opcodes", m_opcode_stb);
+ m_uiout->text ("\t");
}
else
size = m_di.print_insn (pc);
- uiout->field_stream ("inst", m_insn_stb);
+ m_uiout->field_stream ("inst", m_insn_stb);
}
- uiout->text ("\n");
+ m_uiout->text ("\n");
return size;
}
@@ -303,13 +302,13 @@ dump_insns (struct gdbarch *gdbarch,
memset (&insn, 0, sizeof (insn));
insn.addr = low;
- gdb_pretty_print_disassembler disasm (gdbarch);
+ gdb_pretty_print_disassembler disasm (gdbarch, uiout);
while (insn.addr < high && (how_many < 0 || num_displayed < how_many))
{
int size;
- size = disasm.pretty_print_insn (uiout, &insn, flags);
+ size = disasm.pretty_print_insn (&insn, flags);
if (size <= 0)
break;