* breakpoint.c (update_breakpoints_after_exec): Delete bp_longjmp
	and bp_longjmp_resume breakpoints.
	(breakpoint_address_is_meaningful): Claim bp_longjmp_resume as
	meaningful.
	(create_longjmp_breakpoint): Don't create bp_longjmp_resume
	breakpoints.  Create bp_longjmp breakpoints as momentary
	breakpoints.
	(enable_longjmp_breakpoint): Delete.
	(set_longjmp_breakpoint): New.
	(disable_longjmp_breakpoint): Delete.
	(delete_longjmp_breakpoint): New.
	(set_longjmp_resume_breakpoint): Delete.
	(set_momentary_breakpoint_at_pc): New.
	(breakpoint_re_set_one): Don't delete bp_longjmp and
	bp_longjmp_resume breakpoints.
	(breakpoint_re_set): Don't create longjmp and longjmp-resume
	breakpoints.

	* infrun.c (step_resume_breakpoint): Add comment.
	(struct execution_control_state): Delete handling_longjmp member.
	(init_execution_control_state). Don't clear handling_longjmp.
	(context_switch): Don't context switch handling_longjmp.
	(handle_inferior_event): If handling a bp_longjmp breakpoint,
	create a bp_longjmp_resume breakpoint, and set it as current
	step_resume_breakpoint, then step over the longjmp breakpoint.  If
	handling a bp_longjmp_resume breakpoint, don't delete the longjmp
	breakpoint, delete the longjmp-resume breakpoint, and stop
	stepping.
	(currently_stepping): Remove handling_longjmp from expression.
	(insert_step_resume_breakpoint_at_sal): Update comment.
	(insert_longjmp_resume_breakpoint): New.

	* breakpoint.h (set_momentary_breakpoint_at_pc): Declare.
	(enable_longjmp_breakpoint, disable_longjmp_breakpoint): Delete
	declarations.
	(set_longjmp_breakpoint, delete_longjmp_breakpoint): Declare.
	(set_longjmp_resume_breakpoint): Delete declaration.

	* gdbthread.h (save_infrun_state): Remove handling_longjmp
	parameter.
	(load_infrun_state): Delete *handling_longjmp parameter.
	* thread.c (save_infrun_state): Remove handling_longjmp parameter.
	Update body.
	(load_infrun_state): Delete *handling_longjmp parameter.  Update
	body.

	* infcmd.c (disable_longjmp_breakpoint_cleanup): Delete.
	(delete_longjmp_breakpoint_cleanup): New.
	(step_1): Call set_longjmp_breakpoint instead of
	enable_longjmp_breakpoint.  Use delete_longjmp_breakpoint_cleanup
	instead of disable_longjmp_breakpoint_cleanup when making cleanup.
	(step_1_continuation): Pass thread id in the continuation args to
	step_once.
	(step_once): Add thread parameter.  Pass thread id the the
	continuation.

gdb/testsuite/
	* gdb.cp/annota2.exp: Adjust to breakpoints invalidations at
	different times.
This commit is contained in:
Pedro Alves
2008-05-04 19:39:00 +00:00
parent ff013f42f4
commit 611c83ae47
9 changed files with 204 additions and 118 deletions

View File

@@ -145,8 +145,6 @@ static int watchpoint_check (void *);
static void maintenance_info_breakpoints (char *, int);
static void create_longjmp_breakpoint (char *);
static void create_overlay_event_breakpoint (char *);
static int hw_breakpoint_used_count (void);
@@ -1486,6 +1484,14 @@ update_breakpoints_after_exec (void)
continue;
}
/* Longjmp and longjmp-resume breakpoints are also meaningless
after an exec. */
if (b->type == bp_longjmp || b->type == bp_longjmp_resume)
{
delete_breakpoint (b);
continue;
}
/* Don't delete an exec catchpoint, because else the inferior
won't stop when it ought!
@@ -4081,7 +4087,6 @@ set_default_breakpoint (int valid, CORE_ADDR addr, struct symtab *symtab,
bp_read_watchpoint
bp_access_watchpoint
bp_catch_exec
bp_longjmp_resume
bp_catch_fork
bp_catch_vork */
@@ -4095,7 +4100,6 @@ breakpoint_address_is_meaningful (struct breakpoint *bpt)
&& type != bp_read_watchpoint
&& type != bp_access_watchpoint
&& type != bp_catch_exec
&& type != bp_longjmp_resume
&& type != bp_catch_fork
&& type != bp_catch_vfork);
}
@@ -4453,20 +4457,9 @@ create_longjmp_breakpoint (char *func_name)
struct breakpoint *b;
struct minimal_symbol *m;
if (func_name == NULL)
b = create_internal_breakpoint (0, bp_longjmp_resume);
else
{
if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL)
return;
b = create_internal_breakpoint (SYMBOL_VALUE_ADDRESS (m), bp_longjmp);
}
b->enable_state = bp_disabled;
b->silent = 1;
if (func_name)
b->addr_string = xstrdup (func_name);
if ((m = lookup_minimal_symbol_text (func_name, NULL)) == NULL)
return;
set_momentary_breakpoint_at_pc (SYMBOL_VALUE_ADDRESS (m), bp_longjmp);
update_global_location_list ();
}
@@ -4475,30 +4468,31 @@ create_longjmp_breakpoint (char *func_name)
set_longjmp_resume_breakpoint() to figure out where we are going. */
void
enable_longjmp_breakpoint (void)
set_longjmp_breakpoint (void)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
if (b->type == bp_longjmp)
if (gdbarch_get_longjmp_target_p (current_gdbarch))
{
b->enable_state = bp_enabled;
update_global_location_list ();
create_longjmp_breakpoint ("longjmp");
create_longjmp_breakpoint ("_longjmp");
create_longjmp_breakpoint ("siglongjmp");
create_longjmp_breakpoint ("_siglongjmp");
}
}
/* Delete all longjmp breakpoints from THREAD. */
void
disable_longjmp_breakpoint (void)
delete_longjmp_breakpoint (int thread)
{
struct breakpoint *b;
struct breakpoint *b, *temp;
ALL_BREAKPOINTS (b)
if (b->type == bp_longjmp
|| b->type == bp_longjmp_resume)
{
b->enable_state = bp_disabled;
update_global_location_list ();
}
ALL_BREAKPOINTS_SAFE (b, temp)
if (b->type == bp_longjmp)
{
if (b->thread == thread)
delete_breakpoint (b);
}
}
static void
@@ -4791,30 +4785,6 @@ hw_watchpoint_used_count (enum bptype type, int *other_type_used)
return i;
}
/* Call this after hitting the longjmp() breakpoint. Use this to set
a new breakpoint at the target of the jmp_buf.
FIXME - This ought to be done by setting a temporary breakpoint
that gets deleted automatically... */
void
set_longjmp_resume_breakpoint (CORE_ADDR pc, struct frame_id frame_id)
{
struct breakpoint *b;
ALL_BREAKPOINTS (b)
if (b->type == bp_longjmp_resume)
{
b->loc->requested_address = pc;
b->loc->address = adjust_breakpoint_address (b->loc->requested_address,
b->type);
b->enable_state = bp_enabled;
b->frame_id = frame_id;
update_global_location_list ();
return;
}
}
void
disable_watchpoints_before_interactive_call_start (void)
{
@@ -4878,6 +4848,19 @@ set_momentary_breakpoint (struct symtab_and_line sal, struct frame_id frame_id,
return b;
}
struct breakpoint *
set_momentary_breakpoint_at_pc (CORE_ADDR pc, enum bptype type)
{
struct symtab_and_line sal;
sal = find_pc_line (pc, 0);
sal.pc = pc;
sal.section = find_pc_overlay (pc);
sal.explicit_pc = 1;
return set_momentary_breakpoint (sal, null_frame_id, type);
}
/* Tell the user we have just set a breakpoint B. */
@@ -7529,10 +7512,8 @@ breakpoint_re_set_one (void *bint)
default:
printf_filtered (_("Deleting unknown breakpoint type %d\n"), b->type);
/* fall through */
/* Delete longjmp and overlay event breakpoints; they will be
reset later by breakpoint_re_set. */
case bp_longjmp:
case bp_longjmp_resume:
/* Delete overlay event breakpoints; they will be reset later by
breakpoint_re_set. */
case bp_overlay_event:
delete_breakpoint (b);
break;
@@ -7554,6 +7535,8 @@ breakpoint_re_set_one (void *bint)
case bp_watchpoint_scope:
case bp_call_dummy:
case bp_step_resume:
case bp_longjmp:
case bp_longjmp_resume:
break;
}
@@ -7581,15 +7564,6 @@ breakpoint_re_set (void)
}
set_language (save_language);
input_radix = save_input_radix;
if (gdbarch_get_longjmp_target_p (current_gdbarch))
{
create_longjmp_breakpoint ("longjmp");
create_longjmp_breakpoint ("_longjmp");
create_longjmp_breakpoint ("siglongjmp");
create_longjmp_breakpoint ("_siglongjmp");
create_longjmp_breakpoint (NULL);
}
create_overlay_event_breakpoint ("_ovly_debug_event");
}