diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 18 |
2 files changed, 21 insertions, 3 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 323d582..c9b1e9d 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,11 @@ 2016-04-25 Yao Qi <yao.qi@linaro.org> + * linux-low.c (lwp_signal_can_be_delivered): Adjust. + (need_step_over_p): Return zero if the LWP has pending signals + can be delivered on software single step target. + +2016-04-25 Yao Qi <yao.qi@linaro.org> + * linux-low.c (reinsert_raw_breakpoint): If bp->inserted is true return instead of error. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 5cbd308..efa0774 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -4119,7 +4119,6 @@ single_step (struct lwp_info* lwp) } /* The signal can be delivered to the inferior if we are not trying to - reinsert a breakpoint for software single step and not trying to finish a fast tracepoint collect. Since signal can be delivered in the step-over, the program may go to signal handler and trap again after return from the signal handler. We can live with the spurious @@ -4128,8 +4127,7 @@ single_step (struct lwp_info* lwp) static int lwp_signal_can_be_delivered (struct lwp_info *lwp) { - return (!(lwp->bp_reinsert != 0 && can_software_single_step ()) - && !lwp->collecting_fast_tracepoint); + return !lwp->collecting_fast_tracepoint; } /* Resume execution of LWP. If STEP is nonzero, single-step it. If @@ -4578,6 +4576,20 @@ need_step_over_p (struct inferior_list_entry *entry, void *dummy) return 0; } + /* On software single step target, resume the inferior with signal + rather than stepping over. */ + if (can_software_single_step () + && lwp->pending_signals != NULL + && lwp_signal_can_be_delivered (lwp)) + { + if (debug_threads) + debug_printf ("Need step over [LWP %ld]? Ignoring, has pending" + " signals.\n", + lwpid_of (thread)); + + return 0; + } + saved_thread = current_thread; current_thread = thread; |