2012-04-27 Sergio Durigan Junior <sergiodj@redhat.com>

Tom Tromey  <tromey@redhat.com>

	* breakpoint.c (struct breakpoint_objfile_data)
	<longjmp_searched>,<longjmp_probes>,<exception_searched>,
	<exception_probes>: New fields.
	(free_breakpoint_probes): New function.
	(create_longjmp_master_breakpoint): Prefer SystemTap probe over
	`_Unwind_DebugHook'.
	(create_exception_master_breakpoint): Likewise.
	(_initialize_breakpoint): Registering cleanup for SystemTap probes.
	* infrun.c: Including necessary header files for handling SystemTap
	probes.
	(handle_inferior_event): Handling longjmp breakpoint and exceptions
	via SystemTap probes.
	(check_exception_resume): Remove `func' argument.  Handle exception
	unwinding breakpoint set via a SystemTap probe.
	(insert_exception_resume_from_probe): New function.
This commit is contained in:
Sergio Durigan Junior 2012-04-27 20:48:57 +00:00
parent 55aa24fb2e
commit 28106bc2fe
3 changed files with 171 additions and 11 deletions

View file

@ -2744,11 +2744,23 @@ struct breakpoint_objfile_data
/* Minimal symbol(s) for "longjmp", "siglongjmp", etc. (if any). */
struct minimal_symbol *longjmp_msym[NUM_LONGJMP_NAMES];
/* True if we have looked for longjmp probes. */
int longjmp_searched;
/* SystemTap probe points for longjmp (if any). */
VEC (probe_p) *longjmp_probes;
/* Minimal symbol for "std::terminate()" (if any). */
struct minimal_symbol *terminate_msym;
/* Minimal symbol for "_Unwind_DebugHook" (if any). */
struct minimal_symbol *exception_msym;
/* True if we have looked for exception probes. */
int exception_searched;
/* SystemTap probe points for unwinding (if any). */
VEC (probe_p) *exception_probes;
};
static const struct objfile_data *breakpoint_objfile_key;
@ -2784,6 +2796,15 @@ get_breakpoint_objfile_data (struct objfile *objfile)
return bp_objfile_data;
}
static void
free_breakpoint_probes (struct objfile *obj, void *data)
{
struct breakpoint_objfile_data *bp_objfile_data = data;
VEC_free (probe_p, bp_objfile_data->longjmp_probes);
VEC_free (probe_p, bp_objfile_data->exception_probes);
}
static void
create_overlay_event_breakpoint (void)
{
@ -2861,6 +2882,37 @@ create_longjmp_master_breakpoint (void)
bp_objfile_data = get_breakpoint_objfile_data (objfile);
if (!bp_objfile_data->longjmp_searched)
{
bp_objfile_data->longjmp_probes
= find_probes_in_objfile (objfile, "libc", "longjmp");
bp_objfile_data->longjmp_searched = 1;
}
if (bp_objfile_data->longjmp_probes != NULL)
{
int i;
struct probe *probe;
struct gdbarch *gdbarch = get_objfile_arch (objfile);
for (i = 0;
VEC_iterate (probe_p,
bp_objfile_data->longjmp_probes,
i, probe);
++i)
{
struct breakpoint *b;
b = create_internal_breakpoint (gdbarch, probe->address,
bp_longjmp_master,
&internal_breakpoint_ops);
b->addr_string = xstrdup ("-probe-stap libc:longjmp");
b->enable_state = bp_disabled;
}
continue;
}
for (i = 0; i < NUM_LONGJMP_NAMES; i++)
{
struct breakpoint *b;
@ -2971,6 +3023,40 @@ create_exception_master_breakpoint (void)
bp_objfile_data = get_breakpoint_objfile_data (objfile);
/* We prefer the SystemTap probe point if it exists. */
if (!bp_objfile_data->exception_searched)
{
bp_objfile_data->exception_probes
= find_probes_in_objfile (objfile, "libgcc", "unwind");
bp_objfile_data->exception_searched = 1;
}
if (bp_objfile_data->exception_probes != NULL)
{
struct gdbarch *gdbarch = get_objfile_arch (objfile);
int i;
struct probe *probe;
for (i = 0;
VEC_iterate (probe_p,
bp_objfile_data->exception_probes,
i, probe);
++i)
{
struct breakpoint *b;
b = create_internal_breakpoint (gdbarch, probe->address,
bp_exception_master,
&internal_breakpoint_ops);
b->addr_string = xstrdup ("-probe-stap libgcc:unwind");
b->enable_state = bp_disabled;
}
continue;
}
/* Otherwise, try the hook function. */
if (msym_not_found_p (bp_objfile_data->exception_msym))
continue;