public inbox for gdb-cvs@sourceware.org
help / color / mirror / Atom feed
* [binutils-gdb] gdb: unify two dis_asm_read_memory functions in disasm.c
@ 2022-06-15  9:03 Andrew Burgess
  0 siblings, 0 replies; only message in thread
From: Andrew Burgess @ 2022-06-15  9:03 UTC (permalink / raw)
  To: gdb-cvs

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=75033d08412577fb8ffcf76971e8d0393d14a8aa

commit 75033d08412577fb8ffcf76971e8d0393d14a8aa
Author: Andrew Burgess <aburgess@redhat.com>
Date:   Mon Apr 4 22:52:58 2022 +0100

    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.

Diff:
---
 gdb/disasm.c | 16 +++-------------
 gdb/disasm.h | 29 +++++++++++++++++------------
 2 files changed, 20 insertions(+), 25 deletions(-)

diff --git a/gdb/disasm.c b/gdb/disasm.c
index 53cd6f5b6bb..c6edc92930d 100644
--- a/gdb/disasm.c
+++ b/gdb/disasm.c
@@ -132,9 +132,9 @@ line_has_code_p (htab_t table, struct symtab *symtab, int line)
 /* Wrapper of target_read_code.  */
 
 int
-gdb_disassembler::dis_asm_read_memory (bfd_vma memaddr, gdb_byte *myaddr,
-				       unsigned int len,
-				       struct disassemble_info *info)
+gdb_disassembler_memory_reader::dis_asm_read_memory
+  (bfd_vma memaddr, gdb_byte *myaddr, unsigned int len,
+   struct disassemble_info *info)
 {
   return target_read_code (memaddr, myaddr, len);
 }
@@ -1021,16 +1021,6 @@ gdb_non_printing_disassembler::null_fprintf_styled_func
   return 0;
 }
 
-/* See disasm.h.  */
-
-int
-gdb_non_printing_memory_disassembler::dis_asm_read_memory
-  (bfd_vma memaddr, bfd_byte *myaddr, unsigned int length,
-   struct disassemble_info *dinfo)
-{
-  return target_read_code (memaddr, myaddr, length);
-}
-
 /* 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
diff --git a/gdb/disasm.h b/gdb/disasm.h
index ec5120351a1..da03e130526 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,


^ permalink raw reply	[flat|nested] only message in thread

only message in thread, other threads:[~2022-06-15  9:03 UTC | newest]

Thread overview: (only message) (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2022-06-15  9:03 [binutils-gdb] gdb: unify two dis_asm_read_memory functions in disasm.c Andrew Burgess

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).