From 678229626ec8f1a0d0d5c494335c05e9d0b52832 Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Sun, 15 Nov 2009 20:10:34 +0000 Subject: [PATCH] * infrun.c (handle_inferior_event): When handling a fork or vfork event, check if the bpstat causes a stop, instead of if it explains the signal. * breakpoint.c (bpstat_causes_stop): New. * breakpoint.h (bpstat_causes_stop): Declare. --- gdb/ChangeLog | 8 ++++++++ gdb/breakpoint.c | 10 ++++++++++ gdb/breakpoint.h | 3 +++ gdb/infrun.c | 6 +++++- 4 files changed, 26 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 500eaf8..93fdd8c 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,13 @@ 2009-11-15 Pedro Alves + * infrun.c (handle_inferior_event): When handling a fork or vfork + event, check if the bpstat causes a stop, instead of if it + explains the signal. + * breakpoint.c (bpstat_causes_stop): New. + * breakpoint.h (bpstat_causes_stop): Declare. + +2009-11-15 Pedro Alves + * breakpoint.c (should_be_inserted): Don't insert breakpoints if the pspace doesn't allow breakpoints. (insert_breakpoint_locations): Remove waiting_for_vfork_done diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 0034338..c6140b0 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -3816,6 +3816,16 @@ bpstat_should_step (void) return 0; } +int +bpstat_causes_stop (bpstat bs) +{ + for (; bs != NULL; bs = bs->next) + if (bs->stop) + return 1; + + return 0; +} + static void print_breakpoint_location (struct breakpoint *b, diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index d23a852..91e864c 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -629,6 +629,9 @@ extern struct breakpoint *bpstat_find_step_resume_breakpoint (bpstat); a watchpoint enabled. */ #define bpstat_explains_signal(bs) ((bs) != NULL) +/* Nonzero is this bpstat causes a stop. */ +extern int bpstat_causes_stop (bpstat); + /* Nonzero if we should step constantly (e.g. watchpoints on machines without hardware support). This isn't related to a specific bpstat, just to things like whether watchpoints are set. */ diff --git a/gdb/infrun.c b/gdb/infrun.c index c28366f..98e215c 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -2946,7 +2946,11 @@ handle_inferior_event (struct execution_control_state *ecs) = bpstat_stop_status (get_regcache_aspace (get_current_regcache ()), stop_pc, ecs->ptid); - ecs->random_signal = !bpstat_explains_signal (ecs->event_thread->stop_bpstat); + /* Note that we're interested in knowing the bpstat actually + causes a stop, not just if it may explain the signal. + Software watchpoints, for example, always appear in the + bpstat. */ + ecs->random_signal = !bpstat_causes_stop (ecs->event_thread->stop_bpstat); /* If no catchpoint triggered for this, then keep going. */ if (ecs->random_signal) -- 2.7.4