/* An instance of this type is used to represent a syscall
catchpoint. */
-struct syscall_catchpoint : public breakpoint
+struct syscall_catchpoint : public catchpoint
{
+ syscall_catchpoint (struct gdbarch *gdbarch, bool tempflag,
+ std::vector<int> &&calls)
+ : catchpoint (gdbarch, tempflag, nullptr),
+ syscalls_to_be_caught (std::move (calls))
+ {
+ }
+
int insert_location (struct bp_location *) override;
int remove_location (struct bp_location *,
enum remove_bp_reason reason) override;
const address_space *aspace,
CORE_ADDR bp_addr,
const target_waitstatus &ws) 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;
+ enum print_stop_action print_it (const bpstat *bs) const override;
+ bool print_one (bp_location **) const override;
+ void print_mention () const override;
+ void print_recreate (struct ui_file *fp) const override;
/* Syscall numbers used for the 'catch syscall' feature. If no
syscall has been specified for filtering, it is empty.
/* Implement the "print_it" method for syscall catchpoints. */
enum print_stop_action
-syscall_catchpoint::print_it (bpstat *bs)
+syscall_catchpoint::print_it (const bpstat *bs) const
{
struct ui_out *uiout = current_uiout;
struct breakpoint *b = bs->breakpoint_at;
must print "called syscall" or "returned from syscall". */
struct target_waitstatus last;
struct syscall s;
- struct gdbarch *gdbarch = bs->bp_location_at->gdbarch;
+ struct gdbarch *gdbarch = b->gdbarch;
get_last_target_status (nullptr, nullptr, &last);
/* Implement the "print_one" method for syscall catchpoints. */
bool
-syscall_catchpoint::print_one (struct bp_location **last_loc)
+syscall_catchpoint::print_one (bp_location **last_loc) const
{
struct value_print_options opts;
struct ui_out *uiout = current_uiout;
- struct gdbarch *gdbarch = loc->gdbarch;
+ struct gdbarch *gdbarch = loc->owner->gdbarch;
get_user_print_options (&opts);
/* Field 4, the address, is omitted (which makes the columns not
/* Implement the "print_mention" method for syscall catchpoints. */
void
-syscall_catchpoint::print_mention ()
+syscall_catchpoint::print_mention () const
{
- struct gdbarch *gdbarch = loc->gdbarch;
+ struct gdbarch *gdbarch = loc->owner->gdbarch;
if (!syscalls_to_be_caught.empty ())
{
/* Implement the "print_recreate" method for syscall catchpoints. */
void
-syscall_catchpoint::print_recreate (struct ui_file *fp)
+syscall_catchpoint::print_recreate (struct ui_file *fp) const
{
struct gdbarch *gdbarch = loc->gdbarch;
gdb_printf (fp, " %d", s.number);
}
- print_recreate_thread (this, fp);
+ print_recreate_thread (fp);
}
/* Returns non-zero if 'b' is a syscall catchpoint. */
{
struct gdbarch *gdbarch = get_current_arch ();
- std::unique_ptr<syscall_catchpoint> c (new syscall_catchpoint ());
- init_catchpoint (c.get (), gdbarch, tempflag, nullptr,
- &vtable_breakpoint_ops);
- c->syscalls_to_be_caught = std::move (filter);
+ std::unique_ptr<syscall_catchpoint> c
+ (new syscall_catchpoint (gdbarch, tempflag, std::move (filter)));
install_breakpoint (0, std::move (c), 1);
}