Jan Kratochvil 1bcf9b6
http://sourceware.org/ml/gdb-patches/2010-09/msg00361.html
Jan Kratochvil 1bcf9b6
Subject: [patch 4/4]#3 Remove redundant lp->siginfo
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
Hi,
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
this is a simplification which should not affect GDB behavior.  As linux-nat
Jan Kratochvil 1bcf9b6
now stops on each received signal without any reordering of them then
Jan Kratochvil 1bcf9b6
PTRACE_GETSIGINFO is enough to access siginfo, without any need to copy it in
Jan Kratochvil 1bcf9b6
advance.
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
Thanks,
Jan Kratochvil 1bcf9b6
Jan
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
gdb/
Jan Kratochvil 1bcf9b6
2010-09-20  Jan Kratochvil  <jan.kratochvil@redhat.com>
Jan Kratochvil 1bcf9b6
Jan Kratochvil 1bcf9b6
	* linux-nat.c (resume_callback) <lp->stopped && lp->status == 0>
Jan Kratochvil 1bcf9b6
	(linux_nat_resume): Remove LP->SIGINFO clearing.
Jan Kratochvil 1bcf9b6
	(save_siginfo): Remove.
Jan Kratochvil 1bcf9b6
	(stop_wait_callback) <WSTOPSIG (status) != SIGSTOP>
Jan Kratochvil 1bcf9b6
	(linux_nat_filter_event) <linux_nat_status_is_event (status)>: Remove
Jan Kratochvil 1bcf9b6
	the save_siginfo call.
Jan Kratochvil 1bcf9b6
	(resume_stopped_resumed_lwps): Remove LP->SIGINFO clearing.
Jan Kratochvil 1bcf9b6
	(linux_nat_set_siginfo_fixup): Use PTRACE_GETSIGINFO.
Jan Kratochvil 1bcf9b6
	* linux-nat.h (struct lwp_info) <siginfo>: Remove.
Jan Kratochvil 1bcf9b6
Jan Kratochvil 254f0e9
Index: gdb-7.4.50.20111218/gdb/linux-nat.c
Jan Kratochvil 1bcf9b6
===================================================================
Jan Kratochvil 254f0e9
--- gdb-7.4.50.20111218.orig/gdb/linux-nat.c	2011-12-19 02:17:05.000000000 +0100
Jan Kratochvil 254f0e9
+++ gdb-7.4.50.20111218/gdb/linux-nat.c	2011-12-19 02:17:43.188466854 +0100
Jan Kratochvil 254f0e9
@@ -1883,7 +1883,6 @@ resume_lwp (struct lwp_info *lp, int ste
Jan Kratochvil 254f0e9
 				step, TARGET_SIGNAL_0);
Jan Kratochvil 254f0e9
 	  lp->stopped = 0;
Jan Kratochvil 254f0e9
 	  lp->step = step;
Jan Kratochvil 254f0e9
-	  memset (&lp->siginfo, 0, sizeof (lp->siginfo));
Jan Kratochvil 254f0e9
 	  lp->stopped_by_watchpoint = 0;
Jan Kratochvil 254f0e9
 	}
Jan Kratochvil 254f0e9
       else
Jan Kratochvil 254f0e9
@@ -2027,7 +2026,6 @@ linux_nat_resume (struct target_ops *ops
Jan Kratochvil 254f0e9
   if (linux_nat_prepare_to_resume != NULL)
Jan Kratochvil 254f0e9
     linux_nat_prepare_to_resume (lp);
Jan Kratochvil 1bcf9b6
   linux_ops->to_resume (linux_ops, ptid, step, signo);
Jan Kratochvil 1bcf9b6
-  memset (&lp->siginfo, 0, sizeof (lp->siginfo));
Jan Kratochvil 1bcf9b6
   lp->stopped_by_watchpoint = 0;
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
   if (debug_linux_nat)
Jan Kratochvil 254f0e9
@@ -2612,22 +2610,6 @@ wait_lwp (struct lwp_info *lp)
Jan Kratochvil 1bcf9b6
   return status;
Jan Kratochvil 1bcf9b6
 }
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
-/* Save the most recent siginfo for LP.  This is currently only called
Jan Kratochvil 1bcf9b6
-   for SIGTRAP; some ports use the si_addr field for
Jan Kratochvil 1bcf9b6
-   target_stopped_data_address.  In the future, it may also be used to
Jan Kratochvil 1bcf9b6
-   restore the siginfo of requeued signals.  */
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
-static void
Jan Kratochvil 1bcf9b6
-save_siginfo (struct lwp_info *lp)
Jan Kratochvil 1bcf9b6
-{
Jan Kratochvil 1bcf9b6
-  errno = 0;
Jan Kratochvil 1bcf9b6
-  ptrace (PTRACE_GETSIGINFO, GET_LWP (lp->ptid),
Jan Kratochvil 1bcf9b6
-	  (PTRACE_TYPE_ARG3) 0, &lp->siginfo);
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
-  if (errno != 0)
Jan Kratochvil 1bcf9b6
-    memset (&lp->siginfo, 0, sizeof (lp->siginfo));
Jan Kratochvil 1bcf9b6
-}
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
 /* Send a SIGSTOP to LP.  */
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
 static int
Jan Kratochvil 254f0e9
@@ -2872,9 +2854,6 @@ stop_wait_callback (struct lwp_info *lp,
Jan Kratochvil 1bcf9b6
 	{
Jan Kratochvil 1bcf9b6
 	  /* The thread was stopped with a signal other than SIGSTOP.  */
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
-	  /* Save the trap's siginfo in case we need it later.  */
Jan Kratochvil 1bcf9b6
-	  save_siginfo (lp);
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
 	  save_sigtrap (lp);
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
 	  if (debug_linux_nat)
Jan Kratochvil 254f0e9
@@ -3278,12 +3257,7 @@ linux_nat_filter_event (int lwpid, int s
Jan Kratochvil 1bcf9b6
     }
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil e00e5ea
   if (linux_nat_status_is_event (status))
Jan Kratochvil 1bcf9b6
-    {
Jan Kratochvil 1bcf9b6
-      /* Save the trap's siginfo in case we need it later.  */
Jan Kratochvil 1bcf9b6
-      save_siginfo (lp);
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
-      save_sigtrap (lp);
Jan Kratochvil 1bcf9b6
-    }
Jan Kratochvil 1bcf9b6
+    save_sigtrap (lp);
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
   /* Check if the thread has exited.  */
Jan Kratochvil 1bcf9b6
   if ((WIFEXITED (status) || WIFSIGNALED (status))
Jan Kratochvil 254f0e9
@@ -3961,7 +3935,6 @@ resume_stopped_resumed_lwps (struct lwp_
Jan Kratochvil 1bcf9b6
       linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)),
Jan Kratochvil 1bcf9b6
 			    lp->step, TARGET_SIGNAL_0);
Jan Kratochvil 1bcf9b6
       lp->stopped = 0;
Jan Kratochvil 1bcf9b6
-      memset (&lp->siginfo, 0, sizeof (lp->siginfo));
Jan Kratochvil 1bcf9b6
       lp->stopped_by_watchpoint = 0;
Jan Kratochvil 1bcf9b6
     }
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 254f0e9
@@ -6029,11 +6002,19 @@ linux_nat_set_prepare_to_resume (struct
Jan Kratochvil 1bcf9b6
 struct siginfo *
Jan Kratochvil 1bcf9b6
 linux_nat_get_siginfo (ptid_t ptid)
Jan Kratochvil 1bcf9b6
 {
Jan Kratochvil 1bcf9b6
-  struct lwp_info *lp = find_lwp_pid (ptid);
Jan Kratochvil 1bcf9b6
+  static struct siginfo siginfo;
Jan Kratochvil 1bcf9b6
+  int pid;
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
-  gdb_assert (lp != NULL);
Jan Kratochvil 1bcf9b6
+  pid = GET_LWP (ptid);
Jan Kratochvil 1bcf9b6
+  if (pid == 0)
Jan Kratochvil 1bcf9b6
+    pid = GET_PID (ptid);
Jan Kratochvil 1bcf9b6
+
Jan Kratochvil 1bcf9b6
+  errno = 0;
Jan Kratochvil 1bcf9b6
+  ptrace (PTRACE_GETSIGINFO, pid, (PTRACE_TYPE_ARG3) 0, &siginfo);
Jan Kratochvil 1bcf9b6
+  if (errno != 0)
Jan Kratochvil 1bcf9b6
+    memset (&siginfo, 0, sizeof (siginfo));
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
-  return &lp->siginfo;
Jan Kratochvil 1bcf9b6
+  return &siginfo;
Jan Kratochvil 1bcf9b6
 }
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
 /* Provide a prototype to silence -Wmissing-prototypes.  */
Jan Kratochvil 254f0e9
Index: gdb-7.4.50.20111218/gdb/linux-nat.h
Jan Kratochvil 1bcf9b6
===================================================================
Jan Kratochvil 254f0e9
--- gdb-7.4.50.20111218.orig/gdb/linux-nat.h	2011-12-18 23:40:59.000000000 +0100
Jan Kratochvil 254f0e9
+++ gdb-7.4.50.20111218/gdb/linux-nat.h	2011-12-19 02:17:21.355548276 +0100
Jan Kratochvil 254f0e9
@@ -77,10 +77,6 @@ struct lwp_info
Jan Kratochvil 1bcf9b6
   /* The kind of stepping of this LWP.  */
Jan Kratochvil 1bcf9b6
   enum resume_step step;
Jan Kratochvil 1bcf9b6
 
Jan Kratochvil 1bcf9b6
-  /* Non-zero si_signo if this LWP stopped with a trap.  si_addr may
Jan Kratochvil 1bcf9b6
-     be the address of a hardware watchpoint.  */
Jan Kratochvil 1bcf9b6
-  struct siginfo siginfo;
Jan Kratochvil 1bcf9b6
-
Jan Kratochvil 1bcf9b6
   /* STOPPED_BY_WATCHPOINT is non-zero if this LWP stopped with a data
Jan Kratochvil 1bcf9b6
      watchpoint trap.  */
Jan Kratochvil 1bcf9b6
   int stopped_by_watchpoint;