x86 Linux/ptrace: fix offsetof usage in C++ mode
authorPedro Alves <palves@redhat.com>
Wed, 22 Oct 2014 12:51:07 +0000 (13:51 +0100)
committerPedro Alves <palves@redhat.com>
Fri, 27 Feb 2015 17:30:09 +0000 (17:30 +0000)
In C++ mode, we get:

  gdb/gdbserver/linux-x86-low.c: In function ‘void x86_linux_dr_set(ptid_t, int, long unsigned int)’:
  gdb/gdbserver/linux-x86-low.c:558:38: error: ‘regnum’ cannot appear in a constant-expression
      offsetof (struct user, u_debugreg[regnum]), value);
                                      ^
gdb/gdbserver/ChangeLog:
2015-02-27  Pedro Alves  <palves@redhat.com>

* linux-x86-low.c (u_debugreg_offset): New function.
(x86_linux_dr_get, x86_linux_dr_set): Use it.

gdb/ChangeLog:
2015-02-27  Pedro Alves  <palves@redhat.com>

* x86-linux-nat.c (u_debugreg_offset): New function.
(x86_linux_dr_get, x86_linux_dr_set): Use it.

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-x86-low.c
gdb/x86-linux-nat.c

index 92f85f4fae3f074db48223523de81ec225bb4305..cd43e5a8a5db9a7f7ec2e5ca11b512143313cee7 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-27  Pedro Alves  <palves@redhat.com>
+
+       * x86-linux-nat.c (u_debugreg_offset): New function.
+       (x86_linux_dr_get, x86_linux_dr_set): Use it.
+
 2015-02-27  Pedro Alves  <palves@redhat.com>
 
        * nat/x86-dregs.h (enum target_hw_bp_type): Remove forward
index 7ba137b8249e702dd214a63de20418a48bdf87ca..c420c066b5f22587dcdc0a582d23979bda3159b3 100644 (file)
@@ -1,3 +1,8 @@
+2015-02-27  Pedro Alves  <palves@redhat.com>
+
+       * linux-x86-low.c (u_debugreg_offset): New function.
+       (x86_linux_dr_get, x86_linux_dr_set): Use it.
+
 2015-02-27  Pedro Alves  <palves@redhat.com>
 
        * gdb_proc_service.h: Wrap with EXTERN_C_PUSH/EXTERN_C_POP.
index 171735c206a699f9d7f56a8bc60c0dcd10b7df72..c376cab10d51a8d8a3fea4d55f2bcf3502f91e39 100644 (file)
@@ -530,6 +530,18 @@ x86_breakpoint_at (CORE_ADDR pc)
   return 0;
 }
 \f
+
+/* Return the offset of REGNUM in the u_debugreg field of struct
+   user.  */
+
+static int
+u_debugreg_offset (int regnum)
+{
+  return (offsetof (struct user, u_debugreg)
+         + sizeof (((struct user *) 0)->u_debugreg[0]) * regnum);
+}
+
+
 /* Support for debug registers.  */
 
 static unsigned long
@@ -541,8 +553,7 @@ x86_linux_dr_get (ptid_t ptid, int regnum)
   tid = ptid_get_lwp (ptid);
 
   errno = 0;
-  value = ptrace (PTRACE_PEEKUSER, tid,
-                 offsetof (struct user, u_debugreg[regnum]), 0);
+  value = ptrace (PTRACE_PEEKUSER, tid, u_debugreg_offset (regnum), 0);
   if (errno != 0)
     error ("Couldn't read debug register");
 
@@ -557,8 +568,7 @@ x86_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
   tid = ptid_get_lwp (ptid);
 
   errno = 0;
-  ptrace (PTRACE_POKEUSER, tid,
-         offsetof (struct user, u_debugreg[regnum]), value);
+  ptrace (PTRACE_POKEUSER, tid, u_debugreg_offset (regnum), value);
   if (errno != 0)
     error ("Couldn't write debug register");
 }
index 9d82be2017e1aa4b187c92b4c30bdcd1f8ed0ad0..c58c01a2bb74eb20f599bff804c8eecf10ffddb7 100644 (file)
@@ -51,6 +51,16 @@ struct arch_lwp_info
 int have_ptrace_getregset = -1;
 \f
 
+/* Return the offset of REGNUM in the u_debugreg field of struct
+   user.  */
+
+static int
+u_debugreg_offset (int regnum)
+{
+  return (offsetof (struct user, u_debugreg)
+         + sizeof (((struct user *) 0)->u_debugreg[0]) * regnum);
+}
+
 /* Support for debug registers.  */
 
 /* Get debug register REGNUM value from only the one LWP of PTID.  */
@@ -65,8 +75,8 @@ x86_linux_dr_get (ptid_t ptid, int regnum)
   tid = ptid_get_lwp (ptid);
 
   errno = 0;
-  value = ptrace (PTRACE_PEEKUSER, tid,
-                 offsetof (struct user, u_debugreg[regnum]), 0);
+  value = ptrace (PTRACE_PEEKUSER, tid, u_debugreg_offset (regnum), 0);
+
   if (errno != 0)
     perror_with_name (_("Couldn't read debug register"));
 
@@ -84,8 +94,7 @@ x86_linux_dr_set (ptid_t ptid, int regnum, unsigned long value)
   tid = ptid_get_lwp (ptid);
 
   errno = 0;
-  ptrace (PTRACE_POKEUSER, tid,
-         offsetof (struct user, u_debugreg[regnum]), value);
+  ptrace (PTRACE_POKEUSER, tid, u_debugreg_offset (regnum), value);
   if (errno != 0)
     perror_with_name (_("Couldn't write debug register"));
 }