diff options
author | Andrew Cagney <cagney@redhat.com> | 2004-05-11 16:57:04 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2004-05-11 16:57:04 +0000 |
commit | 42edda508ef24ada777099d51f200a3b674a1724 (patch) | |
tree | 08f7e9df5e68946ba1b718e14a79d4fcc3746dac | |
parent | d28b44a731de335df91e1c950b8100d67edef854 (diff) | |
download | fsf-binutils-gdb-42edda508ef24ada777099d51f200a3b674a1724.zip fsf-binutils-gdb-42edda508ef24ada777099d51f200a3b674a1724.tar.gz fsf-binutils-gdb-42edda508ef24ada777099d51f200a3b674a1724.tar.bz2 |
2004-05-11 Andrew Cagney <cagney@redhat.com>
* infrun.c (handle_inferior_event): Simplify code handling
step-into or return-from a signal trampoline.
Index: testsuite/ChangeLog
2004-05-11 Andrew Cagney <cagney@redhat.com>
* gdb.base/sigstep.exp (advancei): Update KFAILs. gdb/1613 is
fixed but revealed gdb/1639.
-rw-r--r-- | gdb/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/infrun.c | 79 | ||||
-rw-r--r-- | gdb/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/testsuite/gdb.base/sigstep.exp | 19 |
4 files changed, 32 insertions, 76 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index b48a23b..46fd196 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,10 @@ 2004-05-11 Andrew Cagney <cagney@redhat.com> + * infrun.c (handle_inferior_event): Simplify code handling + step-into or return-from a signal trampoline. + +2004-05-11 Andrew Cagney <cagney@redhat.com> + * ppcnbsd-tdep.c: Include "gdb_assert.h". * Makefile.in (ppcnbsd-tdep.o): Update dependencies. diff --git a/gdb/infrun.c b/gdb/infrun.c index 298b5f42..74134e6 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2412,75 +2412,16 @@ process_event_stop_test: But we can update it every time we leave the step range. */ ecs->update_step_sp = 1; - /* Did we just step into a singal trampoline (either by stepping out - of a handler, or by taking a signal)? */ - if (get_frame_type (get_current_frame ()) == SIGTRAMP_FRAME - && !frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id)) - { - { - struct frame_id current_frame = get_frame_id (get_current_frame ()); - - if (frame_id_inner (current_frame, step_frame_id)) - { - /* We have just taken a signal; go until we are back to - the point where we took it and one more. */ - - /* This code is needed at least in the following case: - The user types "next" and then a signal arrives (before - the "next" is done). */ - - /* Note that if we are stopped at a breakpoint, then we need - the step_resume breakpoint to override any breakpoints at - the same location, so that we will still step over the - breakpoint even though the signal happened. */ - struct symtab_and_line sr_sal; - - init_sal (&sr_sal); - sr_sal.symtab = NULL; - sr_sal.line = 0; - sr_sal.pc = prev_pc; - /* We could probably be setting the frame to - step_frame_id; I don't think anyone thought to try it. */ - check_for_old_step_resume_breakpoint (); - step_resume_breakpoint = - set_momentary_breakpoint (sr_sal, null_frame_id, bp_step_resume); - if (breakpoints_inserted) - insert_breakpoints (); - } - else - { - /* We just stepped out of a signal handler and into - its calling trampoline. - - Normally, we'd call step_over_function from - here, but for some reason GDB can't unwind the - stack correctly to find the real PC for the point - user code where the signal trampoline will return - -- FRAME_SAVED_PC fails, at least on HP-UX 10.20. - But signal trampolines are pretty small stubs of - code, anyway, so it's OK instead to just - single-step out. Note: assuming such trampolines - don't exhibit recursion on any platform... */ - find_pc_partial_function (stop_pc, &ecs->stop_func_name, - &ecs->stop_func_start, - &ecs->stop_func_end); - /* Readjust stepping range */ - step_range_start = ecs->stop_func_start; - step_range_end = ecs->stop_func_end; - ecs->stepping_through_sigtramp = 1; - } - } - - - /* If this is stepi or nexti, make sure that the stepping range - gets us past that instruction. */ - if (step_range_end == 1) - /* FIXME: Does this run afoul of the code below which, if - we step into the middle of a line, resets the stepping - range? */ - step_range_end = (step_range_start = prev_pc) + 1; - - ecs->remove_breakpoints_on_following_step = 1; + if (step_range_end != 1 + && (step_over_calls == STEP_OVER_UNDEBUGGABLE + || step_over_calls == STEP_OVER_ALL) + && get_frame_type (get_current_frame ()) == SIGTRAMP_FRAME) + { + /* The inferior, while doing a "step" or "next", has ended up in + a signal trampoline (either by a signal being delivered or by + the signal handler returning). Just single-step until the + inferior leaves the trampoline (either by calling the handler + or returning). */ keep_going (ecs); return; } diff --git a/gdb/testsuite/ChangeLog b/gdb/testsuite/ChangeLog index 29a29cb..ae02e30 100644 --- a/gdb/testsuite/ChangeLog +++ b/gdb/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2004-05-11 Andrew Cagney <cagney@redhat.com> + + * gdb.base/sigstep.exp (advancei): Update KFAILs. gdb/1613 is + fixed but revealed gdb/1639. + 2004-05-10 Andrew Cagney <cagney@redhat.com> * gdb.base/signals.exp (signal_tests_1): Simplify "continue to diff --git a/gdb/testsuite/gdb.base/sigstep.exp b/gdb/testsuite/gdb.base/sigstep.exp index e0eaf75..ea16ec6 100644 --- a/gdb/testsuite/gdb.base/sigstep.exp +++ b/gdb/testsuite/gdb.base/sigstep.exp @@ -87,7 +87,8 @@ proc advance { i } { exp_continue } -re "Program exited normally.*${gdb_prompt} $" { - kfail gdb/1613 "$test (program exited)" + setup_kfail powerpc-*-*bsd* gdb/1639 + fail "$test (program exited)" } -re "(while ..done|return 0).*${gdb_prompt} $" { # After stepping out of a function /r signal-handler, GDB will @@ -122,13 +123,13 @@ proc advancei { i } { -re "signal handler called.*${gdb_prompt} $" { pass "$test" } - -re "Program exited normally.*${gdb_prompt} $" { - kfail gdb/1613 "$test (program exited)" - set program_exited 1 - } -re "main .*${gdb_prompt} $" { fail "$test (in main)" } + -re "Program exited normally.*${gdb_prompt} $" { + fail "$test (program exited)" + set program_exited 1 + } -re "Make handler return now.*y or n. $" { send_gdb "y\n" exp_continue @@ -151,12 +152,16 @@ proc advancei { i } { send_gdb "y\n" exp_continue } + -re "Program exited normally.*${gdb_prompt} $" { + kfail gdb/1639 "$test (program exited)" + set program_exited 1 + } -re "The program is not being run.*${gdb_prompt} $" { if { $program_exited } { # Previously kfailed with an exit - pass "$test (The program is not being run)" + pass "$test (the program is not being run)" } else { - fail "$test" + fail "$test (the program is not being run)" } } } |