Remove unused support for target-based exception catching.

* target.h (struct target_ops): Delete
to_enable_exception_callback and to_get_current_exception_event
members.
(target_enable_exception_callback)
(target_get_current_exception_event): Delete macros.
* target.c (update_current_target): Remove code to inherit and
default those members.
(debug_to_enable_exception_callback)
(debug_to_get_current_exception_event): Delete functions.
(setup_target_debug): Don't install those methods.
* inf-child.c (inf_child_enable_exception_callback)
(inf_child_get_current_exception_event): Delete dummy functions.
(inf_child_target): Don't install them in the target vector.
* breakpoint.h (enum bptype): Delete bp_catch_catch,
bp_catch_throw.
* breakpoint.c (cover_target_enable_exception_callback)
(ep_is_exception_catchpoint, create_exception_catchpoint): Delete
functions.
(insert_bp_location, update_breakpoints_after_exec)
(remove_breakpoint, ep_is_catchpoint, print_it_typical)
(bpstat_stop_status, bpstat_what)
(bpstat_get_triggered_catchpoints, print_one_breakpoint_location)
(user_settable_breakpoint, allocate_bp_location)
(disable_watchpoints_before_interactive_call_start)
(enable_watchpoints_after_interactive_call_stop, mention)
(delete_breakpoint, breakpoint_re_set_one, disable_command)
(enable_command): Remove exception catchpoint cases.
(catch_exception_command_1): Don't try target-based exception
handling.
* stack.c (catch_info): Call print_frame_label_vars
unconditionally.
This commit is contained in:
Jim Blandy 2007-12-13 02:00:09 +00:00
parent ee951a0b34
commit dfdfb3ca98
9 changed files with 49 additions and 396 deletions

View file

@ -145,8 +145,6 @@ args_for_catchpoint_enable;
static int watchpoint_check (void *);
static int cover_target_enable_exception_callback (void *);
static void maintenance_info_breakpoints (char *, int);
static void create_longjmp_breakpoint (char *);
@ -1138,61 +1136,6 @@ in which its expression is valid.\n"),
return val;
}
else if (ep_is_exception_catchpoint (bpt->owner))
{
/* FIXME drow/2003-09-09: This code sets both a catchpoint and a
breakpoint. Once again, it would be better if this was represented
as two bp_locations. */
/* If we get here, we must have a callback mechanism for exception
events -- with g++ style embedded label support, we insert
ordinary breakpoints and not catchpoints. */
val = target_insert_breakpoint (&bpt->target_info);
if (val)
{
/* Couldn't set breakpoint for some reason */
fprintf_unfiltered (tmp_error_stream,
"Cannot insert catchpoint %d; disabling it.\n",
bpt->owner->number);
fprintf_filtered (tmp_error_stream,
"Error accessing memory address ");
deprecated_print_address_numeric (bpt->address, 1, tmp_error_stream);
fprintf_filtered (tmp_error_stream, ": %s.\n",
safe_strerror (val));
bpt->owner->enable_state = bp_disabled;
}
else
{
/* Bp set, now make sure callbacks are enabled */
/* Format possible error msg */
char *message = xstrprintf ("Error inserting catchpoint %d:\n",
bpt->owner->number);
struct cleanup *cleanups = make_cleanup (xfree, message);
int val;
args_for_catchpoint_enable args;
args.kind = bpt->owner->type == bp_catch_catch ?
EX_EVENT_CATCH : EX_EVENT_THROW;
args.enable_p = 1;
val = catch_errors (cover_target_enable_exception_callback,
&args, message, RETURN_MASK_ALL);
do_cleanups (cleanups);
if (val != 0 && val != -1)
bpt->inserted = 1;
/* Check if something went wrong; val == 0 can be ignored */
if (val == -1)
{
/* something went wrong */
fprintf_unfiltered (tmp_error_stream,
"Cannot insert catchpoint %d; disabling it.\n",
bpt->owner->number);
bpt->owner->enable_state = bp_disabled;
}
}
return val;
}
else if (bpt->owner->type == bp_catch_fork
|| bpt->owner->type == bp_catch_vfork
|| bpt->owner->type == bp_catch_exec)
@ -1389,13 +1332,6 @@ update_breakpoints_after_exec (void)
continue;
}
/* Ditto the exception-handling catchpoints. */
if ((b->type == bp_catch_catch) || (b->type == bp_catch_throw))
{
delete_breakpoint (b);
continue;
}
/* Don't delete an exec catchpoint, because else the inferior
won't stop when it ought!
@ -1631,16 +1567,6 @@ remove_breakpoint (struct bp_location *b, insertion_state_t is)
return val;
b->inserted = (is == mark_inserted);
}
else if ((b->owner->type == bp_catch_catch ||
b->owner->type == bp_catch_throw)
&& breakpoint_enabled (b->owner)
&& !b->duplicate)
{
val = target_remove_breakpoint (&b->target_info);
if (val)
return val;
b->inserted = (is == mark_inserted);
}
return 0;
}
@ -1880,9 +1806,7 @@ ep_is_catchpoint (struct breakpoint *ep)
|| (ep->type == bp_catch_unload)
|| (ep->type == bp_catch_fork)
|| (ep->type == bp_catch_vfork)
|| (ep->type == bp_catch_exec)
|| (ep->type == bp_catch_catch)
|| (ep->type == bp_catch_throw);
|| (ep->type == bp_catch_exec);
/* ??rehrauer: Add more kinds here, as are implemented... */
}
@ -1895,14 +1819,6 @@ ep_is_shlib_catchpoint (struct breakpoint *ep)
|| (ep->type == bp_catch_unload);
}
int
ep_is_exception_catchpoint (struct breakpoint *ep)
{
return
(ep->type == bp_catch_catch)
|| (ep->type == bp_catch_throw);
}
void
bpstat_free (bpstat bs)
{
@ -2255,68 +2171,6 @@ print_it_typical (bpstat bs)
return PRINT_SRC_AND_LOC;
break;
case bp_catch_catch:
if (current_exception_event &&
(CURRENT_EXCEPTION_KIND == EX_EVENT_CATCH))
{
annotate_catchpoint (b->number);
printf_filtered (_("\nCatchpoint %d (exception caught), "),
b->number);
if (CURRENT_EXCEPTION_THROW_PC && CURRENT_EXCEPTION_THROW_LINE)
printf_filtered (_("throw location %s:%d, "),
CURRENT_EXCEPTION_THROW_FILE,
CURRENT_EXCEPTION_THROW_LINE);
else
printf_filtered (_("throw location unknown, "));
if (CURRENT_EXCEPTION_CATCH_PC && CURRENT_EXCEPTION_CATCH_LINE)
printf_filtered (_("catch location %s:%d\n"),
CURRENT_EXCEPTION_CATCH_FILE,
CURRENT_EXCEPTION_CATCH_LINE);
else
printf_filtered (_("catch location unknown\n"));
/* don't bother to print location frame info */
return PRINT_SRC_ONLY;
}
else
{
/* really throw, some other bpstat will handle it */
return PRINT_UNKNOWN;
}
break;
case bp_catch_throw:
if (current_exception_event &&
(CURRENT_EXCEPTION_KIND == EX_EVENT_THROW))
{
annotate_catchpoint (b->number);
printf_filtered (_("\nCatchpoint %d (exception thrown), "),
b->number);
if (CURRENT_EXCEPTION_THROW_PC && CURRENT_EXCEPTION_THROW_LINE)
printf_filtered (_("throw location %s:%d, "),
CURRENT_EXCEPTION_THROW_FILE,
CURRENT_EXCEPTION_THROW_LINE);
else
printf_filtered (_("throw location unknown, "));
if (CURRENT_EXCEPTION_CATCH_PC && CURRENT_EXCEPTION_CATCH_LINE)
printf_filtered (_("catch location %s:%d\n"),
CURRENT_EXCEPTION_CATCH_FILE,
CURRENT_EXCEPTION_CATCH_LINE);
else
printf_filtered (_("catch location unknown\n"));
/* don't bother to print location frame info */
return PRINT_SRC_ONLY;
}
else
{
/* really catch, some other bpstat will handle it */
return PRINT_UNKNOWN;
}
break;
case bp_watchpoint:
case bp_hardware_watchpoint:
if (bs->old_val != NULL)
@ -2778,9 +2632,7 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
&& b->type != bp_hardware_breakpoint
&& b->type != bp_catch_fork
&& b->type != bp_catch_vfork
&& b->type != bp_catch_exec
&& b->type != bp_catch_catch
&& b->type != bp_catch_throw) /* a non-watchpoint bp */
&& b->type != bp_catch_exec) /* a non-watchpoint bp */
{
if (bl->address != bp_addr) /* address doesn't match */
continue;
@ -2854,10 +2706,6 @@ bpstat_stop_status (CORE_ADDR bp_addr, ptid_t ptid)
&& !inferior_has_execd (PIDGET (inferior_ptid), &b->exec_pathname))
continue;
if (ep_is_exception_catchpoint (b) &&
!(current_exception_event = target_get_current_exception_event ()))
continue;
/* Come here if it's a watchpoint, or if the break address matches */
bs = bpstat_alloc (bl, bs); /* Alloc a bpstat to explain stop */
@ -3299,18 +3147,6 @@ bpstat_what (bpstat bs)
This requires no further action. */
bs_class = no_effect;
break;
case bp_catch_catch:
if (!bs->stop || CURRENT_EXCEPTION_KIND != EX_EVENT_CATCH)
bs_class = bp_nostop;
else if (bs->stop)
bs_class = bs->print ? bp_noisy : bp_silent;
break;
case bp_catch_throw:
if (!bs->stop || CURRENT_EXCEPTION_KIND != EX_EVENT_THROW)
bs_class = bp_nostop;
else if (bs->stop)
bs_class = bs->print ? bp_noisy : bp_silent;
break;
case bp_call_dummy:
/* Make sure the action is stop (silent or noisy),
so infrun.c pops the dummy frame. */
@ -3373,9 +3209,7 @@ bpstat_get_triggered_catchpoints (bpstat ep_list, bpstat *cp_list)
if (ep == NULL)
break;
if ((ep->type != bp_catch_load) &&
(ep->type != bp_catch_unload) &&
(ep->type != bp_catch_catch) &&
(ep->type != bp_catch_throw))
(ep->type != bp_catch_unload))
/* pai: (temp) ADD fork/vfork here!! */
continue;
@ -3494,9 +3328,7 @@ print_one_breakpoint_location (struct breakpoint *b,
{bp_catch_unload, "catch unload"},
{bp_catch_fork, "catch fork"},
{bp_catch_vfork, "catch vfork"},
{bp_catch_exec, "catch exec"},
{bp_catch_catch, "catch catch"},
{bp_catch_throw, "catch throw"}
{bp_catch_exec, "catch exec"}
};
static char *bpdisps[] =
@ -3675,28 +3507,6 @@ print_one_breakpoint_location (struct breakpoint *b,
}
break;
case bp_catch_catch:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
if (addressprint)
ui_out_field_skip (uiout, "addr");
annotate_field (5);
ui_out_field_string (uiout, "what", "exception catch");
ui_out_spaces (uiout, 1);
break;
case bp_catch_throw:
/* Field 4, the address, is omitted (which makes the columns
not line up too nicely with the headers, but the effect
is relatively readable). */
if (addressprint)
ui_out_field_skip (uiout, "addr");
annotate_field (5);
ui_out_field_string (uiout, "what", "exception throw");
ui_out_spaces (uiout, 1);
break;
case bp_breakpoint:
case bp_hardware_breakpoint:
case bp_until:
@ -3885,8 +3695,6 @@ user_settable_breakpoint (const struct breakpoint *b)
|| b->type == bp_catch_fork
|| b->type == bp_catch_vfork
|| b->type == bp_catch_exec
|| b->type == bp_catch_catch
|| b->type == bp_catch_throw
|| b->type == bp_hardware_breakpoint
|| b->type == bp_watchpoint
|| b->type == bp_read_watchpoint
@ -4294,8 +4102,6 @@ allocate_bp_location (struct breakpoint *bpt, enum bptype bp_type)
case bp_catch_fork:
case bp_catch_vfork:
case bp_catch_exec:
case bp_catch_catch:
case bp_catch_throw:
loc->loc_type = bp_loc_other;
break;
default:
@ -4839,8 +4645,7 @@ disable_watchpoints_before_interactive_call_start (void)
if (((b->type == bp_watchpoint)
|| (b->type == bp_hardware_watchpoint)
|| (b->type == bp_read_watchpoint)
|| (b->type == bp_access_watchpoint)
|| ep_is_exception_catchpoint (b))
|| (b->type == bp_access_watchpoint))
&& breakpoint_enabled (b))
{
b->enable_state = bp_call_disabled;
@ -4859,8 +4664,7 @@ enable_watchpoints_after_interactive_call_stop (void)
if (((b->type == bp_watchpoint)
|| (b->type == bp_hardware_watchpoint)
|| (b->type == bp_read_watchpoint)
|| (b->type == bp_access_watchpoint)
|| ep_is_exception_catchpoint (b))
|| (b->type == bp_access_watchpoint))
&& (b->enable_state == bp_call_disabled))
{
b->enable_state = bp_enabled;
@ -4995,12 +4799,6 @@ mention (struct breakpoint *b)
printf_filtered (_("Catchpoint %d (exec)"),
b->number);
break;
case bp_catch_catch:
case bp_catch_throw:
printf_filtered (_("Catchpoint %d (%s)"),
b->number,
(b->type == bp_catch_catch) ? "catch" : "throw");
break;
case bp_until:
case bp_finish:
@ -6494,47 +6292,6 @@ catch_unload_command_1 (char *arg, int tempflag, int from_tty)
dll_pathname, cond_string);
}
/* Commands to deal with catching exceptions. */
/* Set a breakpoint at the specified callback routine for an
exception event callback */
static void
create_exception_catchpoint (int tempflag, char *cond_string,
enum exception_event_kind ex_event,
struct symtab_and_line *sal)
{
struct breakpoint *b;
int thread = -1; /* All threads. */
enum bptype bptype;
if (!sal) /* no exception support? */
return;
switch (ex_event)
{
case EX_EVENT_THROW:
bptype = bp_catch_throw;
break;
case EX_EVENT_CATCH:
bptype = bp_catch_catch;
break;
default: /* error condition */
error (_("Internal error -- invalid catchpoint kind"));
}
b = set_raw_breakpoint (*sal, bptype);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
b->cond_string = (cond_string == NULL) ?
NULL : savestring (cond_string, strlen (cond_string));
b->thread = thread;
b->addr_string = NULL;
b->enable_state = bp_enabled;
b->disposition = tempflag ? disp_del : disp_donttouch;
mention (b);
}
static enum print_stop_action
print_exception_catchpoint (struct breakpoint *b)
{
@ -6641,19 +6398,6 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
if (handle_gnu_v3_exceptions (tempflag, cond_string, ex_event, from_tty))
return;
/* See if we can find a callback routine */
sal = target_enable_exception_callback (ex_event, 1);
if (sal)
{
/* We have callbacks from the runtime system for exceptions.
Set a breakpoint on the sal found, if no errors */
if (sal != (struct symtab_and_line *) -1)
create_exception_catchpoint (tempflag, cond_string, ex_event, sal);
else
return; /* something went wrong with setting up callbacks */
}
warning (_("Unsupported with this platform/compiler combination."));
}
@ -6736,23 +6480,6 @@ catch_assert_command (char *arg, int tempflag, int from_tty)
tempflag, from_tty);
}
/* Cover routine to allow wrapping target_enable_exception_catchpoints
inside a catch_errors */
static int
cover_target_enable_exception_callback (void *arg)
{
args_for_catchpoint_enable *args = arg;
struct symtab_and_line *sal;
sal = target_enable_exception_callback (args->kind, args->enable_p);
if (sal == NULL)
return 0;
else if (sal == (struct symtab_and_line *) -1)
return -1;
else
return 1; /*is valid */
}
static void
catch_command_1 (char *arg, int tempflag, int from_tty)
{
@ -7116,28 +6843,6 @@ delete_breakpoint (struct breakpoint *bpt)
if (breakpoint_chain == bpt)
breakpoint_chain = bpt->next;
/* If we have callback-style exception catchpoints, don't go through
the adjustments to the C++ runtime library etc. if the inferior
isn't actually running. target_enable_exception_callback for a
null target ops vector gives an undesirable error message, so we
check here and avoid it. Since currently (1997-09-17) only HP-UX aCC's
exceptions are supported in this way, it's OK for now. FIXME */
if (ep_is_exception_catchpoint (bpt) && target_has_execution)
{
/* Format possible error msg */
char *message = xstrprintf ("Error in deleting catchpoint %d:\n",
bpt->number);
struct cleanup *cleanups = make_cleanup (xfree, message);
args_for_catchpoint_enable args;
args.kind = bpt->type == bp_catch_catch ?
EX_EVENT_CATCH : EX_EVENT_THROW;
args.enable_p = 0;
catch_errors (cover_target_enable_exception_callback, &args,
message, RETURN_MASK_ALL);
do_cleanups (cleanups);
}
ALL_BREAKPOINTS (b)
if (b->next == bpt)
{
@ -7583,9 +7288,6 @@ breakpoint_re_set_one (void *bint)
mention (b);
value_free_to_mark (mark);
break;
case bp_catch_catch:
case bp_catch_throw:
break;
/* We needn't really do anything to reset these, since the mask
that requests them is unaffected by e.g., new libraries being
loaded. */
@ -7876,8 +7578,6 @@ disable_command (char *args, int from_tty)
case bp_catch_fork:
case bp_catch_vfork:
case bp_catch_exec:
case bp_catch_catch:
case bp_catch_throw:
case bp_hardware_breakpoint:
case bp_watchpoint:
case bp_hardware_watchpoint:
@ -8014,8 +7714,6 @@ enable_command (char *args, int from_tty)
case bp_catch_fork:
case bp_catch_vfork:
case bp_catch_exec:
case bp_catch_catch:
case bp_catch_throw:
case bp_hardware_breakpoint:
case bp_watchpoint:
case bp_hardware_watchpoint: