* breakpoint.c (update_global_location_list): Add boolean

"should_insert" argument.  Only insert locations if caller told it
	too.
	(update_global_location_list_nothrow): Add boolean "should_insert"
	argument.  Pass it to update_global_location_list.
	(insert_breakpoints, create_longjmp_breakpoint)
	(create_overlay_event_breakpoint, enable_overlay_breakpoints)
	(create_thread_event_breakpoint, create_solib_event_breakpoint)
	(create_fork_vfork_event_catchpoint, create_exec_event_catchpoint)
	(enable_watchpoints_after_interactive_call_stop)
	(set_momentary_breakpoint, create_breakpoints)
	(break_command_really, watch_command_1)
	(create_ada_exception_breakpoint, update_breakpoint_locations)
	(do_enable_breakpoint, enable_command): Pass true to
	update_global_location_list.
	(bpstat_stop_status, disable_overlay_breakpoints)
	(disable_watchpoints_before_interactive_call_start)
	(delete_breakpoint, disable_breakpoint, disable_command): Pass
	false to update_global_location_list.
	(update_breakpoints_after_exec): Don't temporarily disable
	always-inserted mode.
This commit is contained in:
Pedro Alves 2008-07-08 11:09:40 +00:00
parent 25b22b0a6f
commit b60e7edffe
2 changed files with 68 additions and 37 deletions

View file

@ -1,3 +1,27 @@
2008-07-08 Pedro Alves <pedro@codesourcery.com>
* breakpoint.c (update_global_location_list): Add boolean
"should_insert" argument. Only insert locations if caller told it
too.
(update_global_location_list_nothrow): Add boolean "should_insert"
argument. Pass it to update_global_location_list.
(insert_breakpoints, create_longjmp_breakpoint)
(create_overlay_event_breakpoint, enable_overlay_breakpoints)
(create_thread_event_breakpoint, create_solib_event_breakpoint)
(create_fork_vfork_event_catchpoint, create_exec_event_catchpoint)
(enable_watchpoints_after_interactive_call_stop)
(set_momentary_breakpoint, create_breakpoints)
(break_command_really, watch_command_1)
(create_ada_exception_breakpoint, update_breakpoint_locations)
(do_enable_breakpoint, enable_command): Pass true to
update_global_location_list.
(bpstat_stop_status, disable_overlay_breakpoints)
(disable_watchpoints_before_interactive_call_start)
(delete_breakpoint, disable_breakpoint, disable_command): Pass
false to update_global_location_list.
(update_breakpoints_after_exec): Don't temporarily disable
always-inserted mode.
2008-07-08 Pedro Alves <pedro@codesourcery.com> 2008-07-08 Pedro Alves <pedro@codesourcery.com>
* breakpoint.c (mark_breakpoints_out): Make public. * breakpoint.c (mark_breakpoints_out): Make public.

View file

@ -191,9 +191,9 @@ static void free_bp_location (struct bp_location *loc);
static struct bp_location * static struct bp_location *
allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type); allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type);
static void update_global_location_list (void); static void update_global_location_list (int);
static void update_global_location_list_nothrow (void); static void update_global_location_list_nothrow (int);
static int is_hardware_watchpoint (struct breakpoint *bpt); static int is_hardware_watchpoint (struct breakpoint *bpt);
@ -1264,7 +1264,7 @@ insert_breakpoints (void)
if (is_hardware_watchpoint (bpt)) if (is_hardware_watchpoint (bpt))
update_watchpoint (bpt, 0 /* don't reparse. */); update_watchpoint (bpt, 0 /* don't reparse. */);
update_global_location_list (); update_global_location_list (1);
if (!always_inserted_mode && target_has_execution) if (!always_inserted_mode && target_has_execution)
/* update_global_location_list does not insert breakpoints /* update_global_location_list does not insert breakpoints
@ -1442,7 +1442,6 @@ update_breakpoints_after_exec (void)
struct breakpoint *b; struct breakpoint *b;
struct breakpoint *temp; struct breakpoint *temp;
struct bp_location *bploc; struct bp_location *bploc;
struct cleanup *cleanup;
/* We're about to delete breakpoints from GDB's lists. If the /* We're about to delete breakpoints from GDB's lists. If the
INSERTED flag is true, GDB will try to lift the breakpoints by INSERTED flag is true, GDB will try to lift the breakpoints by
@ -1455,12 +1454,6 @@ update_breakpoints_after_exec (void)
ALL_BP_LOCATIONS (bploc) ALL_BP_LOCATIONS (bploc)
gdb_assert (!bploc->inserted); gdb_assert (!bploc->inserted);
/* The binary we used to debug is now gone, and we're updating
breakpoints for the new binary. Until we're done, we should not
try to insert breakpoints. */
cleanup = make_cleanup_restore_integer (&always_inserted_mode);
always_inserted_mode = 0;
ALL_BREAKPOINTS_SAFE (b, temp) ALL_BREAKPOINTS_SAFE (b, temp)
{ {
/* Solib breakpoints must be explicitly reset after an exec(). */ /* Solib breakpoints must be explicitly reset after an exec(). */
@ -1550,7 +1543,6 @@ update_breakpoints_after_exec (void)
} }
/* FIXME what about longjmp breakpoints? Re-create them here? */ /* FIXME what about longjmp breakpoints? Re-create them here? */
create_overlay_event_breakpoint ("_ovly_debug_event"); create_overlay_event_breakpoint ("_ovly_debug_event");
do_cleanups (cleanup);
} }
int int
@ -3070,7 +3062,7 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
if (b->disposition == disp_disable) if (b->disposition == disp_disable)
{ {
b->enable_state = bp_disabled; b->enable_state = bp_disabled;
update_global_location_list (); update_global_location_list (0);
} }
if (b->silent) if (b->silent)
bs->print = 0; bs->print = 0;
@ -4482,7 +4474,7 @@ create_longjmp_breakpoint (char *func_name)
if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL) if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL)
return; return;
set_momentary_breakpoint_at_pc (SYMBOL_VALUE_ADDRESS (m), bp_longjmp); set_momentary_breakpoint_at_pc (SYMBOL_VALUE_ADDRESS (m), bp_longjmp);
update_global_location_list (); update_global_location_list (1);
} }
/* Call this routine when stepping and nexting to enable a breakpoint /* Call this routine when stepping and nexting to enable a breakpoint
@ -4540,7 +4532,7 @@ create_overlay_event_breakpoint (char *func_name)
b->enable_state = bp_disabled; b->enable_state = bp_disabled;
overlay_events_enabled = 0; overlay_events_enabled = 0;
} }
update_global_location_list (); update_global_location_list (1);
} }
void void
@ -4552,7 +4544,7 @@ enable_overlay_breakpoints (void)
if (b->type == bp_overlay_event) if (b->type == bp_overlay_event)
{ {
b->enable_state = bp_enabled; b->enable_state = bp_enabled;
update_global_location_list (); update_global_location_list (1);
overlay_events_enabled = 1; overlay_events_enabled = 1;
} }
} }
@ -4566,7 +4558,7 @@ disable_overlay_breakpoints (void)
if (b->type == bp_overlay_event) if (b->type == bp_overlay_event)
{ {
b->enable_state = bp_disabled; b->enable_state = bp_disabled;
update_global_location_list (); update_global_location_list (0);
overlay_events_enabled = 0; overlay_events_enabled = 0;
} }
} }
@ -4582,7 +4574,7 @@ create_thread_event_breakpoint (CORE_ADDR address)
/* addr_string has to be used or breakpoint_re_set will delete me. */ /* addr_string has to be used or breakpoint_re_set will delete me. */
b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address)); b->addr_string = xstrprintf ("*0x%s", paddr (b->loc->address));
update_global_location_list_nothrow (); update_global_location_list_nothrow (1);
return b; return b;
} }
@ -4628,7 +4620,7 @@ create_solib_event_breakpoint (CORE_ADDR address)
struct breakpoint *b; struct breakpoint *b;
b = create_internal_breakpoint (address, bp_shlib_event); b = create_internal_breakpoint (address, bp_shlib_event);
update_global_location_list_nothrow (); update_global_location_list_nothrow (1);
return b; return b;
} }
@ -4726,7 +4718,7 @@ create_fork_vfork_event_catchpoint (int tempflag, char *cond_string,
b->enable_state = bp_enabled; b->enable_state = bp_enabled;
b->disposition = tempflag ? disp_del : disp_donttouch; b->disposition = tempflag ? disp_del : disp_donttouch;
b->forked_inferior_pid = 0; b->forked_inferior_pid = 0;
update_global_location_list (); update_global_location_list (1);
mention (b); mention (b);
@ -4765,7 +4757,7 @@ create_exec_event_catchpoint (int tempflag, char *cond_string)
b->addr_string = NULL; b->addr_string = NULL;
b->enable_state = bp_enabled; b->enable_state = bp_enabled;
b->disposition = tempflag ? disp_del : disp_donttouch; b->disposition = tempflag ? disp_del : disp_donttouch;
update_global_location_list (); update_global_location_list (1);
mention (b); mention (b);
} }
@ -4821,7 +4813,7 @@ disable_watchpoints_before_interactive_call_start (void)
&& breakpoint_enabled (b)) && breakpoint_enabled (b))
{ {
b->enable_state = bp_call_disabled; b->enable_state = bp_call_disabled;
update_global_location_list (); update_global_location_list (0);
} }
} }
} }
@ -4840,7 +4832,7 @@ enable_watchpoints_after_interactive_call_stop (void)
&& (b->enable_state == bp_call_disabled)) && (b->enable_state == bp_call_disabled))
{ {
b->enable_state = bp_enabled; b->enable_state = bp_enabled;
update_global_location_list (); update_global_location_list (1);
} }
} }
} }
@ -4866,7 +4858,7 @@ set_momentary_breakpoint (struct symtab_and_line sal, struct frame_id frame_id,
if (in_thread_list (inferior_ptid)) if (in_thread_list (inferior_ptid))
b->thread = pid_to_thread_id (inferior_ptid); b->thread = pid_to_thread_id (inferior_ptid);
update_global_location_list_nothrow (); update_global_location_list_nothrow (1);
return b; return b;
} }
@ -5288,7 +5280,7 @@ create_breakpoints (struct symtabs_and_lines sals, char **addr_string,
thread, ignore_count, ops, from_tty); thread, ignore_count, ops, from_tty);
} }
update_global_location_list (); update_global_location_list (1);
} }
/* Parse ARG which is assumed to be a SAL specification possibly /* Parse ARG which is assumed to be a SAL specification possibly
@ -5609,7 +5601,7 @@ break_command_really (char *arg, char *cond_string, int thread,
b->condition_not_parsed = 1; b->condition_not_parsed = 1;
b->ops = ops; b->ops = ops;
update_global_location_list (); update_global_location_list (1);
mention (b); mention (b);
} }
@ -6038,7 +6030,7 @@ watch_command_1 (char *arg, int accessflag, int from_tty)
value_free_to_mark (mark); value_free_to_mark (mark);
mention (b); mention (b);
update_global_location_list (); update_global_location_list (1);
} }
/* Return count of locations need to be watched and can be handled /* Return count of locations need to be watched and can be handled
@ -6676,7 +6668,7 @@ create_ada_exception_breakpoint (struct symtab_and_line sal,
b->ops = ops; b->ops = ops;
mention (b); mention (b);
update_global_location_list (); update_global_location_list (1);
} }
/* Implement the "catch exception" command. */ /* Implement the "catch exception" command. */
@ -7000,8 +6992,23 @@ breakpoint_auto_delete (bpstat bs)
} }
} }
/* If SHOULD_INSERT is true, do not insert any breakpoint locations
into the inferior, only remove already-inserted locations that no
longer should be inserted. Functions that delete a breakpoint or
breakpoints should pass false, so that deleting a breakpoint
doesn't have the side effect of inserting the locations of other
breakpoints that are marked not-inserted, but should_be_inserted
returns true on them.
This behaviour is useful is situations close to tear-down -- e.g.,
after an exec, while the target still has execution, but breakpoint
shadows of the previous executable image should *NOT* be restored
to the new image; or before detaching, where the target still has
execution and wants to delete breakpoints from GDB's lists, and all
breakpoints had already been removed from the inferior. */
static void static void
update_global_location_list (void) update_global_location_list (int should_insert)
{ {
struct breakpoint *b; struct breakpoint *b;
struct bp_location **next = &bp_location_chain; struct bp_location **next = &bp_location_chain;
@ -7133,7 +7140,7 @@ update_global_location_list (void)
check_duplicates (b); check_duplicates (b);
} }
if (always_inserted_mode && target_has_execution) if (always_inserted_mode && should_insert && target_has_execution)
insert_breakpoint_locations (); insert_breakpoint_locations ();
} }
@ -7153,11 +7160,11 @@ breakpoint_retire_moribund (void)
} }
static void static void
update_global_location_list_nothrow (void) update_global_location_list_nothrow (int inserting)
{ {
struct gdb_exception e; struct gdb_exception e;
TRY_CATCH (e, RETURN_MASK_ERROR) TRY_CATCH (e, RETURN_MASK_ERROR)
update_global_location_list (); update_global_location_list (inserting);
} }
/* Delete a breakpoint and clean up all traces of it in the data /* Delete a breakpoint and clean up all traces of it in the data
@ -7247,7 +7254,7 @@ delete_breakpoint (struct breakpoint *bpt)
looks at location's owner. It might be better looks at location's owner. It might be better
design to have location completely self-contained, design to have location completely self-contained,
but it's not the case now. */ but it's not the case now. */
update_global_location_list (); update_global_location_list (0);
/* On the chance that someone will soon try again to delete this same /* On the chance that someone will soon try again to delete this same
@ -7457,7 +7464,7 @@ update_breakpoint_locations (struct breakpoint *b,
} }
} }
update_global_location_list (); update_global_location_list (1);
} }
@ -7843,7 +7850,7 @@ disable_breakpoint (struct breakpoint *bpt)
bpt->enable_state = bp_disabled; bpt->enable_state = bp_disabled;
update_global_location_list (); update_global_location_list (0);
if (deprecated_modify_breakpoint_hook) if (deprecated_modify_breakpoint_hook)
deprecated_modify_breakpoint_hook (bpt); deprecated_modify_breakpoint_hook (bpt);
@ -7882,7 +7889,7 @@ disable_command (char *args, int from_tty)
struct bp_location *loc = find_location_by_number (args); struct bp_location *loc = find_location_by_number (args);
if (loc) if (loc)
loc->enabled = 0; loc->enabled = 0;
update_global_location_list (); update_global_location_list (0);
} }
else else
map_breakpoint_numbers (args, disable_breakpoint); map_breakpoint_numbers (args, disable_breakpoint);
@ -7967,7 +7974,7 @@ have been allocated for other watchpoints.\n"), bpt->number);
if (bpt->enable_state != bp_permanent) if (bpt->enable_state != bp_permanent)
bpt->enable_state = bp_enabled; bpt->enable_state = bp_enabled;
bpt->disposition = disposition; bpt->disposition = disposition;
update_global_location_list (); update_global_location_list (1);
breakpoints_changed (); breakpoints_changed ();
if (deprecated_modify_breakpoint_hook) if (deprecated_modify_breakpoint_hook)
@ -8018,7 +8025,7 @@ enable_command (char *args, int from_tty)
struct bp_location *loc = find_location_by_number (args); struct bp_location *loc = find_location_by_number (args);
if (loc) if (loc)
loc->enabled = 1; loc->enabled = 1;
update_global_location_list (); update_global_location_list (1);
} }
else else
map_breakpoint_numbers (args, enable_breakpoint); map_breakpoint_numbers (args, enable_breakpoint);