Refactor ptrace extended event status.
authorDon Breazeal <donb@codesourcery.com>
Fri, 19 Sep 2014 17:54:34 +0000 (10:54 -0700)
committerDon Breazeal <donb@codesourcery.com>
Fri, 19 Sep 2014 17:54:34 +0000 (10:54 -0700)
This commit implements functions for identifying and extracting extended
ptrace event information from a Linux wait status.  These are just
convenience functions intended to hide the ">> 16" used to extract the
event from the wait status word, replacing the hard-coded shift with a more
descriptive function call.  This is preparatory work for implementation of
follow-fork and detach-on-fork for extended-remote linux targets.

gdb/ChangeLog:

* linux-nat.c (linux_handle_extended_wait): Call
linux_ptrace_get_extended_event.
(wait_lwp): Call linux_is_extended_waitstatus.
(linux_nat_filter_event): Call linux_ptrace_get_extended_event
and linux_is_extended_waitstatus.
* nat/linux-ptrace.c (linux_test_for_tracefork): Call
linux_ptrace_get_extended_event.
(linux_ptrace_get_extended_event): New function.
(linux_is_extended_waitstatus): New function.
* nat/linux-ptrace.h (linux_ptrace_get_extended_event)
(linux_is_extended_waitstatus): New declarations.

gdb/gdbserver/ChangeLog:

* linux-low.c (handle_extended_wait): Call
linux_ptrace_get_extended_event.
(get_stop_pc, get_detach_signal, linux_low_filter_event): Call
linux_is_extended_waitstatus.

---

gdb/ChangeLog
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/linux-nat.c
gdb/nat/linux-ptrace.c
gdb/nat/linux-ptrace.h

index 37577080dd8d860136012332fc68b8ae5fd5ff1f..f36732f9fde5f5a143ab15214164ebdcd8f63569 100644 (file)
@@ -1,3 +1,17 @@
+2014-09-19  Don Breazeal  <donb@codesourcery.com>
+
+       * linux-nat.c (linux_handle_extended_wait): Call
+       linux_ptrace_get_extended_event.
+       (wait_lwp): Call linux_is_extended_waitstatus.
+       (linux_nat_filter_event): Call linux_ptrace_get_extended_event
+       and linux_is_extended_waitstatus.
+       * nat/linux-ptrace.c (linux_test_for_tracefork): Call
+       linux_ptrace_get_extended_event.
+       (linux_ptrace_get_extended_event): New function.
+       (linux_is_extended_waitstatus): New function.
+       * nat/linux-ptrace.h (linux_ptrace_get_extended_event)
+       (linux_is_extended_waitstatus): New declarations.
+
 2014-09-19  Yao Qi  <yao@codesourcery.com>
 
        * dwarf2read.c (dwarf_decode_lines): Update declaration.
index ec32f7160ac44f08ae160655e38c822177f48ec4..240554ef882aefde3c81230e90b978315388915f 100644 (file)
@@ -1,3 +1,10 @@
+2014-09-19  Don Breazeal  <donb@codesourcery.com>
+
+       * linux-low.c (handle_extended_wait): Call
+       linux_ptrace_get_extended_event.
+       (get_stop_pc, get_detach_signal, linux_low_filter_event): Call
+       linux_is_extended_waitstatus.
+
 2014-09-16  Joel Brobecker  <brobecker@adacore.com>
 
        * Makefile.in (CPPFLAGS): Define.
index 705edde4407fa0359ee4f2d313087ef504e3dc53..8f0985a1394f80e7d1a2913fe60e9a65a7aa48d2 100644 (file)
@@ -370,7 +370,7 @@ linux_add_process (int pid, int attached)
 static void
 handle_extended_wait (struct lwp_info *event_child, int wstat)
 {
-  int event = wstat >> 16;
+  int event = linux_ptrace_get_extended_event (wstat);
   struct thread_info *event_thr = get_lwp_thread (event_child);
   struct lwp_info *new_lwp;
 
@@ -512,7 +512,7 @@ get_stop_pc (struct lwp_info *lwp)
   if (WSTOPSIG (lwp->last_status) == SIGTRAP
       && !lwp->stepping
       && !lwp->stopped_by_watchpoint
-      && lwp->last_status >> 16 == 0)
+      && !linux_is_extended_waitstatus (lwp->last_status))
     stop_pc -= the_low_target.decr_pc_after_break;
 
   if (debug_threads)
@@ -1056,7 +1056,7 @@ get_detach_signal (struct thread_info *thread)
     }
 
   /* Extended wait statuses aren't real SIGTRAPs.  */
-  if (WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WSTOPSIG (status) == SIGTRAP && linux_is_extended_waitstatus (status))
     {
       if (debug_threads)
        debug_printf ("GPS: lwp %s had stopped with extended "
@@ -1869,7 +1869,7 @@ linux_low_filter_event (ptid_t filter_ptid, int lwpid, int wstat)
     }
 
   if (WIFSTOPPED (wstat) && WSTOPSIG (wstat) == SIGTRAP
-      && wstat >> 16 != 0)
+      && linux_is_extended_waitstatus (wstat))
     {
       handle_extended_wait (child, wstat);
       return NULL;
index 5a82d2332df40c18a5bcb04e7c2d2a3297f95e77..0fe4b0bc352da5df2b4af349f96b1eb88fdd449f 100644 (file)
@@ -1996,7 +1996,7 @@ linux_handle_extended_wait (struct lwp_info *lp, int status,
 {
   int pid = ptid_get_lwp (lp->ptid);
   struct target_waitstatus *ourstatus = &lp->waitstatus;
-  int event = status >> 16;
+  int event = linux_ptrace_get_extended_event (status);
 
   if (event == PTRACE_EVENT_FORK || event == PTRACE_EVENT_VFORK
       || event == PTRACE_EVENT_CLONE)
@@ -2362,7 +2362,8 @@ wait_lwp (struct lwp_info *lp)
     }
 
   /* Handle GNU/Linux's extended waitstatus for trace events.  */
-  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
+      && linux_is_extended_waitstatus (status))
     {
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
@@ -2921,6 +2922,7 @@ static struct lwp_info *
 linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
 {
   struct lwp_info *lp;
+  int event = linux_ptrace_get_extended_event (status);
 
   *new_pending_p = 0;
 
@@ -2940,7 +2942,7 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
      thread changes its tid to the tgid.  */
 
   if (WIFSTOPPED (status) && lp == NULL
-      && (WSTOPSIG (status) == SIGTRAP && status >> 16 == PTRACE_EVENT_EXEC))
+      && (WSTOPSIG (status) == SIGTRAP && event == PTRACE_EVENT_EXEC))
     {
       /* A multi-thread exec after we had seen the leader exiting.  */
       if (debug_linux_nat)
@@ -2984,7 +2986,8 @@ linux_nat_filter_event (int lwpid, int status, int *new_pending_p)
     }
 
   /* Handle GNU/Linux's extended waitstatus for trace events.  */
-  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP && status >> 16 != 0)
+  if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP
+      && linux_is_extended_waitstatus (status))
     {
       if (debug_linux_nat)
        fprintf_unfiltered (gdb_stdlog,
index 627551646ab5ca88ab5d1ece1284900644046ab3..8bc3f1667ac42cc346e145d15eb7b17a878d682a 100644 (file)
@@ -416,7 +416,7 @@ linux_test_for_tracefork (int child_pid)
 
   /* Check if we received a fork event notification.  */
   if (ret == child_pid && WIFSTOPPED (status)
-      && status >> 16 == PTRACE_EVENT_FORK)
+      && linux_ptrace_get_extended_event (status) == PTRACE_EVENT_FORK)
     {
       /* We did receive a fork event notification.  Make sure its PID
         is reported.  */
@@ -550,3 +550,19 @@ linux_ptrace_set_additional_flags (int flags)
 {
   additional_flags = flags;
 }
+
+/* Extract extended ptrace event from wait status.  */
+
+int
+linux_ptrace_get_extended_event (int wstat)
+{
+  return (wstat >> 16);
+}
+
+/* Determine whether wait status denotes an extended event.  */
+
+int
+linux_is_extended_waitstatus (int wstat)
+{
+  return (linux_ptrace_get_extended_event (wstat) != 0);
+}
index 41b319888391361de8f7e873febdb0ca8bf876b9..31a77cd95879de1b2d9b26732b2cc756e4bb7d53 100644 (file)
@@ -92,5 +92,7 @@ extern int linux_supports_traceclone (void);
 extern int linux_supports_tracevforkdone (void);
 extern int linux_supports_tracesysgood (void);
 extern void linux_ptrace_set_additional_flags (int);
+extern int linux_ptrace_get_extended_event (int wstat);
+extern int linux_is_extended_waitstatus (int wstat);
 
 #endif /* COMMON_LINUX_PTRACE_H */