aboutsummaryrefslogtreecommitdiff
path: root/gdb/infrun.c
diff options
context:
space:
mode:
authorAndrew Cagney <cagney@redhat.com>2004-03-21 22:53:49 +0000
committerAndrew Cagney <cagney@redhat.com>2004-03-21 22:53:49 +0000
commitca4bb888c147506ec98a7a7bbb8cf5b8a712f2ae (patch)
treee5020bf7ec580e265c84e7f0957c9628a62f99ae /gdb/infrun.c
parent1777c7b4ae24cb323d1a29c268fa9eb43be02d2a (diff)
downloadgdb-ca4bb888c147506ec98a7a7bbb8cf5b8a712f2ae.zip
gdb-ca4bb888c147506ec98a7a7bbb8cf5b8a712f2ae.tar.gz
gdb-ca4bb888c147506ec98a7a7bbb8cf5b8a712f2ae.tar.bz2
2004-03-21 Andrew Cagney <cagney@redhat.com>
* infrun.c (handle_inferior_event): For non legacy frames, use the frame ID and frame type to identify a signal trampoline. Update comments.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r--gdb/infrun.c27
1 files changed, 12 insertions, 15 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c
index a863140..dac9538 100644
--- a/gdb/infrun.c
+++ b/gdb/infrun.c
@@ -2521,22 +2521,19 @@ process_event_stop_test:
But we can update it every time we leave the step range. */
ecs->update_step_sp = 1;
- /* Did we just take a signal? */
- if (pc_in_sigtramp (stop_pc)
- && !pc_in_sigtramp (prev_pc)
- && INNER_THAN (read_sp (), step_sp))
+ /* Did we just step into a singal trampoline (either by stepping out
+ of a handler, or by taking a signal)? */
+ /* NOTE: cagney/2004-03-16: Replaced (except for legacy) a check for
+ "pc_in_sigtramp(stop_pc) != pc_in_sigtramp(step_pc)" with
+ frame_type == SIGTRAMP && !frame_id_eq. The latter is far more
+ robust as it will correctly handle nested signal trampolines. */
+ if (legacy_frame_p (current_gdbarch)
+ ? (pc_in_sigtramp (stop_pc)
+ && !pc_in_sigtramp (prev_pc)
+ && INNER_THAN (read_sp (), step_sp))
+ : (get_frame_type (get_current_frame ()) == SIGTRAMP_FRAME
+ && !frame_id_eq (get_frame_id (get_current_frame ()), step_frame_id)))
{
- /* We've just taken a signal; go until we are back to
- the point where we took it and one more. */
-
- /* Note: The test above succeeds not only when we stepped
- into a signal handler, but also when we step past the last
- statement of a signal handler and end up in the return stub
- of the signal handler trampoline. To distinguish between
- these two cases, check that the frame is INNER_THAN the
- previous one below. pai/1997-09-11 */
-
-
{
struct frame_id current_frame = get_frame_id (get_current_frame ());