* breakpoint.c (handle_gnu_4_16_catch_command, get_catch_sals)

(struct sal_chain, map_catch_names): Remove.
	(catch_exception_command_1): Don't call
	handle_gnu_4_16_catch_command.
This commit is contained in:
Daniel Jacobowitz
2003-03-26 20:19:12 +00:00
parent d5d14a5ade
commit 69f567ae0a
2 changed files with 8 additions and 306 deletions

View File

@@ -80,10 +80,6 @@ static void clear_command (char *, int);
static void catch_command (char *, int);
static void handle_gnu_4_16_catch_command (char *, int, int);
static struct symtabs_and_lines get_catch_sals (int);
static void watch_command (char *, int);
static int can_use_hardware_watchpoint (struct value *);
@@ -5706,187 +5702,6 @@ enable_catch_breakpoint (void)
}
#endif /* 0 */
struct sal_chain
{
struct sal_chain *next;
struct symtab_and_line sal;
};
#if 0
/* Not really used -- invocation in handle_gnu_4_16_catch_command
had been commented out in the v.4.16 sources, and stays
disabled there now because "catch NAME" syntax isn't allowed.
pai/1997-07-11 */
/* This isn't used; I don't know what it was for. */
/* For each catch clause identified in ARGS, run FUNCTION
with that clause as an argument. */
static struct symtabs_and_lines
map_catch_names (char *args, int (*function) ())
{
register char *p = args;
register char *p1;
struct symtabs_and_lines sals;
#if 0
struct sal_chain *sal_chain = 0;
#endif
if (p == 0)
error_no_arg ("one or more catch names");
sals.nelts = 0;
sals.sals = NULL;
while (*p)
{
p1 = p;
/* Don't swallow conditional part. */
if (p1[0] == 'i' && p1[1] == 'f'
&& (p1[2] == ' ' || p1[2] == '\t'))
break;
if (isalpha (*p1))
{
p1++;
while (isalnum (*p1) || *p1 == '_' || *p1 == '$')
p1++;
}
if (*p1 && *p1 != ' ' && *p1 != '\t')
error ("Arguments must be catch names.");
*p1 = 0;
#if 0
if (function (p))
{
struct sal_chain *next = (struct sal_chain *)
alloca (sizeof (struct sal_chain));
next->next = sal_chain;
next->sal = get_catch_sal (p);
sal_chain = next;
goto win;
}
#endif
printf_unfiltered ("No catch clause for exception %s.\n", p);
#if 0
win:
#endif
p = p1;
while (*p == ' ' || *p == '\t')
p++;
}
}
#endif
/* This shares a lot of code with `print_frame_label_vars' from stack.c. */
static struct symtabs_and_lines
get_catch_sals (int this_level_only)
{
register struct blockvector *bl;
register struct block *block;
int index, have_default = 0;
CORE_ADDR pc;
struct symtabs_and_lines sals;
struct sal_chain *sal_chain = 0;
char *blocks_searched;
/* Not sure whether an error message is always the correct response,
but it's better than a core dump. */
if (deprecated_selected_frame == NULL)
error ("No selected frame.");
block = get_frame_block (deprecated_selected_frame, 0);
pc = get_frame_pc (deprecated_selected_frame);
sals.nelts = 0;
sals.sals = NULL;
if (block == 0)
error ("No symbol table info available.\n");
bl = blockvector_for_pc (BLOCK_END (block) - 4, &index);
blocks_searched = (char *) alloca (BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
memset (blocks_searched, 0, BLOCKVECTOR_NBLOCKS (bl) * sizeof (char));
while (block != 0)
{
CORE_ADDR end = BLOCK_END (block) - 4;
int last_index;
if (bl != blockvector_for_pc (end, &index))
error ("blockvector blotch");
if (BLOCKVECTOR_BLOCK (bl, index) != block)
error ("blockvector botch");
last_index = BLOCKVECTOR_NBLOCKS (bl);
index += 1;
/* Don't print out blocks that have gone by. */
while (index < last_index
&& BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < pc)
index++;
while (index < last_index
&& BLOCK_END (BLOCKVECTOR_BLOCK (bl, index)) < end)
{
if (blocks_searched[index] == 0)
{
struct block *b = BLOCKVECTOR_BLOCK (bl, index);
register int i;
register struct symbol *sym;
ALL_BLOCK_SYMBOLS (b, i, sym)
{
if (STREQ (DEPRECATED_SYMBOL_NAME (sym), "default"))
{
if (have_default)
continue;
have_default = 1;
}
if (SYMBOL_CLASS (sym) == LOC_LABEL)
{
struct sal_chain *next = (struct sal_chain *)
alloca (sizeof (struct sal_chain));
next->next = sal_chain;
next->sal = find_pc_line (SYMBOL_VALUE_ADDRESS (sym),
0);
sal_chain = next;
}
}
blocks_searched[index] = 1;
}
index++;
}
if (have_default)
break;
if (sal_chain && this_level_only)
break;
/* After handling the function's top-level block, stop.
Don't continue to its superblock, the block of
per-file symbols. */
if (BLOCK_FUNCTION (block))
break;
block = BLOCK_SUPERBLOCK (block);
}
if (sal_chain)
{
struct sal_chain *tmp_chain;
/* Count the number of entries. */
for (index = 0, tmp_chain = sal_chain; tmp_chain;
tmp_chain = tmp_chain->next)
index++;
sals.nelts = index;
sals.sals = (struct symtab_and_line *)
xmalloc (index * sizeof (struct symtab_and_line));
for (index = 0; sal_chain; sal_chain = sal_chain->next, index++)
sals.sals[index] = sal_chain->sal;
}
return sals;
}
static void
ep_skip_leading_whitespace (char **s)
{
@@ -6224,23 +6039,8 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg,
else
return; /* something went wrong with setting up callbacks */
}
else
{
/* No callbacks from runtime system for exceptions.
Try GNU C++ exception breakpoints using labels in debug info. */
if (ex_event == EX_EVENT_CATCH)
{
handle_gnu_4_16_catch_command (arg, tempflag, from_tty);
}
else if (ex_event == EX_EVENT_THROW)
{
/* Set a breakpoint on __raise_exception () */
warning ("Unsupported with this platform/compiler combination.");
warning ("Perhaps you can achieve the effect you want by setting");
warning ("a breakpoint on __raise_exception().");
}
}
warning ("Unsupported with this platform/compiler combination.");
}
/* Cover routine to allow wrapping target_enable_exception_catchpoints
@@ -6260,111 +6060,6 @@ cover_target_enable_exception_callback (void *arg)
return 1; /*is valid */
}
/* This is the original v.4.16 and earlier version of the
catch_command_1() function. Now that other flavours of "catch"
have been introduced, and since exception handling can be handled
in other ways (through target ops) also, this is used only for the
GNU C++ exception handling system.
Note: Only the "catch" flavour of GDB 4.16 is handled here. The
"catch NAME" is now no longer allowed in catch_command_1(). Also,
there was no code in GDB 4.16 for "catch throw".
Called from catch_exception_command_1 () */
static void
handle_gnu_4_16_catch_command (char *arg, int tempflag, int from_tty)
{
/* First, translate ARG into something we can deal with in terms
of breakpoints. */
struct symtabs_and_lines sals;
struct symtab_and_line sal;
register struct expression *cond = 0;
register struct breakpoint *b;
char *save_arg;
int i;
init_sal (&sal); /* initialize to zeroes */
/* If no arg given, or if first arg is 'if ', all active catch clauses
are breakpointed. */
if (!arg || (arg[0] == 'i' && arg[1] == 'f'
&& (arg[2] == ' ' || arg[2] == '\t')))
{
/* Grab all active catch clauses. */
sals = get_catch_sals (0);
}
else
{
/* Grab selected catch clauses. */
error ("catch NAME not implemented");
#if 0
/* Not sure why this code has been disabled. I'm leaving
it disabled. We can never come here now anyway
since we don't allow the "catch NAME" syntax.
pai/1997-07-11 */
/* This isn't used; I don't know what it was for. */
sals = map_catch_names (arg, catch_breakpoint);
#endif
}
if (!sals.nelts)
return;
save_arg = arg;
for (i = 0; i < sals.nelts; i++)
{
resolve_sal_pc (&sals.sals[i]);
while (arg && *arg)
{
if (arg[0] == 'i' && arg[1] == 'f'
&& (arg[2] == ' ' || arg[2] == '\t'))
cond = parse_exp_1 ((arg += 2, &arg),
block_for_pc (sals.sals[i].pc), 0);
else
error ("Junk at end of arguments.");
}
arg = save_arg;
}
for (i = 0; i < sals.nelts; i++)
{
sal = sals.sals[i];
if (from_tty)
describe_other_breakpoints (sal.pc, sal.section);
/* Important -- this is an ordinary breakpoint. For platforms
with callback support for exceptions,
create_exception_catchpoint() will create special bp types
(bp_catch_catch and bp_catch_throw), and there is code in
insert_breakpoints() and elsewhere that depends on that. */
b = set_raw_breakpoint (sal, bp_breakpoint);
set_breakpoint_count (breakpoint_count + 1);
b->number = breakpoint_count;
b->cond = cond;
b->enable_state = bp_enabled;
b->disposition = tempflag ? disp_del : disp_donttouch;
mention (b);
}
if (sals.nelts > 1)
{
warning ("Multiple breakpoints were set.");
warning ("Use the \"delete\" command to delete unwanted breakpoints.");
}
xfree (sals.sals);
}
static void
catch_command_1 (char *arg, int tempflag, int from_tty)
{