Introduce catchpoint class

This introduces a catchpoint class that is used as the base class for
all catchpoints.  init_catchpoint is rewritten to be a constructor
instead.

This changes the hierarchy a little -- some catchpoints now inherit
from base_breakpoint whereas previously they did not.  This isn't a
problem, as long as re_set is redefined in catchpoint.
This commit is contained in:
Tom Tromey
2022-05-01 16:11:26 -06:00
parent b68f26dea7
commit fed1c982de
8 changed files with 49 additions and 49 deletions

View File

@@ -34,10 +34,10 @@
A breakpoint is really of this type iff its ops pointer points to
CATCH_EXEC_BREAKPOINT_OPS. */
struct exec_catchpoint : public breakpoint
struct exec_catchpoint : public catchpoint
{
explicit exec_catchpoint (struct gdbarch *gdbarch)
: breakpoint (gdbarch, bp_catchpoint)
exec_catchpoint (struct gdbarch *gdbarch, bool temp, const char *cond_string)
: catchpoint (gdbarch, temp, cond_string)
{
}
@@ -208,8 +208,8 @@ catch_exec_command_1 (const char *arg, int from_tty,
if ((*arg != '\0') && !isspace (*arg))
error (_("Junk at end of arguments."));
std::unique_ptr<exec_catchpoint> c (new exec_catchpoint (gdbarch));
init_catchpoint (c.get (), gdbarch, temp, cond_string);
std::unique_ptr<exec_catchpoint> c
(new exec_catchpoint (gdbarch, temp, cond_string));
install_breakpoint (0, std::move (c), 1);
}

View File

@@ -32,10 +32,11 @@
catchpoint. A breakpoint is really of this type iff its ops pointer points
to CATCH_FORK_BREAKPOINT_OPS. */
struct fork_catchpoint : public breakpoint
struct fork_catchpoint : public catchpoint
{
fork_catchpoint (struct gdbarch *gdbarch, bool is_vfork_)
: breakpoint (gdbarch, bp_catchpoint),
fork_catchpoint (struct gdbarch *gdbarch, bool temp,
const char *cond_string, bool is_vfork_)
: catchpoint (gdbarch, temp, cond_string),
is_vfork (is_vfork_)
{
}
@@ -186,10 +187,8 @@ create_fork_vfork_event_catchpoint (struct gdbarch *gdbarch,
bool temp, const char *cond_string,
bool is_vfork)
{
std::unique_ptr<fork_catchpoint> c (new fork_catchpoint (gdbarch,
is_vfork));
init_catchpoint (c.get (), gdbarch, temp, cond_string);
std::unique_ptr<fork_catchpoint> c
(new fork_catchpoint (gdbarch, temp, cond_string, is_vfork));
install_breakpoint (0, std::move (c), 1);
}

View File

@@ -33,10 +33,12 @@
A breakpoint is really of this type iff its ops pointer points to
CATCH_SOLIB_BREAKPOINT_OPS. */
struct solib_catchpoint : public breakpoint
struct solib_catchpoint : public catchpoint
{
solib_catchpoint (struct gdbarch *gdbarch, bool is_load_, const char *arg)
: breakpoint (gdbarch, bp_catchpoint),
solib_catchpoint (struct gdbarch *gdbarch, bool temp,
const char *cond_string,
bool is_load_, const char *arg)
: catchpoint (gdbarch, temp, cond_string),
is_load (is_load_),
regex (arg == nullptr ? nullptr : make_unique_xstrdup (arg)),
compiled (arg == nullptr
@@ -229,11 +231,10 @@ add_solib_catchpoint (const char *arg, bool is_load, bool is_temp, bool enabled)
if (*arg == '\0')
arg = nullptr;
std::unique_ptr<solib_catchpoint> c (new solib_catchpoint (gdbarch,
std::unique_ptr<solib_catchpoint> c (new solib_catchpoint (gdbarch, is_temp,
nullptr,
is_load, arg));
init_catchpoint (c.get (), gdbarch, is_temp, NULL);
c->enable_state = enabled ? bp_enabled : bp_disabled;
install_breakpoint (0, std::move (c), 1);

View File

@@ -38,11 +38,12 @@
/* An instance of this type is used to represent a signal
catchpoint. */
struct signal_catchpoint : public breakpoint
struct signal_catchpoint : public catchpoint
{
signal_catchpoint (struct gdbarch *gdbarch, std::vector<gdb_signal> &&sigs,
signal_catchpoint (struct gdbarch *gdbarch, bool temp,
std::vector<gdb_signal> &&sigs,
bool catch_all_)
: breakpoint (gdbarch, bp_catchpoint),
: catchpoint (gdbarch, temp, nullptr),
signals_to_be_caught (std::move (sigs)),
catch_all (catch_all_)
{
@@ -325,8 +326,7 @@ create_signal_catchpoint (int tempflag, std::vector<gdb_signal> &&filter,
struct gdbarch *gdbarch = get_current_arch ();
std::unique_ptr<signal_catchpoint> c
(new signal_catchpoint (gdbarch, std::move (filter), catch_all));
init_catchpoint (c.get (), gdbarch, tempflag, nullptr);
(new signal_catchpoint (gdbarch, tempflag, std::move (filter), catch_all));
install_breakpoint (0, std::move (c), 1);
}

View File

@@ -355,7 +355,6 @@ create_syscall_event_catchpoint (int tempflag, std::vector<int> &&filter)
std::unique_ptr<syscall_catchpoint> c
(new syscall_catchpoint (gdbarch, std::move (filter)));
init_catchpoint (c.get (), gdbarch, tempflag, nullptr);
install_breakpoint (0, std::move (c), 1);
}

View File

@@ -65,12 +65,13 @@ static const struct exception_names exception_functions[] =
/* The type of an exception catchpoint. */
struct exception_catchpoint : public base_breakpoint
struct exception_catchpoint : public catchpoint
{
exception_catchpoint (struct gdbarch *gdbarch,
bool temp, const char *cond_string,
enum exception_event_kind kind_,
std::string &&except_rx)
: base_breakpoint (gdbarch, bp_catchpoint),
: catchpoint (gdbarch, temp, cond_string),
kind (kind_),
exception_rx (std::move (except_rx)),
pattern (exception_rx.empty ()
@@ -371,9 +372,8 @@ handle_gnu_v3_exceptions (int tempflag, std::string &&except_rx,
struct gdbarch *gdbarch = get_current_arch ();
std::unique_ptr<exception_catchpoint> cp
(new exception_catchpoint (gdbarch, ex_event, std::move (except_rx)));
init_catchpoint (cp.get (), gdbarch, tempflag, cond_string);
(new exception_catchpoint (gdbarch, tempflag, cond_string,
ex_event, std::move (except_rx)));
cp->re_set ();

View File

@@ -7804,23 +7804,18 @@ disable_breakpoints_in_freed_objfile (struct objfile *objfile)
/* See breakpoint.h. */
void
init_catchpoint (struct breakpoint *b,
struct gdbarch *gdbarch, bool temp,
const char *cond_string)
catchpoint::catchpoint (struct gdbarch *gdbarch, bool temp,
const char *cond_string_)
: base_breakpoint (gdbarch, bp_catchpoint)
{
symtab_and_line sal;
sal.pspace = current_program_space;
/* This should already have been set in the constructor. */
gdb_assert (b->type == bp_catchpoint);
init_raw_breakpoint (b, sal, bp_catchpoint);
init_raw_breakpoint (this, sal, bp_catchpoint);
if (cond_string == nullptr)
b->cond_string.reset ();
else
b->cond_string = make_unique_xstrdup (cond_string);
b->disposition = temp ? disp_del : disp_donttouch;
if (cond_string_ != nullptr)
cond_string = make_unique_xstrdup (cond_string_);
disposition = temp ? disp_del : disp_donttouch;
}
void

View File

@@ -1012,6 +1012,20 @@ struct tracepoint : public breakpoint
int static_trace_marker_id_idx = 0;
};
/* The base class for catchpoints. */
struct catchpoint : public base_breakpoint
{
/* If TEMP is true, then make the breakpoint temporary. If
COND_STRING is not NULL, then store it in the breakpoint. */
catchpoint (struct gdbarch *gdbarch, bool temp, const char *cond_string);
void re_set () override
{
/* For catchpoints, the default is to do nothing. */
}
};
/* The following stuff is an abstract data type "bpstat" ("breakpoint
status"). This provides the ability to determine whether we have
@@ -1440,14 +1454,6 @@ extern void
int enabled,
int from_tty);
/* Initialize a new breakpoint of the bp_catchpoint kind. If TEMP
is true, then make the breakpoint temporary. If COND_STRING is
not NULL, then store it in the breakpoint. */
extern void init_catchpoint (struct breakpoint *b,
struct gdbarch *gdbarch, bool temp,
const char *cond_string);
/* Add breakpoint B on the breakpoint list, and notify the user, the
target and breakpoint_created observers of its existence. If
INTERNAL is non-zero, the breakpoint number will be allocated from