{ "-probe-stap libstdcxx:catch", "__cxa_begin_catch" }
};
-static struct breakpoint_ops gnu_v3_exception_catchpoint_ops;
-
/* The type of an exception catchpoint. */
struct exception_catchpoint : public base_breakpoint
{
+ void re_set () 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;
+ void print_one_detail (struct ui_out *) const override;
+ void check_status (struct bpstat *bs) override;
+ struct bp_location *allocate_location () override;
+
+ /* FIXME this is temporary - until ordinary breakpoints have been
+ converted. */
+ int resources_needed (const struct bp_location *) override
+ {
+ return 1;
+ }
+
/* The kind of exception catchpoint. */
enum exception_event_kind kind;
bool
is_exception_catchpoint (breakpoint *bp)
{
- return bp->ops == &gnu_v3_exception_catchpoint_ops;
+ return dynamic_cast<exception_catchpoint *> (bp) != nullptr;
}
\f
\f
-/* A helper function that returns a value indicating the kind of the
- exception catchpoint B. */
-
-static enum exception_event_kind
-classify_exception_breakpoint (struct breakpoint *b)
-{
- struct exception_catchpoint *cp = (struct exception_catchpoint *) b;
-
- return cp->kind;
-}
-
/* Implement the 'check_status' method. */
-static void
-check_status_exception_catchpoint (struct bpstat *bs)
+void
+exception_catchpoint::check_status (struct bpstat *bs)
{
struct exception_catchpoint *self
= (struct exception_catchpoint *) bs->breakpoint_at;
std::string type_name;
- bkpt_breakpoint_ops.check_status (bs);
+ this->breakpoint::check_status (bs);
if (bs->stop == 0)
return;
/* Implement the 're_set' method. */
-static void
-re_set_exception_catchpoint (struct breakpoint *self)
+void
+exception_catchpoint::re_set ()
{
std::vector<symtab_and_line> sals;
- enum exception_event_kind kind = classify_exception_breakpoint (self);
struct program_space *filter_pspace = current_program_space;
/* We first try to use the probe interface. */
explicit_loc.function_name
= ASTRDUP (exception_functions[kind].function);
event_location_up location = new_explicit_location (&explicit_loc);
- sals = self->ops->decode_location (self, location.get (),
- filter_pspace);
+ sals = this->decode_location (location.get (), filter_pspace);
}
catch (const gdb_exception_error &ex)
{
}
}
- update_breakpoint_locations (self, filter_pspace, sals, {});
+ update_breakpoint_locations (this, filter_pspace, sals, {});
}
-static enum print_stop_action
-print_it_exception_catchpoint (bpstat *bs)
+enum print_stop_action
+exception_catchpoint::print_it (bpstat *bs)
{
struct ui_out *uiout = current_uiout;
- struct breakpoint *b = bs->breakpoint_at;
int bp_temp;
- enum exception_event_kind kind = classify_exception_breakpoint (b);
- annotate_catchpoint (b->number);
+ annotate_catchpoint (number);
maybe_print_thread_hit_breakpoint (uiout);
- bp_temp = b->disposition == disp_del;
+ bp_temp = disposition == disp_del;
uiout->text (bp_temp ? "Temporary catchpoint "
: "Catchpoint ");
- uiout->field_signed ("bkptno", b->number);
+ uiout->field_signed ("bkptno", number);
uiout->text ((kind == EX_EVENT_THROW ? " (exception thrown), "
: (kind == EX_EVENT_CATCH ? " (exception caught), "
: " (exception rethrown), ")));
{
uiout->field_string ("reason",
async_reason_lookup (EXEC_ASYNC_BREAKPOINT_HIT));
- uiout->field_string ("disp", bpdisp_text (b->disposition));
+ uiout->field_string ("disp", bpdisp_text (disposition));
}
return PRINT_SRC_AND_LOC;
}
-static bool
-print_one_exception_catchpoint (struct breakpoint *b,
- struct bp_location **last_loc)
+bool
+exception_catchpoint::print_one (struct bp_location **last_loc)
{
struct value_print_options opts;
struct ui_out *uiout = current_uiout;
- enum exception_event_kind kind = classify_exception_breakpoint (b);
get_user_print_options (&opts);
/* Implement the 'print_one_detail' method. */
-static void
-print_one_detail_exception_catchpoint (const struct breakpoint *b,
- struct ui_out *uiout)
+void
+exception_catchpoint::print_one_detail (struct ui_out *uiout) const
{
- const struct exception_catchpoint *cp
- = (const struct exception_catchpoint *) b;
-
- if (!cp->exception_rx.empty ())
+ if (!exception_rx.empty ())
{
uiout->text (_("\tmatching: "));
- uiout->field_string ("regexp", cp->exception_rx);
+ uiout->field_string ("regexp", exception_rx);
uiout->text ("\n");
}
}
-static void
-print_mention_exception_catchpoint (struct breakpoint *b)
+void
+exception_catchpoint::print_mention ()
{
struct ui_out *uiout = current_uiout;
int bp_temp;
- enum exception_event_kind kind = classify_exception_breakpoint (b);
- bp_temp = b->disposition == disp_del;
+ bp_temp = disposition == disp_del;
uiout->message ("%s %d %s",
(bp_temp ? _("Temporary catchpoint ") : _("Catchpoint")),
- b->number,
+ number,
(kind == EX_EVENT_THROW
? _("(throw)") : (kind == EX_EVENT_CATCH
? _("(catch)") : _("(rethrow)"))));
}
-/* Implement the "print_recreate" breakpoint_ops method for throw and
- catch catchpoints. */
+/* Implement the "print_recreate" method for throw and catch
+ catchpoints. */
-static void
-print_recreate_exception_catchpoint (struct breakpoint *b,
- struct ui_file *fp)
+void
+exception_catchpoint::print_recreate (struct ui_file *fp)
{
int bp_temp;
- enum exception_event_kind kind = classify_exception_breakpoint (b);
- bp_temp = b->disposition == disp_del;
+ bp_temp = disposition == disp_del;
gdb_printf (fp, bp_temp ? "tcatch " : "catch ");
switch (kind)
{
gdb_printf (fp, "rethrow");
break;
}
- print_recreate_thread (b, fp);
+ print_recreate_thread (this, fp);
}
-/* Implement the "allocate_location" breakpoint_ops method for throw
- and catch catchpoints. */
+/* Implement the "allocate_location" method for throw and catch
+ catchpoints. */
-static bp_location *
-allocate_location_exception_catchpoint (breakpoint *self)
+bp_location *
+exception_catchpoint::allocate_location ()
{
- return new bp_location (self, bp_loc_software_breakpoint);
+ return new bp_location (this, bp_loc_software_breakpoint);
}
static void
std::unique_ptr<exception_catchpoint> cp (new exception_catchpoint ());
init_catchpoint (cp.get (), get_current_arch (), tempflag, cond_string,
- &gnu_v3_exception_catchpoint_ops);
+ &vtable_breakpoint_ops);
cp->kind = ex_event;
cp->exception_rx = std::move (except_rx);
cp->pattern = std::move (pattern);
- re_set_exception_catchpoint (cp.get ());
+ cp->re_set ();
install_breakpoint (0, std::move (cp), 1);
}
\f
-static void
-initialize_throw_catchpoint_ops (void)
-{
- struct breakpoint_ops *ops;
-
- initialize_breakpoint_ops ();
-
- /* GNU v3 exception catchpoints. */
- ops = &gnu_v3_exception_catchpoint_ops;
- *ops = bkpt_breakpoint_ops;
- ops->re_set = re_set_exception_catchpoint;
- ops->print_it = print_it_exception_catchpoint;
- ops->print_one = print_one_exception_catchpoint;
- ops->print_mention = print_mention_exception_catchpoint;
- ops->print_recreate = print_recreate_exception_catchpoint;
- ops->print_one_detail = print_one_detail_exception_catchpoint;
- ops->check_status = check_status_exception_catchpoint;
- ops->allocate_location = allocate_location_exception_catchpoint;
-}
-
void _initialize_break_catch_throw ();
void
_initialize_break_catch_throw ()
{
- initialize_throw_catchpoint_ops ();
-
/* Add catch and tcatch sub-commands. */
add_catch_command ("catch", _("\
Catch an exception, when caught."),