[2/7] Deliver signal in hardware single step
Commit Message
Pedro Alves <palves@redhat.com> writes:
> making test result diffing unstable. If so, I think it should
> either be written as:
>
> pass "tracepoint $i hit $iterations times (spurious collection)"
>
I prefer this.
> making use of the rule that terminating " (...)" bits don't really
> count as test message, or always:
>
> pass "tracepoint $i hit $iterations times"
>
> Otherwise LGTM.
Patch below is pushed in.
@@ -4118,13 +4118,17 @@ single_step (struct lwp_info* lwp)
}
/* The signal can be delivered to the inferior if we are not trying to
- reinsert a breakpoint and not trying to finish a fast tracepoint
- collect. */
+ 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
+ double traps. */
static int
lwp_signal_can_be_delivered (struct lwp_info *lwp)
{
- return (lwp->bp_reinsert == 0 && !lwp->collecting_fast_tracepoint);
+ return (!(lwp->bp_reinsert != 0 && can_software_single_step ())
+ && !lwp->collecting_fast_tracepoint);
}
/* Resume execution of LWP. If STEP is nonzero, single-step it. If
@@ -174,6 +174,14 @@ while { 1 } {
# Step 3, check the number of collections on each tracepoint.
for { set i $tpnum } { $i < [expr $tpnum + 2] } { incr i } {
- gdb_assert { $tracepoint_hits($i) == $iterations } \
- "tracepoint $i hit $iterations times"
+
+ if { $tracepoint_hits($i) == $iterations } {
+ pass "tracepoint $i hit $iterations times"
+ } elseif { $tracepoint_hits($i) > $iterations } {
+ # GDBserver deliver the signal while stepping over tracepoint,
+ # so it is possible that a tracepoint is collected twice.
+ pass "tracepoint $i hit $iterations times (spurious collection)"
+ } else {
+ fail "tracepoint $i hit $iterations times"
+ }
}