/* Everything about syscall catchpoints, for GDB.
- Copyright (C) 2009-2016 Free Software Foundation, Inc.
+ Copyright (C) 2009-2017 Free Software Foundation, Inc.
This file is part of GDB.
#include "xml-syscall.h"
/* An instance of this type is used to represent a syscall catchpoint.
- It includes a "struct breakpoint" as a kind of base class; users
- downcast to "struct breakpoint *" when needed. A breakpoint is
- really of this type iff its ops pointer points to
+ A breakpoint is really of this type iff its ops pointer points to
CATCH_SYSCALL_BREAKPOINT_OPS. */
-struct syscall_catchpoint
+struct syscall_catchpoint : public breakpoint
{
- /* The base class. */
- struct breakpoint base;
+ ~syscall_catchpoint () override;
/* Syscall numbers used for the 'catch syscall' feature. If no
syscall has been specified for filtering, its value is NULL.
VEC(int) *syscalls_to_be_caught;
};
-/* Implement the "dtor" breakpoint_ops method for syscall
- catchpoints. */
+/* catch_syscall destructor. */
-static void
-dtor_catch_syscall (struct breakpoint *b)
+syscall_catchpoint::~syscall_catchpoint ()
{
- struct syscall_catchpoint *c = (struct syscall_catchpoint *) b;
-
- VEC_free (int, c->syscalls_to_be_caught);
-
- base_breakpoint_ops.dtor (b);
+ VEC_free (int, this->syscalls_to_be_caught);
}
static const struct inferior_data *catch_syscall_inferior_data = NULL;
struct gdbarch *gdbarch = get_current_arch ();
c = new syscall_catchpoint ();
- init_catchpoint (&c->base, gdbarch, tempflag, NULL, ops);
+ init_catchpoint (c, gdbarch, tempflag, NULL, ops);
c->syscalls_to_be_caught = filter;
- install_breakpoint (0, &c->base, 1);
+ install_breakpoint (0, c, 1);
}
/* Splits the argument using space as delimiter. Returns an xmalloc'd
}
/* Complete syscall names. Used by "catch syscall". */
-static VEC (char_ptr) *
+
+static void
catch_syscall_completer (struct cmd_list_element *cmd,
+ completion_tracker &tracker,
const char *text, const char *word)
{
struct gdbarch *gdbarch = get_current_arch ();
struct cleanup *cleanups = make_cleanup (null_cleanup, NULL);
- VEC (char_ptr) *group_retlist = NULL;
- VEC (char_ptr) *syscall_retlist = NULL;
- VEC (char_ptr) *retlist = NULL;
const char **group_list = NULL;
const char **syscall_list = NULL;
const char *prefix;
{
/* Perform completion inside 'group:' namespace only. */
group_list = get_syscall_group_names (gdbarch);
- retlist = (group_list == NULL
- ? NULL : complete_on_enum (group_list, word, word));
+ if (group_list != NULL)
+ complete_on_enum (tracker, group_list, word, word);
}
else
{
make_cleanup (xfree, prefixed_group);
}
- syscall_retlist = ((syscall_list == NULL)
- ? NULL : complete_on_enum (syscall_list, word, word));
- group_retlist = ((group_list == NULL)
- ? NULL : complete_on_enum (group_list, word, word));
-
- retlist = VEC_merge (char_ptr, syscall_retlist, group_retlist);
+ if (syscall_list != NULL)
+ complete_on_enum (tracker, syscall_list, word, word);
+ if (group_list != NULL)
+ complete_on_enum (tracker, group_list, word, word);
}
- VEC_free (char_ptr, syscall_retlist);
- VEC_free (char_ptr, group_retlist);
xfree (syscall_list);
xfree (group_list);
do_cleanups (cleanups);
-
- return retlist;
}
static void
/* Syscall catchpoints. */
ops = &catch_syscall_breakpoint_ops;
*ops = base_breakpoint_ops;
- ops->dtor = dtor_catch_syscall;
ops->insert_location = insert_catch_syscall;
ops->remove_location = remove_catch_syscall;
ops->breakpoint_hit = breakpoint_hit_catch_syscall;