http://sourceware.org/ml/gdb-patches/2010-09/msg00361.html Subject: [patch 4/4]#3 Remove redundant lp->siginfo Hi, this is a simplification which should not affect GDB behavior. As linux-nat now stops on each received signal without any reordering of them then PTRACE_GETSIGINFO is enough to access siginfo, without any need to copy it in advance. Thanks, Jan gdb/ 2010-09-20 Jan Kratochvil * linux-nat.c (resume_callback) stopped && lp->status == 0> (linux_nat_resume): Remove LP->SIGINFO clearing. (save_siginfo): Remove. (stop_wait_callback) (linux_nat_filter_event) : Remove the save_siginfo call. (resume_stopped_resumed_lwps): Remove LP->SIGINFO clearing. (linux_nat_set_siginfo_fixup): Use PTRACE_GETSIGINFO. * linux-nat.h (struct lwp_info) : Remove. Index: gdb-7.2/gdb/linux-nat.c =================================================================== --- gdb-7.2.orig/gdb/linux-nat.c 2010-09-25 15:37:23.000000000 +0200 +++ gdb-7.2/gdb/linux-nat.c 2010-09-25 15:38:18.000000000 +0200 @@ -1851,7 +1851,6 @@ resume_callback (struct lwp_info *lp, vo target_pid_to_str (lp->ptid)); lp->stopped = 0; lp->step = 0; - memset (&lp->siginfo, 0, sizeof (lp->siginfo)); lp->stopped_by_watchpoint = 0; } else if (lp->stopped && debug_linux_nat) @@ -1993,7 +1992,6 @@ linux_nat_resume (struct target_ops *ops ptid = pid_to_ptid (GET_LWP (lp->ptid)); linux_ops->to_resume (linux_ops, ptid, step, signo); - memset (&lp->siginfo, 0, sizeof (lp->siginfo)); lp->stopped_by_watchpoint = 0; if (debug_linux_nat) @@ -2483,22 +2481,6 @@ wait_lwp (struct lwp_info *lp) return status; } -/* Save the most recent siginfo for LP. This is currently only called - for SIGTRAP; some ports use the si_addr field for - target_stopped_data_address. In the future, it may also be used to - restore the siginfo of requeued signals. */ - -static void -save_siginfo (struct lwp_info *lp) -{ - errno = 0; - ptrace (PTRACE_GETSIGINFO, GET_LWP (lp->ptid), - (PTRACE_TYPE_ARG3) 0, &lp->siginfo); - - if (errno != 0) - memset (&lp->siginfo, 0, sizeof (lp->siginfo)); -} - /* Send a SIGSTOP to LP. */ static int @@ -2730,9 +2712,6 @@ stop_wait_callback (struct lwp_info *lp, { /* The thread was stopped with a signal other than SIGSTOP. */ - /* Save the trap's siginfo in case we need it later. */ - save_siginfo (lp); - save_sigtrap (lp); if (debug_linux_nat) @@ -3102,12 +3081,7 @@ linux_nat_filter_event (int lwpid, int s } if (WIFSTOPPED (status) && WSTOPSIG (status) == SIGTRAP) - { - /* Save the trap's siginfo in case we need it later. */ - save_siginfo (lp); - - save_sigtrap (lp); - } + save_sigtrap (lp); /* Check if the thread has exited. */ if ((WIFEXITED (status) || WIFSIGNALED (status)) @@ -3706,7 +3680,6 @@ resume_stopped_resumed_lwps (struct lwp_ linux_ops->to_resume (linux_ops, pid_to_ptid (GET_LWP (lp->ptid)), lp->step, TARGET_SIGNAL_0); lp->stopped = 0; - memset (&lp->siginfo, 0, sizeof (lp->siginfo)); lp->stopped_by_watchpoint = 0; } @@ -5878,11 +5851,19 @@ linux_nat_set_siginfo_fixup (struct targ struct siginfo * linux_nat_get_siginfo (ptid_t ptid) { - struct lwp_info *lp = find_lwp_pid (ptid); + static struct siginfo siginfo; + int pid; - gdb_assert (lp != NULL); + pid = GET_LWP (ptid); + if (pid == 0) + pid = GET_PID (ptid); + + errno = 0; + ptrace (PTRACE_GETSIGINFO, pid, (PTRACE_TYPE_ARG3) 0, &siginfo); + if (errno != 0) + memset (&siginfo, 0, sizeof (siginfo)); - return &lp->siginfo; + return &siginfo; } /* Provide a prototype to silence -Wmissing-prototypes. */ Index: gdb-7.2/gdb/linux-nat.h =================================================================== --- gdb-7.2.orig/gdb/linux-nat.h 2010-09-25 15:30:50.000000000 +0200 +++ gdb-7.2/gdb/linux-nat.h 2010-09-25 15:37:57.000000000 +0200 @@ -58,10 +58,6 @@ struct lwp_info /* The kind of stepping of this LWP. */ enum resume_step step; - /* Non-zero si_signo if this LWP stopped with a trap. si_addr may - be the address of a hardware watchpoint. */ - struct siginfo siginfo; - /* STOPPED_BY_WATCHPOINT is non-zero if this LWP stopped with a data watchpoint trap. */ int stopped_by_watchpoint;