infrun.c:process_event_stop_test: Reindent.
gdb/ 2013-10-28 Pedro Alves <palves@redhat.com> * infrun.c (process_event_stop_test): Remove unnecessary scoping level and reindent.
This commit is contained in:
parent
94c57d6a62
commit
cdaa5b7326
@ -1,3 +1,8 @@
|
|||||||
|
2013-10-28 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* infrun.c (process_event_stop_test): Remove unnecessary scoping
|
||||||
|
level and reindent.
|
||||||
|
|
||||||
2013-10-28 Pedro Alves <palves@redhat.com>
|
2013-10-28 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
* infrun.c (process_event_stop_test): New function, factored out
|
* infrun.c (process_event_stop_test): New function, factored out
|
||||||
|
444
gdb/infrun.c
444
gdb/infrun.c
@ -4422,235 +4422,229 @@ process_event_stop_test (struct execution_control_state *ecs)
|
|||||||
struct symtab_and_line stop_pc_sal;
|
struct symtab_and_line stop_pc_sal;
|
||||||
struct frame_info *frame;
|
struct frame_info *frame;
|
||||||
struct gdbarch *gdbarch;
|
struct gdbarch *gdbarch;
|
||||||
|
CORE_ADDR jmp_buf_pc;
|
||||||
|
struct bpstat_what what;
|
||||||
|
|
||||||
|
/* Handle cases caused by hitting a breakpoint. */
|
||||||
|
|
||||||
|
frame = get_current_frame ();
|
||||||
|
gdbarch = get_frame_arch (frame);
|
||||||
|
|
||||||
|
what = bpstat_what (ecs->event_thread->control.stop_bpstat);
|
||||||
|
|
||||||
|
if (what.call_dummy)
|
||||||
{
|
{
|
||||||
/* Handle cases caused by hitting a breakpoint. */
|
stop_stack_dummy = what.call_dummy;
|
||||||
|
|
||||||
CORE_ADDR jmp_buf_pc;
|
|
||||||
struct bpstat_what what;
|
|
||||||
|
|
||||||
frame = get_current_frame ();
|
|
||||||
gdbarch = get_frame_arch (frame);
|
|
||||||
|
|
||||||
what = bpstat_what (ecs->event_thread->control.stop_bpstat);
|
|
||||||
|
|
||||||
if (what.call_dummy)
|
|
||||||
{
|
|
||||||
stop_stack_dummy = what.call_dummy;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* If we hit an internal event that triggers symbol changes, the
|
|
||||||
current frame will be invalidated within bpstat_what (e.g.,
|
|
||||||
if we hit an internal solib event). Re-fetch it. */
|
|
||||||
frame = get_current_frame ();
|
|
||||||
gdbarch = get_frame_arch (frame);
|
|
||||||
|
|
||||||
switch (what.main_action)
|
|
||||||
{
|
|
||||||
case BPSTAT_WHAT_SET_LONGJMP_RESUME:
|
|
||||||
/* If we hit the breakpoint at longjmp while stepping, we
|
|
||||||
install a momentary breakpoint at the target of the
|
|
||||||
jmp_buf. */
|
|
||||||
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME\n");
|
|
||||||
|
|
||||||
ecs->event_thread->stepping_over_breakpoint = 1;
|
|
||||||
|
|
||||||
if (what.is_longjmp)
|
|
||||||
{
|
|
||||||
struct value *arg_value;
|
|
||||||
|
|
||||||
/* If we set the longjmp breakpoint via a SystemTap
|
|
||||||
probe, then use it to extract the arguments. The
|
|
||||||
destination PC is the third argument to the
|
|
||||||
probe. */
|
|
||||||
arg_value = probe_safe_evaluate_at_pc (frame, 2);
|
|
||||||
if (arg_value)
|
|
||||||
jmp_buf_pc = value_as_address (arg_value);
|
|
||||||
else if (!gdbarch_get_longjmp_target_p (gdbarch)
|
|
||||||
|| !gdbarch_get_longjmp_target (gdbarch,
|
|
||||||
frame, &jmp_buf_pc))
|
|
||||||
{
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME "
|
|
||||||
"(!gdbarch_get_longjmp_target)\n");
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Insert a breakpoint at resume address. */
|
|
||||||
insert_longjmp_resume_breakpoint (gdbarch, jmp_buf_pc);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
check_exception_resume (ecs, frame);
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME:
|
|
||||||
{
|
|
||||||
struct frame_info *init_frame;
|
|
||||||
|
|
||||||
/* There are several cases to consider.
|
|
||||||
|
|
||||||
1. The initiating frame no longer exists. In this case
|
|
||||||
we must stop, because the exception or longjmp has gone
|
|
||||||
too far.
|
|
||||||
|
|
||||||
2. The initiating frame exists, and is the same as the
|
|
||||||
current frame. We stop, because the exception or
|
|
||||||
longjmp has been caught.
|
|
||||||
|
|
||||||
3. The initiating frame exists and is different from
|
|
||||||
the current frame. This means the exception or longjmp
|
|
||||||
has been caught beneath the initiating frame, so keep
|
|
||||||
going.
|
|
||||||
|
|
||||||
4. longjmp breakpoint has been placed just to protect
|
|
||||||
against stale dummy frames and user is not interested
|
|
||||||
in stopping around longjmps. */
|
|
||||||
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog,
|
|
||||||
"infrun: BPSTAT_WHAT_CLEAR_LONGJMP_RESUME\n");
|
|
||||||
|
|
||||||
gdb_assert (ecs->event_thread->control.exception_resume_breakpoint
|
|
||||||
!= NULL);
|
|
||||||
delete_exception_resume_breakpoint (ecs->event_thread);
|
|
||||||
|
|
||||||
if (what.is_longjmp)
|
|
||||||
{
|
|
||||||
check_longjmp_breakpoint_for_call_dummy (ecs->event_thread->num);
|
|
||||||
|
|
||||||
if (!frame_id_p (ecs->event_thread->initiating_frame))
|
|
||||||
{
|
|
||||||
/* Case 4. */
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
init_frame = frame_find_by_id (ecs->event_thread->initiating_frame);
|
|
||||||
|
|
||||||
if (init_frame)
|
|
||||||
{
|
|
||||||
struct frame_id current_id
|
|
||||||
= get_frame_id (get_current_frame ());
|
|
||||||
if (frame_id_eq (current_id,
|
|
||||||
ecs->event_thread->initiating_frame))
|
|
||||||
{
|
|
||||||
/* Case 2. Fall through. */
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
/* Case 3. */
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/* For Cases 1 and 2, remove the step-resume breakpoint,
|
|
||||||
if it exists. */
|
|
||||||
delete_step_resume_breakpoint (ecs->event_thread);
|
|
||||||
|
|
||||||
ecs->event_thread->control.stop_step = 1;
|
|
||||||
print_end_stepping_range_reason ();
|
|
||||||
stop_stepping (ecs);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_SINGLE:
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_SINGLE\n");
|
|
||||||
ecs->event_thread->stepping_over_breakpoint = 1;
|
|
||||||
/* Still need to check other stuff, at least the case where
|
|
||||||
we are stepping and step out of the right range. */
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_STEP_RESUME:
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STEP_RESUME\n");
|
|
||||||
|
|
||||||
delete_step_resume_breakpoint (ecs->event_thread);
|
|
||||||
if (ecs->event_thread->control.proceed_to_finish
|
|
||||||
&& execution_direction == EXEC_REVERSE)
|
|
||||||
{
|
|
||||||
struct thread_info *tp = ecs->event_thread;
|
|
||||||
|
|
||||||
/* We are finishing a function in reverse, and just hit
|
|
||||||
the step-resume breakpoint at the start address of
|
|
||||||
the function, and we're almost there -- just need to
|
|
||||||
back up by one more single-step, which should take us
|
|
||||||
back to the function call. */
|
|
||||||
tp->control.step_range_start = tp->control.step_range_end = 1;
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
fill_in_stop_func (gdbarch, ecs);
|
|
||||||
if (stop_pc == ecs->stop_func_start
|
|
||||||
&& execution_direction == EXEC_REVERSE)
|
|
||||||
{
|
|
||||||
/* We are stepping over a function call in reverse, and
|
|
||||||
just hit the step-resume breakpoint at the start
|
|
||||||
address of the function. Go back to single-stepping,
|
|
||||||
which should take us back to the function call. */
|
|
||||||
ecs->event_thread->stepping_over_breakpoint = 1;
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_STOP_NOISY:
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_NOISY\n");
|
|
||||||
stop_print_frame = 1;
|
|
||||||
|
|
||||||
/* We are about to nuke the step_resume_breakpointt via the
|
|
||||||
cleanup chain, so no need to worry about it here. */
|
|
||||||
|
|
||||||
stop_stepping (ecs);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_STOP_SILENT:
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_SILENT\n");
|
|
||||||
stop_print_frame = 0;
|
|
||||||
|
|
||||||
/* We are about to nuke the step_resume_breakpoin via the
|
|
||||||
cleanup chain, so no need to worry about it here. */
|
|
||||||
|
|
||||||
stop_stepping (ecs);
|
|
||||||
return;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_HP_STEP_RESUME:
|
|
||||||
if (debug_infrun)
|
|
||||||
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_HP_STEP_RESUME\n");
|
|
||||||
|
|
||||||
delete_step_resume_breakpoint (ecs->event_thread);
|
|
||||||
if (ecs->event_thread->step_after_step_resume_breakpoint)
|
|
||||||
{
|
|
||||||
/* Back when the step-resume breakpoint was inserted, we
|
|
||||||
were trying to single-step off a breakpoint. Go back
|
|
||||||
to doing that. */
|
|
||||||
ecs->event_thread->step_after_step_resume_breakpoint = 0;
|
|
||||||
ecs->event_thread->stepping_over_breakpoint = 1;
|
|
||||||
keep_going (ecs);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
|
|
||||||
case BPSTAT_WHAT_KEEP_CHECKING:
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* We come here if we hit a breakpoint but should not
|
/* If we hit an internal event that triggers symbol changes, the
|
||||||
stop for it. Possibly we also were stepping
|
current frame will be invalidated within bpstat_what (e.g., if we
|
||||||
and should stop for that. So fall through and
|
hit an internal solib event). Re-fetch it. */
|
||||||
test for stepping. But, if not stepping,
|
frame = get_current_frame ();
|
||||||
do not stop. */
|
gdbarch = get_frame_arch (frame);
|
||||||
|
|
||||||
|
switch (what.main_action)
|
||||||
|
{
|
||||||
|
case BPSTAT_WHAT_SET_LONGJMP_RESUME:
|
||||||
|
/* If we hit the breakpoint at longjmp while stepping, we
|
||||||
|
install a momentary breakpoint at the target of the
|
||||||
|
jmp_buf. */
|
||||||
|
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME\n");
|
||||||
|
|
||||||
|
ecs->event_thread->stepping_over_breakpoint = 1;
|
||||||
|
|
||||||
|
if (what.is_longjmp)
|
||||||
|
{
|
||||||
|
struct value *arg_value;
|
||||||
|
|
||||||
|
/* If we set the longjmp breakpoint via a SystemTap probe,
|
||||||
|
then use it to extract the arguments. The destination PC
|
||||||
|
is the third argument to the probe. */
|
||||||
|
arg_value = probe_safe_evaluate_at_pc (frame, 2);
|
||||||
|
if (arg_value)
|
||||||
|
jmp_buf_pc = value_as_address (arg_value);
|
||||||
|
else if (!gdbarch_get_longjmp_target_p (gdbarch)
|
||||||
|
|| !gdbarch_get_longjmp_target (gdbarch,
|
||||||
|
frame, &jmp_buf_pc))
|
||||||
|
{
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME "
|
||||||
|
"(!gdbarch_get_longjmp_target)\n");
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Insert a breakpoint at resume address. */
|
||||||
|
insert_longjmp_resume_breakpoint (gdbarch, jmp_buf_pc);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
check_exception_resume (ecs, frame);
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_CLEAR_LONGJMP_RESUME:
|
||||||
|
{
|
||||||
|
struct frame_info *init_frame;
|
||||||
|
|
||||||
|
/* There are several cases to consider.
|
||||||
|
|
||||||
|
1. The initiating frame no longer exists. In this case we
|
||||||
|
must stop, because the exception or longjmp has gone too
|
||||||
|
far.
|
||||||
|
|
||||||
|
2. The initiating frame exists, and is the same as the
|
||||||
|
current frame. We stop, because the exception or longjmp
|
||||||
|
has been caught.
|
||||||
|
|
||||||
|
3. The initiating frame exists and is different from the
|
||||||
|
current frame. This means the exception or longjmp has
|
||||||
|
been caught beneath the initiating frame, so keep going.
|
||||||
|
|
||||||
|
4. longjmp breakpoint has been placed just to protect
|
||||||
|
against stale dummy frames and user is not interested in
|
||||||
|
stopping around longjmps. */
|
||||||
|
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog,
|
||||||
|
"infrun: BPSTAT_WHAT_CLEAR_LONGJMP_RESUME\n");
|
||||||
|
|
||||||
|
gdb_assert (ecs->event_thread->control.exception_resume_breakpoint
|
||||||
|
!= NULL);
|
||||||
|
delete_exception_resume_breakpoint (ecs->event_thread);
|
||||||
|
|
||||||
|
if (what.is_longjmp)
|
||||||
|
{
|
||||||
|
check_longjmp_breakpoint_for_call_dummy (ecs->event_thread->num);
|
||||||
|
|
||||||
|
if (!frame_id_p (ecs->event_thread->initiating_frame))
|
||||||
|
{
|
||||||
|
/* Case 4. */
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
init_frame = frame_find_by_id (ecs->event_thread->initiating_frame);
|
||||||
|
|
||||||
|
if (init_frame)
|
||||||
|
{
|
||||||
|
struct frame_id current_id
|
||||||
|
= get_frame_id (get_current_frame ());
|
||||||
|
if (frame_id_eq (current_id,
|
||||||
|
ecs->event_thread->initiating_frame))
|
||||||
|
{
|
||||||
|
/* Case 2. Fall through. */
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
/* Case 3. */
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/* For Cases 1 and 2, remove the step-resume breakpoint, if it
|
||||||
|
exists. */
|
||||||
|
delete_step_resume_breakpoint (ecs->event_thread);
|
||||||
|
|
||||||
|
ecs->event_thread->control.stop_step = 1;
|
||||||
|
print_end_stepping_range_reason ();
|
||||||
|
stop_stepping (ecs);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_SINGLE:
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_SINGLE\n");
|
||||||
|
ecs->event_thread->stepping_over_breakpoint = 1;
|
||||||
|
/* Still need to check other stuff, at least the case where we
|
||||||
|
are stepping and step out of the right range. */
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_STEP_RESUME:
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STEP_RESUME\n");
|
||||||
|
|
||||||
|
delete_step_resume_breakpoint (ecs->event_thread);
|
||||||
|
if (ecs->event_thread->control.proceed_to_finish
|
||||||
|
&& execution_direction == EXEC_REVERSE)
|
||||||
|
{
|
||||||
|
struct thread_info *tp = ecs->event_thread;
|
||||||
|
|
||||||
|
/* We are finishing a function in reverse, and just hit the
|
||||||
|
step-resume breakpoint at the start address of the
|
||||||
|
function, and we're almost there -- just need to back up
|
||||||
|
by one more single-step, which should take us back to the
|
||||||
|
function call. */
|
||||||
|
tp->control.step_range_start = tp->control.step_range_end = 1;
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fill_in_stop_func (gdbarch, ecs);
|
||||||
|
if (stop_pc == ecs->stop_func_start
|
||||||
|
&& execution_direction == EXEC_REVERSE)
|
||||||
|
{
|
||||||
|
/* We are stepping over a function call in reverse, and just
|
||||||
|
hit the step-resume breakpoint at the start address of
|
||||||
|
the function. Go back to single-stepping, which should
|
||||||
|
take us back to the function call. */
|
||||||
|
ecs->event_thread->stepping_over_breakpoint = 1;
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_STOP_NOISY:
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_NOISY\n");
|
||||||
|
stop_print_frame = 1;
|
||||||
|
|
||||||
|
/* We are about to nuke the step_resume_breakpointt via the
|
||||||
|
cleanup chain, so no need to worry about it here. */
|
||||||
|
|
||||||
|
stop_stepping (ecs);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_STOP_SILENT:
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_STOP_SILENT\n");
|
||||||
|
stop_print_frame = 0;
|
||||||
|
|
||||||
|
/* We are about to nuke the step_resume_breakpoin via the
|
||||||
|
cleanup chain, so no need to worry about it here. */
|
||||||
|
|
||||||
|
stop_stepping (ecs);
|
||||||
|
return;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_HP_STEP_RESUME:
|
||||||
|
if (debug_infrun)
|
||||||
|
fprintf_unfiltered (gdb_stdlog, "infrun: BPSTAT_WHAT_HP_STEP_RESUME\n");
|
||||||
|
|
||||||
|
delete_step_resume_breakpoint (ecs->event_thread);
|
||||||
|
if (ecs->event_thread->step_after_step_resume_breakpoint)
|
||||||
|
{
|
||||||
|
/* Back when the step-resume breakpoint was inserted, we
|
||||||
|
were trying to single-step off a breakpoint. Go back to
|
||||||
|
doing that. */
|
||||||
|
ecs->event_thread->step_after_step_resume_breakpoint = 0;
|
||||||
|
ecs->event_thread->stepping_over_breakpoint = 1;
|
||||||
|
keep_going (ecs);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
|
||||||
|
case BPSTAT_WHAT_KEEP_CHECKING:
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* We come here if we hit a breakpoint but should not stop for it.
|
||||||
|
Possibly we also were stepping and should stop for that. So fall
|
||||||
|
through and test for stepping. But, if not stepping, do not
|
||||||
|
stop. */
|
||||||
|
|
||||||
/* In all-stop mode, if we're currently stepping but have stopped in
|
/* In all-stop mode, if we're currently stepping but have stopped in
|
||||||
some other thread, we need to switch back to the stepped thread. */
|
some other thread, we need to switch back to the stepped thread. */
|
||||||
|
Loading…
Reference in New Issue
Block a user