diff options
author | Andrew Burgess <aburgess@redhat.com> | 2022-04-04 15:48:19 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2022-06-15 09:44:55 +0100 |
commit | 8b39b1e7ab20609ced6a224cae440f19e6ae02c1 (patch) | |
tree | 015e347bb39704d9424f3068c1ea372146d90b48 /gdb/arc-tdep.h | |
parent | 15e15b2d9cd3b1db68f99cd3b047352142ddfd1c (diff) | |
download | gdb-8b39b1e7ab20609ced6a224cae440f19e6ae02c1.zip gdb-8b39b1e7ab20609ced6a224cae440f19e6ae02c1.tar.gz gdb-8b39b1e7ab20609ced6a224cae440f19e6ae02c1.tar.bz2 |
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.
Diffstat (limited to 'gdb/arc-tdep.h')
-rw-r--r-- | gdb/arc-tdep.h | 5 |
1 files changed, 0 insertions, 5 deletions
diff --git a/gdb/arc-tdep.h b/gdb/arc-tdep.h index ceca003..53e5d84 100644 --- a/gdb/arc-tdep.h +++ b/gdb/arc-tdep.h @@ -186,11 +186,6 @@ arc_arch_is_em (const struct bfd_arch_info* arch) can't be set to an actual NULL value - that would cause a crash. */ int arc_delayed_print_insn (bfd_vma addr, struct disassemble_info *info); -/* Return properly initialized disassemble_info for ARC disassembler - it will - not print disassembled instructions to stderr. */ - -struct disassemble_info arc_disassemble_info (struct gdbarch *gdbarch); - /* Get branch/jump target address for the INSN. Note that this function returns branch target and doesn't evaluate if this branch is taken or not. For the indirect jumps value depends in register state, hence can change. |