diff options
author | Andrew Burgess <aburgess@redhat.com> | 2022-04-04 22:52:58 +0100 |
---|---|---|
committer | Andrew Burgess <aburgess@redhat.com> | 2022-06-15 09:44:55 +0100 |
commit | 75033d08412577fb8ffcf76971e8d0393d14a8aa (patch) | |
tree | 763dc80209f58c0cb6044eb6494cd7e1108a60ce /gdb/disasm.h | |
parent | 8b39b1e7ab20609ced6a224cae440f19e6ae02c1 (diff) | |
download | gdb-75033d08412577fb8ffcf76971e8d0393d14a8aa.zip gdb-75033d08412577fb8ffcf76971e8d0393d14a8aa.tar.gz gdb-75033d08412577fb8ffcf76971e8d0393d14a8aa.tar.bz2 |
gdb: unify two dis_asm_read_memory functions in disasm.c
After the recent restructuring of the disassembler code, GDB has ended
up with two identical class static functions, both called
dis_asm_read_memory, with identical implementations.
My first thought was to move these out of their respective classes,
and just make them global functions, then I'd only need a single
copy.
And maybe that's the right way to go. But I disliked that by doing
that I loose the encapsulation of the method with the corresponding
disassembler class.
So, instead, I placed the static method into its own class, and had
both the gdb_non_printing_memory_disassembler and gdb_disassembler
classes inherit from this new class as an additional base-class.
In terms of code generated, I don't think there's any significant
difference with this approach, but I think this better reflects how
the function is closely tied to the disassembler.
There should be no user visible changes after this commit.
Diffstat (limited to 'gdb/disasm.h')
-rw-r--r-- | gdb/disasm.h | 29 |
1 files changed, 17 insertions, 12 deletions
diff --git a/gdb/disasm.h b/gdb/disasm.h index ec51203..da03e13 100644 --- a/gdb/disasm.h +++ b/gdb/disasm.h @@ -165,31 +165,39 @@ private: ATTRIBUTE_PRINTF(3,4); }; +/* This is a helper class, for use as an additional base-class, by some of + the disassembler classes below. This class just defines a static method + for reading from target memory, which can then be used by the various + disassembler sub-classes. */ + +struct gdb_disassembler_memory_reader +{ + /* Implements the read_memory_func disassemble_info callback. */ + static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr, + unsigned int len, + struct disassemble_info *info); +}; + /* A non-printing disassemble_info management class. The disassemble_info setup by this class will not print anything to the output stream (there is no output stream), and the instruction to be disassembled will be read from target memory. */ struct gdb_non_printing_memory_disassembler - : public gdb_non_printing_disassembler + : public gdb_non_printing_disassembler, + private gdb_disassembler_memory_reader { /* Constructor. GDBARCH is the architecture to disassemble for. */ gdb_non_printing_memory_disassembler (struct gdbarch *gdbarch) :gdb_non_printing_disassembler (gdbarch, dis_asm_read_memory) { /* Nothing. */ } - -private: - - /* Implements the read_memory_func disassemble_info callback. */ - static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr, - unsigned int len, - struct disassemble_info *info); }; /* A dissassembler class that provides 'print_insn', a method for disassembling a single instruction to the output stream. */ -struct gdb_disassembler : public gdb_printing_disassembler +struct gdb_disassembler : public gdb_printing_disassembler, + private gdb_disassembler_memory_reader { gdb_disassembler (struct gdbarch *gdbarch, struct ui_file *file) : gdb_disassembler (gdbarch, file, dis_asm_read_memory) @@ -239,9 +247,6 @@ private: (currently just to addresses and symbols) as it goes. */ static bool use_ext_lang_colorization_p; - static int dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr, - unsigned int len, - struct disassemble_info *info); static void dis_asm_memory_error (int err, bfd_vma memaddr, struct disassemble_info *info); static void dis_asm_print_address (bfd_vma addr, |