[35/58] gdbserver: turn target op 'read_loadmap' into a method

Message ID 6a2e98e311fc5d0aa76b9ab26e91e5032172febb.1581410934.git.tankut.baris.aktemur@intel.com
State Superseded
Headers show
Series
  • Turn gdbserver's process_stratum_target into a class
Related show

Commit Message

Tankut Baris Aktemur Feb. 11, 2020, 9:01 a.m.
gdbserver/ChangeLog:
2020-02-10  Tankut Baris Aktemur  <tankut.baris.aktemur@intel.com>

	Make process_stratum_target's read_loadmap op a method of
	process_target.

	* target.h (struct process_stratum_target): Remove the target op.
	(class process_target): Add the target op.  Also add
	'supports_read_loadmap'.
	* target.c (process_target::read_loadmap): Define.
	(process_target::supports_read_loadmap): Define.

	Update the derived structs and callers below.

	* server.c (handle_qxfer_fdpic): Update.
	(handle_query): Update.
	* linux-low.c (linux_target_ops): Update.
	(linux_process_target::supports_read_loadmap): Define.
	(linux_read_loadmap): Turn into ...
	(linux_process_target::read_loadmap): ... this.
	* linux-low.h (class linux_process_target): Update.
	* lynx-low.c (lynx_target_ops): Update.
	* nto-low.c (nto_target_ops): Update.
	* win32-low.c (win32_target_ops): Update.
---
 gdbserver/linux-low.c | 15 +++++++++------
 gdbserver/linux-low.h |  7 +++++++
 gdbserver/lynx-low.c  |  1 -
 gdbserver/nto-low.c   |  1 -
 gdbserver/server.c    |  6 +++---
 gdbserver/target.c    | 13 +++++++++++++
 gdbserver/target.h    | 11 +++++++----
 gdbserver/win32-low.c |  1 -
 8 files changed, 39 insertions(+), 16 deletions(-)

-- 
2.17.1

Patch

diff --git a/gdbserver/linux-low.c b/gdbserver/linux-low.c
index 713ad3af8aa..a048364242b 100644
--- a/gdbserver/linux-low.c
+++ b/gdbserver/linux-low.c
@@ -6472,9 +6472,15 @@  struct target_loadmap
 #  define LINUX_LOADMAP_INTERP	PTRACE_GETFDPIC_INTERP
 # endif
 
-static int
-linux_read_loadmap (const char *annex, CORE_ADDR offset,
-		    unsigned char *myaddr, unsigned int len)
+bool
+linux_process_target::supports_read_loadmap ()
+{
+  return true;
+}
+
+int
+linux_process_target::read_loadmap (const char *annex, CORE_ADDR offset,
+				    unsigned char *myaddr, unsigned int len)
 {
   int pid = lwpid_of (current_thread);
   int addr = -1;
@@ -6504,8 +6510,6 @@  linux_read_loadmap (const char *annex, CORE_ADDR offset,
   memcpy (myaddr, (char *) data + offset, copy_length);
   return copy_length;
 }
-#else
-# define linux_read_loadmap NULL
 #endif /* defined PT_GETDSBT || defined PTRACE_GETFDPIC */
 
 static void
@@ -7434,7 +7438,6 @@  linux_get_hwcap2 (int wordsize)
 static linux_process_target the_linux_target;
 
 static process_stratum_target linux_target_ops = {
-  linux_read_loadmap,
   linux_process_qsupported,
   linux_supports_tracepoints,
   linux_read_pc,
diff --git a/gdbserver/linux-low.h b/gdbserver/linux-low.h
index 57663ef9419..020db879ed3 100644
--- a/gdbserver/linux-low.h
+++ b/gdbserver/linux-low.h
@@ -380,6 +380,13 @@  public:
   int handle_monitor_command (char *mon) override;
 
   int core_of_thread (ptid_t ptid) override;
+
+#if defined PT_GETDSBT || defined PTRACE_GETFDPIC
+  bool supports_read_loadmap () override;
+
+  int read_loadmap (const char *annex, CORE_ADDR offset,
+		    unsigned char *myaddr, unsigned int len) override;
+#endif
 };
 
 #define get_thread_lwp(thr) ((struct lwp_info *) (thread_target_data (thr)))
diff --git a/gdbserver/lynx-low.c b/gdbserver/lynx-low.c
index aa744e5e6a3..d6eec84642e 100644
--- a/gdbserver/lynx-low.c
+++ b/gdbserver/lynx-low.c
@@ -735,7 +735,6 @@  static lynx_process_target the_lynx_target;
 /* The LynxOS target_ops vector.  */
 
 static process_stratum_target lynx_target_ops = {
-  NULL,  /* read_loadmap */
   NULL,  /* process_qsupported */
   NULL,  /* supports_tracepoints */
   NULL,  /* read_pc */
diff --git a/gdbserver/nto-low.c b/gdbserver/nto-low.c
index 1700fd54278..2bea7eae975 100644
--- a/gdbserver/nto-low.c
+++ b/gdbserver/nto-low.c
@@ -947,7 +947,6 @@  nto_sw_breakpoint_from_kind (int kind, int *size)
 static nto_process_target the_nto_target;
 
 static process_stratum_target nto_target_ops = {
-  NULL, /* read_loadmap */
   NULL, /* process_qsupported */
   NULL, /* supports_tracepoints */
   NULL, /* read_pc */
diff --git a/gdbserver/server.c b/gdbserver/server.c
index f9817881d77..df307f5594c 100644
--- a/gdbserver/server.c
+++ b/gdbserver/server.c
@@ -1792,13 +1792,13 @@  static int
 handle_qxfer_fdpic (const char *annex, gdb_byte *readbuf,
 		    const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
 {
-  if (the_target->read_loadmap == NULL)
+  if (!the_target->pt->supports_read_loadmap ())
     return -2;
 
   if (current_thread == NULL)
     return -1;
 
-  return (*the_target->read_loadmap) (annex, offset, readbuf, len);
+  return the_target->pt->read_loadmap (annex, offset, readbuf, len);
 }
 
 /* Handle qXfer:btrace:read.  */
@@ -2380,7 +2380,7 @@  handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
       if (the_target->pt->supports_qxfer_siginfo ())
 	strcat (own_buf, ";qXfer:siginfo:read+;qXfer:siginfo:write+");
 
-      if (the_target->read_loadmap != NULL)
+      if (the_target->pt->supports_read_loadmap ())
 	strcat (own_buf, ";qXfer:fdpic:read+");
 
       /* We always report qXfer:features:read, as targets may
diff --git a/gdbserver/target.c b/gdbserver/target.c
index e1c802d65bc..26b9d8b6afe 100644
--- a/gdbserver/target.c
+++ b/gdbserver/target.c
@@ -589,3 +589,16 @@  process_target::core_of_thread (ptid_t ptid)
 {
   return -1;
 }
+
+bool
+process_target::supports_read_loadmap ()
+{
+  return false;
+}
+
+int
+process_target::read_loadmap (const char *annex, CORE_ADDR offset,
+			      unsigned char *myaddr, unsigned int len)
+{
+  gdb_assert_not_reached ("target op read_loadmap not supported");
+}
diff --git a/gdbserver/target.h b/gdbserver/target.h
index 7b077a5a89a..bfced1b10dd 100644
--- a/gdbserver/target.h
+++ b/gdbserver/target.h
@@ -70,10 +70,6 @@  class process_target;
    shared code.  */
 struct process_stratum_target
 {
-  /* Read loadmaps.  Read LEN bytes at OFFSET into a buffer at MYADDR.  */
-  int (*read_loadmap) (const char *annex, CORE_ADDR offset,
-		       unsigned char *myaddr, unsigned int len);
-
   /* Target specific qSupported support.  FEATURES is an array of
      features with COUNT elements.  */
   void (*process_qsupported) (char **features, int count);
@@ -486,6 +482,13 @@  public:
 
   /* Returns the core given a thread, or -1 if not known.  */
   virtual int core_of_thread (ptid_t ptid);
+
+  /* Returns true if the read_loadmap target op is supported.  */
+  virtual bool supports_read_loadmap ();
+
+  /* Read loadmaps.  Read LEN bytes at OFFSET into a buffer at MYADDR.  */
+  virtual int read_loadmap (const char *annex, CORE_ADDR offset,
+			    unsigned char *myaddr, unsigned int len);
 };
 
 extern process_stratum_target *the_target;
diff --git a/gdbserver/win32-low.c b/gdbserver/win32-low.c
index bc1fdc845b7..39a81e0826e 100644
--- a/gdbserver/win32-low.c
+++ b/gdbserver/win32-low.c
@@ -1842,7 +1842,6 @@  win32_sw_breakpoint_from_kind (int kind, int *size)
 static win32_process_target the_win32_target;
 
 static process_stratum_target win32_target_ops = {
-  NULL, /* read_loadmap */
   NULL, /* process_qsupported */
   NULL, /* supports_tracepoints */
   NULL, /* read_pc */