From: Pedro Alves Date: Sun, 15 Nov 2009 20:10:34 +0000 (+0000) Subject: * infrun.c (handle_inferior_event): When handling a fork or vfork X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=678229626ec8f1a0d0d5c494335c05e9d0b52832;p=binutils-gdb.git * 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. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 500eaf826ac..93fdd8cc68a 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +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 diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 0034338a0ee..c6140b0cfbc 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 d23a852cb46..91e864cd04f 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 c28366f5da9..98e215c7e74 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)