diff options
author | Tom Tromey <tom@tromey.com> | 2019-07-18 22:07:10 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-08-06 11:37:51 -0600 |
commit | 046bebe1c0a367687bd693eb4594fcdcba0b8f7e (patch) | |
tree | 38fdfa265e21d04c7bed98491f3bb7b4a8185ad8 /gdb/disasm.c | |
parent | ddbcedf5de138bc83d5d16554a3f44163dcaef7a (diff) | |
download | gdb-046bebe1c0a367687bd693eb4594fcdcba0b8f7e.zip gdb-046bebe1c0a367687bd693eb4594fcdcba0b8f7e.tar.gz gdb-046bebe1c0a367687bd693eb4594fcdcba0b8f7e.tar.bz2 |
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.c | 49 |
1 files changed, 24 insertions, 25 deletions
diff --git a/gdb/disasm.c b/gdb/disasm.c index 0d4c973..68da682 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; |