summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2004-05-11 16:57:04 +0000
committerAndrew Cagney <cagney@redhat.com>2004-05-11 16:57:04 +0000
commit42edda508ef24ada777099d51f200a3b674a1724 (patch)
tree08f7e9df5e68946ba1b718e14a79d4fcc3746dac
parentd28b44a731de335df91e1c950b8100d67edef854 (diff)
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/ChangeLog5
-rw-r--r--gdb/infrun.c79
-rw-r--r--gdb/testsuite/ChangeLog5
-rw-r--r--gdb/testsuite/gdb.base/sigstep.exp19
4 files changed, 32 insertions, 76 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index b48a23bcb5..46fd196b5d 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 298b5f4250..74134e6a6e 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 29a29cbc59..ae02e302c8 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 e0eaf759df..ea16ec680c 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)"
}
}
}