gdb: refactor the non-printing disassemblers
authorAndrew Burgess <aburgess@redhat.com>
Mon, 4 Apr 2022 14:48:19 +0000 (15:48 +0100)
committerAndrew Burgess <aburgess@redhat.com>
Wed, 15 Jun 2022 08:44:55 +0000 (09:44 +0100)
commit8b39b1e7ab20609ced6a224cae440f19e6ae02c1
tree015e347bb39704d9424f3068c1ea372146d90b48
parent15e15b2d9cd3b1db68f99cd3b047352142ddfd1c
gdb: refactor the non-printing disassemblers

This commit started from an observation I made while working on some
other disassembler patches, that is, that the function
gdb_buffered_insn_length, is broken ... sort of.

I noticed that the gdb_buffered_insn_length function doesn't set up
the application data field if the disassemble_info structure.

Further, I noticed that some architectures, for example, ARM, require
that the application_data field be set, see gdb_print_insn_arm in
arm-tdep.c.

And so, if we ever use gdb_buffered_insn_length for ARM, then GDB will
likely crash.  Which is why I said only "sort of" broken.  Right now
we don't use gdb_buffered_insn_length with ARM, so maybe it isn't
broken yet?

Anyway to prove to myself that there was a problem here I extended the
disassembler self tests in disasm-selftests.c to include a test of
gdb_buffered_insn_length.  As I run the test for all architectures, I
do indeed see GDB crash for ARM.

To fix this we need gdb_buffered_insn_length to create a disassembler
that inherits from gdb_disassemble_info, but we also need this new
disassembler to not print anything.

And so, I introduce a new gdb_non_printing_disassembler class, this is
a disassembler that doesn't print anything to the output stream.

I then observed that both ARC and S12Z also create non-printing
disassemblers, but these are slightly different.  While the
disassembler in gdb_non_printing_disassembler reads the instruction
from a buffer, the ARC and S12Z disassemblers read from target memory
using target_read_code.

And so, I further split gdb_non_printing_disassembler into two
sub-classes, gdb_non_printing_memory_disassembler and
gdb_non_printing_buffer_disassembler.

The new selftests now pass, but otherwise, there should be no user
visible changes after this commit.
gdb/arc-linux-tdep.c
gdb/arc-tdep.c
gdb/arc-tdep.h
gdb/disasm-selftests.c
gdb/disasm.c
gdb/disasm.h
gdb/s12z-tdep.c