Make inf_ptrace_trad Linux-only, move to separate file
authorPedro Alves <palves@redhat.com>
Wed, 2 May 2018 23:37:08 +0000 (00:37 +0100)
committerPedro Alves <palves@redhat.com>
Wed, 2 May 2018 23:47:32 +0000 (00:47 +0100)
There are only two inf_ptrace_trad_target users, MIPS GNU/Linux and
Alpha GNU/Linux.  They both call it via linux_trad_target.

Move this code out of inf-ptrace.c to a GNU/Linux-specific new file.

Making this code be GNU/Linux-specific simplifies C++ification of
target_ops, because we can make the trad target inherit linux_nat
instead of inheriting inf_ptrace.  That'll be visible in a later patch.

Note this makes linux_target_install_ops an extern function, but that
is temporary -- the function will disappear once target_ops is made a
C++ class with virtual methods, later in the series.  Also, I did not
rename the functions in the new file for a similar reason.  They'll be
renamed again anyway in a couple of patches.

gdb/ChangeLog:
2018-05-02  Pedro Alves  <palves@redhat.com>

* alpha-linux-nat.c: Include "linux-nat-trad.h" instead of
"linux-nat.h".
* configure.nat (alpha-linux, linux-mips): Add linux-nat-trad.o.
* inf-ptrace.c (inf_ptrace_register_u_offset)
(inf_ptrace_fetch_register, inf_ptrace_fetch_registers)
(inf_ptrace_store_register, inf_ptrace_store_registers)
(inf_ptrace_trad_target): Move to ...
* linux-nat-trad.c: ... this new file.
* linux-nat-trad.h: New file.
* linux-nat.c (linux_target_install_ops): Make extern.
(linux_trad_target): Delete.
* linux-nat.h (linux_trad_target): Delete declaration.
(linux_target_install_ops): Declare.
* mips-linux-nat.c: Include "linux-nat-trad.h" instead of
"linux-nat.h".

gdb/ChangeLog
gdb/alpha-linux-nat.c
gdb/configure.nat
gdb/inf-ptrace.c
gdb/linux-nat-trad.c [new file with mode: 0644]
gdb/linux-nat-trad.h [new file with mode: 0644]
gdb/linux-nat.c
gdb/linux-nat.h
gdb/mips-linux-nat.c

index 0d2624bdb16d7e4f6212144c4e3966dc8d9c51d9..9dad5362ec589909f3ee759f20c2f75f3d151ca1 100644 (file)
@@ -1,3 +1,21 @@
+2018-05-02  Pedro Alves  <palves@redhat.com>
+
+       * alpha-linux-nat.c: Include "linux-nat-trad.h" instead of
+       "linux-nat.h".
+       * configure.nat (alpha-linux, linux-mips): Add linux-nat-trad.o.
+       * inf-ptrace.c (inf_ptrace_register_u_offset)
+       (inf_ptrace_fetch_register, inf_ptrace_fetch_registers)
+       (inf_ptrace_store_register, inf_ptrace_store_registers)
+       (inf_ptrace_trad_target): Move to ...
+       * linux-nat-trad.c: ... this new file.
+       * linux-nat-trad.h: New file.
+       * linux-nat.c (linux_target_install_ops): Make extern.
+       (linux_trad_target): Delete.
+       * linux-nat.h (linux_trad_target): Delete declaration.
+       (linux_target_install_ops): Declare.
+       * mips-linux-nat.c: Include "linux-nat-trad.h" instead of
+       "linux-nat.h".
+
 2018-05-02  Pedro Alves  <palves@redhat.com>
 
        * i386-sol2-nat.c (_initialize_amd64_sol2_nat): Don't call
index 7afce023af34533a238be21fcd8b0f63188ecc9a..8d46af41769b06e4ea180e362866646b59aae30f 100644 (file)
@@ -19,7 +19,7 @@
 #include "defs.h"
 #include "target.h"
 #include "regcache.h"
-#include "linux-nat.h"
+#include "linux-nat-trad.h"
 
 #include "alpha-tdep.h"
 
index 2cd9c4f68e705c37bb0629836c91f780226910f7..6b0f44fede62aa7bf14dae9c82e5cabe6410d014 100644 (file)
@@ -115,7 +115,7 @@ case ${gdb_host} in
        case ${gdb_host_cpu} in
            alpha)
                # Host: Little-endian Alpha running Linux
-               NATDEPFILES="${NATDEPFILES} alpha-linux-nat.o"
+               NATDEPFILES="${NATDEPFILES} linux-nat-trad.o alpha-linux-nat.o"
                # doublest.c currently assumes some properties of FP arithmetic
                # on the host which require this.
                MH_CFLAGS='-mieee'
@@ -255,8 +255,8 @@ case ${gdb_host} in
                ;;
            mips)
                # Host: Linux/MIPS
-               NATDEPFILES="${NATDEPFILES} mips-linux-nat.o \
-               mips-linux-watch.o"
+               NATDEPFILES="${NATDEPFILES} linux-nat-trad.o \
+               mips-linux-nat.o mips-linux-watch.o"
                ;;
            pa)
                # Host: Hewlett-Packard PA-RISC machine, running Linux
index 942494bbdacdb57a172455cc5b89f11fe4d527fa..1fd41bf4ed784c0508a755789fdd6707a560b440 100644 (file)
@@ -702,138 +702,3 @@ inf_ptrace_target (void)
   return t;
 }
 \f
-
-/* Pointer to a function that returns the offset within the user area
-   where a particular register is stored.  */
-static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
-
-/* Fetch register REGNUM from the inferior.  */
-
-static void
-inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
-{
-  struct gdbarch *gdbarch = regcache->arch ();
-  CORE_ADDR addr;
-  size_t size;
-  PTRACE_TYPE_RET *buf;
-  pid_t pid;
-  int i;
-
-  /* This isn't really an address, but ptrace thinks of it as one.  */
-  addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
-  if (addr == (CORE_ADDR)-1
-      || gdbarch_cannot_fetch_register (gdbarch, regnum))
-    {
-      regcache_raw_supply (regcache, regnum, NULL);
-      return;
-    }
-
-  pid = get_ptrace_pid (regcache_get_ptid (regcache));
-
-  size = register_size (gdbarch, regnum);
-  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
-  buf = (PTRACE_TYPE_RET *) alloca (size);
-
-  /* Read the register contents from the inferior a chunk at a time.  */
-  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
-    {
-      errno = 0;
-      buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
-      if (errno != 0)
-       error (_("Couldn't read register %s (#%d): %s."),
-              gdbarch_register_name (gdbarch, regnum),
-              regnum, safe_strerror (errno));
-
-      addr += sizeof (PTRACE_TYPE_RET);
-    }
-  regcache_raw_supply (regcache, regnum, buf);
-}
-
-/* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
-   for all registers.  */
-
-static void
-inf_ptrace_fetch_registers (struct target_ops *ops,
-                           struct regcache *regcache, int regnum)
-{
-  if (regnum == -1)
-    for (regnum = 0;
-        regnum < gdbarch_num_regs (regcache->arch ());
-        regnum++)
-      inf_ptrace_fetch_register (regcache, regnum);
-  else
-    inf_ptrace_fetch_register (regcache, regnum);
-}
-
-/* Store register REGNUM into the inferior.  */
-
-static void
-inf_ptrace_store_register (const struct regcache *regcache, int regnum)
-{
-  struct gdbarch *gdbarch = regcache->arch ();
-  CORE_ADDR addr;
-  size_t size;
-  PTRACE_TYPE_RET *buf;
-  pid_t pid;
-  int i;
-
-  /* This isn't really an address, but ptrace thinks of it as one.  */
-  addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
-  if (addr == (CORE_ADDR)-1 
-      || gdbarch_cannot_store_register (gdbarch, regnum))
-    return;
-
-  pid = get_ptrace_pid (regcache_get_ptid (regcache));
-
-  size = register_size (gdbarch, regnum);
-  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
-  buf = (PTRACE_TYPE_RET *) alloca (size);
-
-  /* Write the register contents into the inferior a chunk at a time.  */
-  regcache_raw_collect (regcache, regnum, buf);
-  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
-    {
-      errno = 0;
-      ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
-      if (errno != 0)
-       error (_("Couldn't write register %s (#%d): %s."),
-              gdbarch_register_name (gdbarch, regnum),
-              regnum, safe_strerror (errno));
-
-      addr += sizeof (PTRACE_TYPE_RET);
-    }
-}
-
-/* Store register REGNUM back into the inferior.  If REGNUM is -1, do
-   this for all registers.  */
-
-static void
-inf_ptrace_store_registers (struct target_ops *ops,
-                           struct regcache *regcache, int regnum)
-{
-  if (regnum == -1)
-    for (regnum = 0;
-        regnum < gdbarch_num_regs (regcache->arch ());
-        regnum++)
-      inf_ptrace_store_register (regcache, regnum);
-  else
-    inf_ptrace_store_register (regcache, regnum);
-}
-
-/* Create a "traditional" ptrace target.  REGISTER_U_OFFSET should be
-   a function returning the offset within the user area where a
-   particular register is stored.  */
-
-struct target_ops *
-inf_ptrace_trad_target (CORE_ADDR (*register_u_offset)
-                                       (struct gdbarch *, int, int))
-{
-  struct target_ops *t = inf_ptrace_target();
-
-  gdb_assert (register_u_offset);
-  inf_ptrace_register_u_offset = register_u_offset;
-  t->to_fetch_registers = inf_ptrace_fetch_registers;
-  t->to_store_registers = inf_ptrace_store_registers;
-
-  return t;
-}
diff --git a/gdb/linux-nat-trad.c b/gdb/linux-nat-trad.c
new file mode 100644 (file)
index 0000000..75130be
--- /dev/null
@@ -0,0 +1,160 @@
+/* Generic GNU/Linux target using traditional ptrace register access.
+
+   Copyright (C) 1988-2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#include "defs.h"
+#include "linux-nat-trad.h"
+
+#include "nat/gdb_ptrace.h"
+#include "inf-ptrace.h"
+
+/* Pointer to a function that returns the offset within the user area
+   where a particular register is stored.  */
+static CORE_ADDR (*inf_ptrace_register_u_offset)(struct gdbarch *, int, int);
+
+/* Fetch register REGNUM from the inferior.  */
+
+static void
+inf_ptrace_fetch_register (struct regcache *regcache, int regnum)
+{
+  struct gdbarch *gdbarch = regcache->arch ();
+  CORE_ADDR addr;
+  size_t size;
+  PTRACE_TYPE_RET *buf;
+  pid_t pid;
+  int i;
+
+  /* This isn't really an address, but ptrace thinks of it as one.  */
+  addr = inf_ptrace_register_u_offset (gdbarch, regnum, 0);
+  if (addr == (CORE_ADDR)-1
+      || gdbarch_cannot_fetch_register (gdbarch, regnum))
+    {
+      regcache_raw_supply (regcache, regnum, NULL);
+      return;
+    }
+
+  pid = get_ptrace_pid (regcache_get_ptid (regcache));
+
+  size = register_size (gdbarch, regnum);
+  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
+  buf = (PTRACE_TYPE_RET *) alloca (size);
+
+  /* Read the register contents from the inferior a chunk at a time.  */
+  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
+    {
+      errno = 0;
+      buf[i] = ptrace (PT_READ_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, 0);
+      if (errno != 0)
+       error (_("Couldn't read register %s (#%d): %s."),
+              gdbarch_register_name (gdbarch, regnum),
+              regnum, safe_strerror (errno));
+
+      addr += sizeof (PTRACE_TYPE_RET);
+    }
+  regcache_raw_supply (regcache, regnum, buf);
+}
+
+/* Fetch register REGNUM from the inferior.  If REGNUM is -1, do this
+   for all registers.  */
+
+static void
+inf_ptrace_fetch_registers (struct target_ops *ops,
+                           struct regcache *regcache, int regnum)
+{
+  if (regnum == -1)
+    for (regnum = 0;
+        regnum < gdbarch_num_regs (regcache->arch ());
+        regnum++)
+      inf_ptrace_fetch_register (regcache, regnum);
+  else
+    inf_ptrace_fetch_register (regcache, regnum);
+}
+
+/* Store register REGNUM into the inferior.  */
+
+static void
+inf_ptrace_store_register (const struct regcache *regcache, int regnum)
+{
+  struct gdbarch *gdbarch = regcache->arch ();
+  CORE_ADDR addr;
+  size_t size;
+  PTRACE_TYPE_RET *buf;
+  pid_t pid;
+  int i;
+
+  /* This isn't really an address, but ptrace thinks of it as one.  */
+  addr = inf_ptrace_register_u_offset (gdbarch, regnum, 1);
+  if (addr == (CORE_ADDR)-1
+      || gdbarch_cannot_store_register (gdbarch, regnum))
+    return;
+
+  pid = get_ptrace_pid (regcache_get_ptid (regcache));
+
+  size = register_size (gdbarch, regnum);
+  gdb_assert ((size % sizeof (PTRACE_TYPE_RET)) == 0);
+  buf = (PTRACE_TYPE_RET *) alloca (size);
+
+  /* Write the register contents into the inferior a chunk at a time.  */
+  regcache_raw_collect (regcache, regnum, buf);
+  for (i = 0; i < size / sizeof (PTRACE_TYPE_RET); i++)
+    {
+      errno = 0;
+      ptrace (PT_WRITE_U, pid, (PTRACE_TYPE_ARG3)(uintptr_t)addr, buf[i]);
+      if (errno != 0)
+       error (_("Couldn't write register %s (#%d): %s."),
+              gdbarch_register_name (gdbarch, regnum),
+              regnum, safe_strerror (errno));
+
+      addr += sizeof (PTRACE_TYPE_RET);
+    }
+}
+
+/* Store register REGNUM back into the inferior.  If REGNUM is -1, do
+   this for all registers.  */
+
+static void
+inf_ptrace_store_registers (struct target_ops *ops,
+                           struct regcache *regcache, int regnum)
+{
+  if (regnum == -1)
+    for (regnum = 0;
+        regnum < gdbarch_num_regs (regcache->arch ());
+        regnum++)
+      inf_ptrace_store_register (regcache, regnum);
+  else
+    inf_ptrace_store_register (regcache, regnum);
+}
+
+/* Create a "traditional" Linux/ptrace target.  REGISTER_U_OFFSET
+   should be a function returning the offset within the user area
+   where a particular register is stored.  */
+
+struct target_ops *
+linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int))
+{
+  struct target_ops *t = inf_ptrace_target();
+
+  gdb_assert (register_u_offset);
+  inf_ptrace_register_u_offset = register_u_offset;
+  t->to_fetch_registers = inf_ptrace_fetch_registers;
+  t->to_store_registers = inf_ptrace_store_registers;
+
+  linux_target_install_ops (t);
+
+  return t;
+}
diff --git a/gdb/linux-nat-trad.h b/gdb/linux-nat-trad.h
new file mode 100644 (file)
index 0000000..3b4a6c8
--- /dev/null
@@ -0,0 +1,30 @@
+/* Generic GNU/Linux target using traditional ptrace register access.
+
+   Copyright (C) 2000-2018 Free Software Foundation, Inc.
+
+   This file is part of GDB.
+
+   This program is free software; you can redistribute it and/or modify
+   it under the terms of the GNU General Public License as published by
+   the Free Software Foundation; either version 3 of the License, or
+   (at your option) any later version.
+
+   This program is distributed in the hope that it will be useful,
+   but WITHOUT ANY WARRANTY; without even the implied warranty of
+   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+   GNU General Public License for more details.
+
+   You should have received a copy of the GNU General Public License
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
+
+#ifndef LINUX_NAT_TRAD_H
+#define LINUX_NAT_TRAD_H
+
+#include "linux-nat.h"
+
+/* Create a generic GNU/Linux target using traditional
+   ptrace register access.  */
+struct target_ops *linux_trad_target
+  (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int));
+
+#endif /* LINUX_NAT_TRAD_H */
index 5a4abb1834a744fa1c8b0066bb0854aa15986924..c23f83e057fa14383ab26ac6e7990ad33b6bd749 100644 (file)
@@ -4338,7 +4338,7 @@ linux_child_static_tracepoint_markers_by_strid (struct target_ops *self,
 /* Create a prototype generic GNU/Linux target.  The client can override
    it with local methods.  */
 
-static void
+void
 linux_target_install_ops (struct target_ops *t)
 {
   t->to_insert_fork_catchpoint = linux_child_insert_fork_catchpoint;
@@ -4371,17 +4371,6 @@ linux_target (void)
   return t;
 }
 
-struct target_ops *
-linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int))
-{
-  struct target_ops *t;
-
-  t = inf_ptrace_trad_target (register_u_offset);
-  linux_target_install_ops (t);
-
-  return t;
-}
-
 /* target_is_async_p implementation.  */
 
 static int
index 9df3548c6b2188d96132fd0f98d090cd93983bcf..03c20219111cad7a0fa536305cce191a28114ff9 100644 (file)
@@ -153,10 +153,9 @@ extern void linux_unstop_all_lwps (void);
    override it with local methods.  */
 struct target_ops * linux_target (void);
 
-/* Create a generic GNU/Linux target using traditional 
-   ptrace register access.  */
-struct target_ops *
-linux_trad_target (CORE_ADDR (*register_u_offset)(struct gdbarch *, int, int));
+/* Make a prototype generic GNU/Linux target.  The client can override
+   it with local methods.  */
+void linux_target_install_ops (struct target_ops *t);
 
 /* Register the customized GNU/Linux target.  This should be used
    instead of calling add_target directly.  */
index 68fd1f83c3445ade12a7b7e58b28dc209ebbf2e6..17e70b603b104a17a35b656aa9fef5257774c603 100644 (file)
@@ -24,7 +24,7 @@
 #include "mips-tdep.h"
 #include "target.h"
 #include "regcache.h"
-#include "linux-nat.h"
+#include "linux-nat-trad.h"
 #include "mips-linux-tdep.h"
 #include "target-descriptions.h"