diff options
author | Michael Snyder <msnyder@specifix.com> | 2008-10-06 23:48:30 +0000 |
---|---|---|
committer | Michael Snyder <msnyder@specifix.com> | 2008-10-06 23:48:30 +0000 |
commit | 7bc90c29e0fc058a50dfa120197470545fd85705 (patch) | |
tree | 8138e3015567dc2716ff6508742dc12163f34377 | |
parent | f2845775b50ab189123bda053129c3f058a05d48 (diff) | |
download | gdb-7bc90c29e0fc058a50dfa120197470545fd85705.tar.gz |
2008-10-06 Michael Snyder <msnyder@vmware.com>
* infrun.c (step_into_function): Rename to stepped_into_function.
Split into two versions (normal (forward), and reverse).
(handle_inferior_event): Call stepped_into_function or
stepped_into_function_backward, depending on exec_direction.
-rw-r--r-- | gdb/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/infrun.c | 85 |
2 files changed, 58 insertions, 31 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 84573bc71a9..91dbce8228f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,9 @@ 2008-10-06 Michael Snyder <msnyder@vmware.com> + * infrun.c (step_into_function): Rename to stepped_into_function. + Split into two versions (normal (forward), and reverse). + (handle_inferior_event): Call stepped_into_function or + stepped_into_function_backward, depending on exec_direction. * infrun.c (handle_inferior_event): Comment rewording. * remote.c (remote_get_exec_direction): Use i18n macros. (remote_set_exec_direction): Ditto. diff --git a/gdb/infrun.c b/gdb/infrun.c index b4651d932cc..09a29b97ca8 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -1472,7 +1472,8 @@ void init_execution_control_state (struct execution_control_state *ecs); void handle_inferior_event (struct execution_control_state *ecs); -static void step_into_function (struct execution_control_state *ecs); +static void stepped_into_function (struct execution_control_state *ecs); +static void stepped_into_function_backward (struct execution_control_state *ecs); static void insert_step_resume_breakpoint_at_frame (struct frame_info *step_frame); static void insert_step_resume_breakpoint_at_caller (struct frame_info *); static void insert_step_resume_breakpoint_at_sal (struct symtab_and_line sr_sal, @@ -3247,7 +3248,13 @@ infrun: BPSTAT_WHAT_SET_LONGJMP_RESUME (!gdbarch_get_longjmp_target)\n"); tmp_sal = find_pc_line (ecs->stop_func_start, 0); if (tmp_sal.line != 0) { - step_into_function (ecs); + /* Find start of appropriate source line (either first or + last line in callee, depending on execution + direction). */ + if (target_get_execution_direction () == EXEC_REVERSE) + stepped_into_function_backward (ecs); + else + stepped_into_function (ecs); return; } } @@ -3580,42 +3587,21 @@ currently_stepping (struct thread_stepping_state *tss) || reverse_resume_need_step); } -/* Subroutine call with source code we should not step over. Do step - to the first line of code in it. */ - -static void -step_into_function (struct execution_control_state *ecs) +/* Inferior has stepped into a subroutine call with source code that + we should not step over. Do step to the first line of code in + it. */ + + static void +stepped_into_function (struct execution_control_state *ecs) { struct symtab *s; struct symtab_and_line stop_func_sal, sr_sal; s = find_pc_symtab (stop_pc); if (s && s->language != language_asm) - ecs->stop_func_start = gdbarch_skip_prologue - (current_gdbarch, ecs->stop_func_start); - - if (target_get_execution_direction () == EXEC_REVERSE) - { - stop_func_sal = find_pc_line (stop_pc, 0); + ecs->stop_func_start = gdbarch_skip_prologue (current_gdbarch, + ecs->stop_func_start); - /* OK, we're just going to keep stepping here. */ - if (stop_func_sal.pc == stop_pc) - { - /* We're there already. Just stop stepping now. */ - stop_step = 1; - print_stop_reason (END_STEPPING_RANGE, 0); - stop_stepping (ecs); - return; - } - /* Else just reset the step range and keep going. - No step-resume breakpoint, they don't work for - epilogues, which can have multiple entry paths. */ - step_range_start = stop_func_sal.pc; - step_range_end = stop_func_sal.end; - keep_going (ecs); - return; - } - /* else... */ stop_func_sal = find_pc_line (ecs->stop_func_start, 0); /* Use the step_resume_break to step until the end of the prologue, even if that involves jumps (as it seems to on the vax under @@ -3677,6 +3663,43 @@ step_into_function (struct execution_control_state *ecs) keep_going (ecs); } +/* Inferior has stepped backward into a subroutine call with source + code that we should not step over. Do step to the beginning of the + last line of code in it. */ + +static void +stepped_into_function_backward (struct execution_control_state *ecs) +{ + struct symtab *s; + struct symtab_and_line stop_func_sal, sr_sal; + + s = find_pc_symtab (stop_pc); + if (s && s->language != language_asm) + ecs->stop_func_start = gdbarch_skip_prologue (current_gdbarch, + ecs->stop_func_start); + + stop_func_sal = find_pc_line (stop_pc, 0); + + /* OK, we're just going to keep stepping here. */ + if (stop_func_sal.pc == stop_pc) + { + /* We're there already. Just stop stepping now. */ + stop_step = 1; + print_stop_reason (END_STEPPING_RANGE, 0); + stop_stepping (ecs); + } + else + { + /* Else just reset the step range and keep going. + No step-resume breakpoint, they don't work for + epilogues, which can have multiple entry paths. */ + step_range_start = stop_func_sal.pc; + step_range_end = stop_func_sal.end; + keep_going (ecs); + } + return; +} + /* Insert a "step-resume breakpoint" at SR_SAL with frame ID SR_ID. This is used to both functions and to skip over code. */ |