Convert Ada catchpoints to vtable ops

This converts Ada catchpoints to use vtable_breakpoint_ops.
This commit is contained in:
Tom Tromey 2022-01-15 16:10:58 -07:00
parent 7dd8e7ae28
commit ae72050b7f

View file

@ -12129,6 +12129,14 @@ struct ada_catchpoint : public breakpoint
{ {
} }
struct bp_location *allocate_location () override;
void re_set () override;
void check_status (struct bpstat *bs) override;
enum print_stop_action print_it (struct bpstat *bs) override;
bool print_one (struct bp_location **) override;
void print_mention () override;
void print_recreate (struct ui_file *fp) override;
/* The name of the specific exception the user specified. */ /* The name of the specific exception the user specified. */
std::string excep_string; std::string excep_string;
@ -12187,30 +12195,28 @@ create_excep_cond_exprs (struct ada_catchpoint *c,
} }
} }
/* Implement the ALLOCATE_LOCATION method in the breakpoint_ops /* Implement the ALLOCATE_LOCATION method in the structure for all
structure for all exception catchpoint kinds. */
static struct bp_location *
allocate_location_exception (struct breakpoint *self)
{
return new ada_catchpoint_location (self);
}
/* Implement the RE_SET method in the breakpoint_ops structure for all
exception catchpoint kinds. */ exception catchpoint kinds. */
static void struct bp_location *
re_set_exception (struct breakpoint *b) ada_catchpoint::allocate_location ()
{ {
struct ada_catchpoint *c = (struct ada_catchpoint *) b; return new ada_catchpoint_location (this);
}
/* Implement the RE_SET method in the structure for all exception
catchpoint kinds. */
void
ada_catchpoint::re_set ()
{
/* Call the base class's method. This updates the catchpoint's /* Call the base class's method. This updates the catchpoint's
locations. */ locations. */
b->re_set (); this->breakpoint::re_set ();
/* Reparse the exception conditional expressions. One for each /* Reparse the exception conditional expressions. One for each
location. */ location. */
create_excep_cond_exprs (c, c->m_kind); create_excep_cond_exprs (this, m_kind);
} }
/* Returns true if we should stop for this breakpoint hit. If the /* Returns true if we should stop for this breakpoint hit. If the
@ -12278,36 +12284,35 @@ should_stop_exception (const struct bp_location *bl)
return stop; return stop;
} }
/* Implement the CHECK_STATUS method in the breakpoint_ops structure /* Implement the CHECK_STATUS method in the structure for all
for all exception catchpoint kinds. */ exception catchpoint kinds. */
static void void
check_status_exception (bpstat *bs) ada_catchpoint::check_status (bpstat *bs)
{ {
bs->stop = should_stop_exception (bs->bp_location_at.get ()); bs->stop = should_stop_exception (bs->bp_location_at.get ());
} }
/* Implement the PRINT_IT method in the breakpoint_ops structure /* Implement the PRINT_IT method in the structure for all exception
for all exception catchpoint kinds. */ catchpoint kinds. */
static enum print_stop_action enum print_stop_action
print_it_exception (bpstat *bs) ada_catchpoint::print_it (bpstat *bs)
{ {
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
struct breakpoint *b = bs->breakpoint_at;
annotate_catchpoint (b->number); annotate_catchpoint (number);
if (uiout->is_mi_like_p ()) if (uiout->is_mi_like_p ())
{ {
uiout->field_string ("reason", uiout->field_string ("reason",
async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT)); async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT));
uiout->field_string ("disp", bpdisp_text (b->disposition)); uiout->field_string ("disp", bpdisp_text (disposition));
} }
uiout->text (b->disposition == disp_del uiout->text (disposition == disp_del
? "\nTemporary catchpoint " : "\nCatchpoint "); ? "\nTemporary catchpoint " : "\nCatchpoint ");
uiout->field_signed ("bkptno", b->number); uiout->field_signed ("bkptno", number);
uiout->text (", "); uiout->text (", ");
/* ada_exception_name_addr relies on the selected frame being the /* ada_exception_name_addr relies on the selected frame being the
@ -12317,14 +12322,13 @@ print_it_exception (bpstat *bs)
ada_find_printable_frame). */ ada_find_printable_frame). */
select_frame (get_current_frame ()); select_frame (get_current_frame ());
struct ada_catchpoint *c = (struct ada_catchpoint *) b; switch (m_kind)
switch (c->m_kind)
{ {
case ada_catch_exception: case ada_catch_exception:
case ada_catch_exception_unhandled: case ada_catch_exception_unhandled:
case ada_catch_handlers: case ada_catch_handlers:
{ {
const CORE_ADDR addr = ada_exception_name_addr (c->m_kind, b); const CORE_ADDR addr = ada_exception_name_addr (m_kind, this);
char exception_name[256]; char exception_name[256];
if (addr != 0) if (addr != 0)
@ -12348,7 +12352,7 @@ print_it_exception (bpstat *bs)
it clearer to the user which kind of catchpoint just got it clearer to the user which kind of catchpoint just got
hit. We used ui_out_text to make sure that this extra hit. We used ui_out_text to make sure that this extra
info does not pollute the exception name in the MI case. */ info does not pollute the exception name in the MI case. */
if (c->m_kind == ada_catch_exception_unhandled) if (m_kind == ada_catch_exception_unhandled)
uiout->text ("unhandled "); uiout->text ("unhandled ");
uiout->field_string ("exception-name", exception_name); uiout->field_string ("exception-name", exception_name);
} }
@ -12377,14 +12381,13 @@ print_it_exception (bpstat *bs)
return PRINT_SRC_AND_LOC; return PRINT_SRC_AND_LOC;
} }
/* Implement the PRINT_ONE method in the breakpoint_ops structure /* Implement the PRINT_ONE method in the structure for all exception
for all exception catchpoint kinds. */ catchpoint kinds. */
static bool bool
print_one_exception (struct breakpoint *b, struct bp_location **last_loc) ada_catchpoint::print_one (struct bp_location **last_loc)
{ {
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
struct ada_catchpoint *c = (struct ada_catchpoint *) b;
struct value_print_options opts; struct value_print_options opts;
get_user_print_options (&opts); get_user_print_options (&opts);
@ -12393,13 +12396,13 @@ print_one_exception (struct breakpoint *b, struct bp_location **last_loc)
uiout->field_skip ("addr"); uiout->field_skip ("addr");
annotate_field (5); annotate_field (5);
switch (c->m_kind) switch (m_kind)
{ {
case ada_catch_exception: case ada_catch_exception:
if (!c->excep_string.empty ()) if (!excep_string.empty ())
{ {
std::string msg = string_printf (_("`%s' Ada exception"), std::string msg = string_printf (_("`%s' Ada exception"),
c->excep_string.c_str ()); excep_string.c_str ());
uiout->field_string ("what", msg); uiout->field_string ("what", msg);
} }
@ -12413,11 +12416,11 @@ print_one_exception (struct breakpoint *b, struct bp_location **last_loc)
break; break;
case ada_catch_handlers: case ada_catch_handlers:
if (!c->excep_string.empty ()) if (!excep_string.empty ())
{ {
uiout->field_fmt ("what", uiout->field_fmt ("what",
_("`%s' Ada exception handlers"), _("`%s' Ada exception handlers"),
c->excep_string.c_str ()); excep_string.c_str ());
} }
else else
uiout->field_string ("what", "all Ada exceptions handlers"); uiout->field_string ("what", "all Ada exceptions handlers");
@ -12438,24 +12441,23 @@ print_one_exception (struct breakpoint *b, struct bp_location **last_loc)
/* Implement the PRINT_MENTION method in the breakpoint_ops structure /* Implement the PRINT_MENTION method in the breakpoint_ops structure
for all exception catchpoint kinds. */ for all exception catchpoint kinds. */
static void void
print_mention_exception (struct breakpoint *b) ada_catchpoint::print_mention ()
{ {
struct ada_catchpoint *c = (struct ada_catchpoint *) b;
struct ui_out *uiout = current_uiout; struct ui_out *uiout = current_uiout;
uiout->text (b->disposition == disp_del ? _("Temporary catchpoint ") uiout->text (disposition == disp_del ? _("Temporary catchpoint ")
: _("Catchpoint ")); : _("Catchpoint "));
uiout->field_signed ("bkptno", b->number); uiout->field_signed ("bkptno", number);
uiout->text (": "); uiout->text (": ");
switch (c->m_kind) switch (m_kind)
{ {
case ada_catch_exception: case ada_catch_exception:
if (!c->excep_string.empty ()) if (!excep_string.empty ())
{ {
std::string info = string_printf (_("`%s' Ada exception"), std::string info = string_printf (_("`%s' Ada exception"),
c->excep_string.c_str ()); excep_string.c_str ());
uiout->text (info); uiout->text (info);
} }
else else
@ -12467,11 +12469,11 @@ print_mention_exception (struct breakpoint *b)
break; break;
case ada_catch_handlers: case ada_catch_handlers:
if (!c->excep_string.empty ()) if (!excep_string.empty ())
{ {
std::string info std::string info
= string_printf (_("`%s' Ada exception handlers"), = string_printf (_("`%s' Ada exception handlers"),
c->excep_string.c_str ()); excep_string.c_str ());
uiout->text (info); uiout->text (info);
} }
else else
@ -12488,20 +12490,18 @@ print_mention_exception (struct breakpoint *b)
} }
} }
/* Implement the PRINT_RECREATE method in the breakpoint_ops structure /* Implement the PRINT_RECREATE method in the structure for all
for all exception catchpoint kinds. */ exception catchpoint kinds. */
static void void
print_recreate_exception (struct breakpoint *b, struct ui_file *fp) ada_catchpoint::print_recreate (struct ui_file *fp)
{ {
struct ada_catchpoint *c = (struct ada_catchpoint *) b; switch (m_kind)
switch (c->m_kind)
{ {
case ada_catch_exception: case ada_catch_exception:
gdb_printf (fp, "catch exception"); gdb_printf (fp, "catch exception");
if (!c->excep_string.empty ()) if (!excep_string.empty ())
gdb_printf (fp, " %s", c->excep_string.c_str ()); gdb_printf (fp, " %s", excep_string.c_str ());
break; break;
case ada_catch_exception_unhandled: case ada_catch_exception_unhandled:
@ -12519,18 +12519,15 @@ print_recreate_exception (struct breakpoint *b, struct ui_file *fp)
default: default:
internal_error (__FILE__, __LINE__, _("unexpected catchpoint type")); internal_error (__FILE__, __LINE__, _("unexpected catchpoint type"));
} }
print_recreate_thread (b, fp); print_recreate_thread (this, fp);
} }
/* Virtual table for breakpoint type. */
static struct breakpoint_ops catch_exception_breakpoint_ops;
/* See ada-lang.h. */ /* See ada-lang.h. */
bool bool
is_ada_exception_catchpoint (breakpoint *bp) is_ada_exception_catchpoint (breakpoint *bp)
{ {
return bp->ops == &catch_exception_breakpoint_ops; return dynamic_cast<ada_catchpoint *> (bp) != nullptr;
} }
/* Split the arguments specified in a "catch exception" command. /* Split the arguments specified in a "catch exception" command.
@ -12710,7 +12707,7 @@ ada_exception_catchpoint_cond_string (const char *excep_string,
static struct symtab_and_line static struct symtab_and_line
ada_exception_sal (enum ada_exception_catchpoint_kind ex, ada_exception_sal (enum ada_exception_catchpoint_kind ex,
std::string *addr_string, const struct breakpoint_ops **ops) std::string *addr_string)
{ {
const char *sym_name; const char *sym_name;
struct symbol *sym; struct symbol *sym;
@ -12732,9 +12729,6 @@ ada_exception_sal (enum ada_exception_catchpoint_kind ex,
/* Set ADDR_STRING. */ /* Set ADDR_STRING. */
*addr_string = sym_name; *addr_string = sym_name;
/* Set OPS. */
*ops = &catch_exception_breakpoint_ops;
return find_function_start_sal (sym, 1); return find_function_start_sal (sym, 1);
} }
@ -12763,12 +12757,12 @@ create_ada_exception_catchpoint (struct gdbarch *gdbarch,
int from_tty) int from_tty)
{ {
std::string addr_string; std::string addr_string;
const struct breakpoint_ops *ops = NULL; struct symtab_and_line sal = ada_exception_sal (ex_kind, &addr_string);
struct symtab_and_line sal = ada_exception_sal (ex_kind, &addr_string, &ops);
std::unique_ptr<ada_catchpoint> c (new ada_catchpoint (ex_kind)); std::unique_ptr<ada_catchpoint> c (new ada_catchpoint (ex_kind));
init_ada_exception_breakpoint (c.get (), gdbarch, sal, addr_string.c_str (), init_ada_exception_breakpoint (c.get (), gdbarch, sal, addr_string.c_str (),
ops, tempflag, disabled, from_tty); &vtable_breakpoint_ops,
tempflag, disabled, from_tty);
c->excep_string = excep_string; c->excep_string = excep_string;
create_excep_cond_exprs (c.get (), ex_kind); create_excep_cond_exprs (c.get (), ex_kind);
if (!cond_string.empty ()) if (!cond_string.empty ())
@ -13883,24 +13877,6 @@ static ada_language ada_language_defn;
static struct cmd_list_element *set_ada_list; static struct cmd_list_element *set_ada_list;
static struct cmd_list_element *show_ada_list; static struct cmd_list_element *show_ada_list;
static void
initialize_ada_catchpoint_ops (void)
{
struct breakpoint_ops *ops;
initialize_breakpoint_ops ();
ops = &catch_exception_breakpoint_ops;
*ops = vtable_breakpoint_ops;
ops->allocate_location = allocate_location_exception;
ops->re_set = re_set_exception;
ops->check_status = check_status_exception;
ops->print_it = print_it_exception;
ops->print_one = print_one_exception;
ops->print_mention = print_mention_exception;
ops->print_recreate = print_recreate_exception;
}
/* This module's 'new_objfile' observer. */ /* This module's 'new_objfile' observer. */
static void static void
@ -13941,8 +13917,6 @@ void _initialize_ada_language ();
void void
_initialize_ada_language () _initialize_ada_language ()
{ {
initialize_ada_catchpoint_ops ();
add_setshow_prefix_cmd add_setshow_prefix_cmd
("ada", no_class, ("ada", no_class,
_("Prefix command for changing Ada-specific settings."), _("Prefix command for changing Ada-specific settings."),