diff options
Diffstat (limited to 'gdb/break-catch-syscall.c')
-rw-r--r-- | gdb/break-catch-syscall.c | 198 |
1 files changed, 65 insertions, 133 deletions
diff --git a/gdb/break-catch-syscall.c b/gdb/break-catch-syscall.c index 92ab91b..01e761c 100644 --- a/gdb/break-catch-syscall.c +++ b/gdb/break-catch-syscall.c @@ -36,22 +36,12 @@ struct syscall_catchpoint : public breakpoint { - ~syscall_catchpoint () override; - /* Syscall numbers used for the 'catch syscall' feature. If no - syscall has been specified for filtering, its value is NULL. - Otherwise, it holds a list of all syscalls to be caught. The - list elements are allocated with xmalloc. */ - VEC(int) *syscalls_to_be_caught; + syscall has been specified for filtering, it is empty. + Otherwise, it holds a list of all syscalls to be caught. */ + std::vector<int> syscalls_to_be_caught; }; -/* catch_syscall destructor. */ - -syscall_catchpoint::~syscall_catchpoint () -{ - VEC_free (int, this->syscalls_to_be_caught); -} - static const struct inferior_data *catch_syscall_inferior_data = NULL; struct catch_syscall_inferior_data @@ -64,14 +54,14 @@ struct catch_syscall_inferior_data int any_syscall_count; /* Count of each system call. */ - VEC(int) *syscalls_counts; + std::vector<int> syscalls_counts; /* This counts all syscall catch requests, so we can readily determine if any catching is necessary. */ int total_syscalls_count; }; -static struct catch_syscall_inferior_data* +static struct catch_syscall_inferior_data * get_catch_syscall_inferior_data (struct inferior *inf) { struct catch_syscall_inferior_data *inf_data; @@ -80,7 +70,7 @@ get_catch_syscall_inferior_data (struct inferior *inf) inferior_data (inf, catch_syscall_inferior_data)); if (inf_data == NULL) { - inf_data = XCNEW (struct catch_syscall_inferior_data); + inf_data = new struct catch_syscall_inferior_data (); set_inferior_data (inf, catch_syscall_inferior_data, inf_data); } @@ -90,7 +80,9 @@ get_catch_syscall_inferior_data (struct inferior *inf) static void catch_syscall_inferior_data_cleanup (struct inferior *inf, void *arg) { - xfree (arg); + struct catch_syscall_inferior_data *inf_data + = (struct catch_syscall_inferior_data *) arg; + delete inf_data; } @@ -106,43 +98,25 @@ insert_catch_syscall (struct bp_location *bl) = get_catch_syscall_inferior_data (inf); ++inf_data->total_syscalls_count; - if (!c->syscalls_to_be_caught) + if (c->syscalls_to_be_caught.empty ()) ++inf_data->any_syscall_count; else { - int i, iter; - - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) { int elem; - if (iter >= VEC_length (int, inf_data->syscalls_counts)) - { - int old_size = VEC_length (int, inf_data->syscalls_counts); - uintptr_t vec_addr_offset - = old_size * ((uintptr_t) sizeof (int)); - uintptr_t vec_addr; - VEC_safe_grow (int, inf_data->syscalls_counts, iter + 1); - vec_addr = ((uintptr_t) VEC_address (int, - inf_data->syscalls_counts) - + vec_addr_offset); - memset ((void *) vec_addr, 0, - (iter + 1 - old_size) * sizeof (int)); - } - elem = VEC_index (int, inf_data->syscalls_counts, iter); - VEC_replace (int, inf_data->syscalls_counts, iter, ++elem); + if (iter >= inf_data->syscalls_counts.size ()) + inf_data->syscalls_counts.resize (iter + 1); + ++inf_data->syscalls_counts[iter]; } } return target_set_syscall_catchpoint (ptid_get_pid (inferior_ptid), inf_data->total_syscalls_count != 0, inf_data->any_syscall_count, - VEC_length (int, - inf_data->syscalls_counts), - VEC_address (int, - inf_data->syscalls_counts)); + inf_data->syscalls_counts.size (), + inf_data->syscalls_counts.data ()); } /* Implement the "remove" breakpoint_ops method for syscall @@ -157,32 +131,25 @@ remove_catch_syscall (struct bp_location *bl, enum remove_bp_reason reason) = get_catch_syscall_inferior_data (inf); --inf_data->total_syscalls_count; - if (!c->syscalls_to_be_caught) + if (c->syscalls_to_be_caught.empty ()) --inf_data->any_syscall_count; else { - int i, iter; - - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) { int elem; - if (iter >= VEC_length (int, inf_data->syscalls_counts)) + if (iter >= inf_data->syscalls_counts.size ()) /* Shouldn't happen. */ continue; - elem = VEC_index (int, inf_data->syscalls_counts, iter); - VEC_replace (int, inf_data->syscalls_counts, iter, --elem); + --inf_data->syscalls_counts[iter]; } } return target_set_syscall_catchpoint (ptid_get_pid (inferior_ptid), inf_data->total_syscalls_count != 0, inf_data->any_syscall_count, - VEC_length (int, - inf_data->syscalls_counts), - VEC_address (int, - inf_data->syscalls_counts)); + inf_data->syscalls_counts.size (), + inf_data->syscalls_counts.data ()); } /* Implement the "breakpoint_hit" breakpoint_ops method for syscall @@ -207,13 +174,9 @@ breakpoint_hit_catch_syscall (const struct bp_location *bl, syscall_number = ws->value.syscall_number; /* Now, checking if the syscall is the same. */ - if (c->syscalls_to_be_caught) + if (!c->syscalls_to_be_caught.empty ()) { - int i, iter; - - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) if (syscall_number == iter) return 1; @@ -296,20 +259,16 @@ print_one_catch_syscall (struct breakpoint *b, uiout->field_skip ("addr"); annotate_field (5); - if (c->syscalls_to_be_caught - && VEC_length (int, c->syscalls_to_be_caught) > 1) + if (c->syscalls_to_be_caught.size () > 1) uiout->text ("syscalls \""); else uiout->text ("syscall \""); - if (c->syscalls_to_be_caught) + if (!c->syscalls_to_be_caught.empty ()) { - int i, iter; char *text = xstrprintf ("%s", ""); - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) { char *x = text; struct syscall s; @@ -346,23 +305,19 @@ print_mention_catch_syscall (struct breakpoint *b) struct syscall_catchpoint *c = (struct syscall_catchpoint *) b; struct gdbarch *gdbarch = b->loc->gdbarch; - if (c->syscalls_to_be_caught) + if (!c->syscalls_to_be_caught.empty ()) { - int i, iter; - - if (VEC_length (int, c->syscalls_to_be_caught) > 1) + if (c->syscalls_to_be_caught.size () > 1) printf_filtered (_("Catchpoint %d (syscalls"), b->number); else printf_filtered (_("Catchpoint %d (syscall"), b->number); - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) { struct syscall s; get_syscall_by_number (gdbarch, iter, &s); - if (s.name) + if (s.name != NULL) printf_filtered (" '%s' [%d]", s.name, s.number); else printf_filtered (" %d", s.number); @@ -385,23 +340,17 @@ print_recreate_catch_syscall (struct breakpoint *b, struct ui_file *fp) fprintf_unfiltered (fp, "catch syscall"); - if (c->syscalls_to_be_caught) + for (int iter : c->syscalls_to_be_caught) { - int i, iter; - - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) - { - struct syscall s; + struct syscall s; - get_syscall_by_number (gdbarch, iter, &s); - if (s.name) - fprintf_unfiltered (fp, " %s", s.name); - else - fprintf_unfiltered (fp, " %d", s.number); - } + get_syscall_by_number (gdbarch, iter, &s); + if (s.name != NULL) + fprintf_unfiltered (fp, " %s", s.name); + else + fprintf_unfiltered (fp, " %d", s.number); } + print_recreate_thread (b, fp); } @@ -418,26 +367,24 @@ syscall_catchpoint_p (struct breakpoint *b) } static void -create_syscall_event_catchpoint (int tempflag, VEC(int) *filter, +create_syscall_event_catchpoint (int tempflag, std::vector<int> &&filter, const struct breakpoint_ops *ops) { - struct syscall_catchpoint *c; struct gdbarch *gdbarch = get_current_arch (); - c = new syscall_catchpoint (); - init_catchpoint (c, gdbarch, tempflag, NULL, ops); - c->syscalls_to_be_caught = filter; + std::unique_ptr<syscall_catchpoint> c (new syscall_catchpoint ()); + init_catchpoint (c.get (), gdbarch, tempflag, NULL, ops); + c->syscalls_to_be_caught = std::move (filter); - install_breakpoint (0, c, 1); + install_breakpoint (0, std::move (c), 1); } -/* Splits the argument using space as delimiter. Returns an xmalloc'd - filter list, or NULL if no filtering is required. */ -static VEC(int) * +/* Splits the argument using space as delimiter. */ + +static std::vector<int> catch_syscall_split_args (char *arg) { - VEC(int) *result = NULL; - struct cleanup *cleanup = make_cleanup (VEC_cleanup (int), &result); + std::vector<int> result; struct gdbarch *gdbarch = target_gdbarch (); while (*arg != '\0') @@ -460,7 +407,7 @@ catch_syscall_split_args (char *arg) if (*endptr == '\0') { get_syscall_by_number (gdbarch, syscall_number, &s); - VEC_safe_push (int, result, s.number); + result.push_back (s.number); } else if (startswith (cur_name, "g:") || startswith (cur_name, "group:")) @@ -482,7 +429,7 @@ catch_syscall_split_args (char *arg) { /* Insert each syscall that are part of the group. No need to check if it is valid. */ - VEC_safe_push (int, result, syscall_list[i].number); + result.push_back (syscall_list[i].number); } xfree (syscall_list); @@ -500,11 +447,10 @@ catch_syscall_split_args (char *arg) error (_("Unknown syscall name '%s'."), cur_name); /* Ok, it's valid. */ - VEC_safe_push (int, result, s.number); + result.push_back (s.number); } } - discard_cleanups (cleanup); return result; } @@ -515,7 +461,7 @@ catch_syscall_command_1 (char *arg, int from_tty, struct cmd_list_element *command) { int tempflag; - VEC(int) *filter; + std::vector<int> filter; struct syscall s; struct gdbarch *gdbarch = get_current_arch (); @@ -542,10 +488,8 @@ this architecture yet.")); if (arg != NULL) filter = catch_syscall_split_args (arg); - else - filter = NULL; - create_syscall_event_catchpoint (tempflag, filter, + create_syscall_event_catchpoint (tempflag, std::move (filter), &catch_syscall_breakpoint_ops); } @@ -586,12 +530,9 @@ catching_syscall_number_1 (struct breakpoint *b, { struct syscall_catchpoint *c = (struct syscall_catchpoint *) b; - if (c->syscalls_to_be_caught) + if (!c->syscalls_to_be_caught.empty ()) { - int i, iter; - for (i = 0; - VEC_iterate (int, c->syscalls_to_be_caught, i, iter); - i++) + for (int iter : c->syscalls_to_be_caught) if (syscall_number == iter) return 1; } @@ -612,15 +553,14 @@ catching_syscall_number (int syscall_number) } /* 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; @@ -636,8 +576,8 @@ catch_syscall_completer (struct cmd_list_element *cmd, { /* 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 { @@ -654,21 +594,15 @@ catch_syscall_completer (struct cmd_list_element *cmd, 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 @@ -679,7 +613,7 @@ clear_syscall_counts (struct inferior *inf) inf_data->total_syscalls_count = 0; inf_data->any_syscall_count = 0; - VEC_free (int, inf_data->syscalls_counts); + inf_data->syscalls_counts.clear (); } static void @@ -701,8 +635,6 @@ initialize_syscall_catchpoint_ops (void) ops->print_recreate = print_recreate_catch_syscall; } -initialize_file_ftype _initialize_break_catch_syscall; - void _initialize_break_catch_syscall (void) { |