From f51e0e20bd303a9b366084ac719db10978402713 Mon Sep 17 00:00:00 2001 From: Tom Tromey Date: Tue, 5 Jun 2018 10:22:01 -0600 Subject: [PATCH] Remove VEC from breakpoint This removes a use of VEC from breakpoint.h, also removing the now-unnecessary breakpoint_p typedef. This patch fixes a latent memory leak in find_matching_tracepoint_location, which neglected to free the vector returned by all_tracepoints. Tested by the buildbot. gdb/ChangeLog 2018-07-03 Tom Tromey * tracepoint.c (process_tracepoint_on_disconnect, start_tracing) (stop_tracing, tstatus_command) (find_matching_tracepoint_location, merge_uploaded_tracepoints) (print_one_static_tracepoint_marker): Update. * breakpoint.c (static_tracepoints_here, all_tracepoints): Return std::vector. * breakpoint.h (breakpoint_p): Remove typedef. Don't declare VEC. (all_tracepoints, static_tracepoints_here): Return std::vector. --- gdb/ChangeLog | 12 +++++++++ gdb/breakpoint.c | 12 ++++----- gdb/breakpoint.h | 13 +++------ gdb/tracepoint.c | 82 +++++++++++++++----------------------------------------- 4 files changed, 44 insertions(+), 75 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 2b27c17..a471149 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2018-07-03 Tom Tromey + * tracepoint.c (process_tracepoint_on_disconnect, start_tracing) + (stop_tracing, tstatus_command) + (find_matching_tracepoint_location, merge_uploaded_tracepoints) + (print_one_static_tracepoint_marker): Update. + * breakpoint.c (static_tracepoints_here, all_tracepoints): Return + std::vector. + * breakpoint.h (breakpoint_p): Remove typedef. Don't declare + VEC. + (all_tracepoints, static_tracepoints_here): Return std::vector. + +2018-07-03 Tom Tromey + * common/ptid.c (ptid_equal): Remove. * common/ptid.h (ptid_equal): Don't declare. * ada-tasks.c: Update. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index df1afac..77c4638 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1145,11 +1145,11 @@ validate_commands_for_breakpoint (struct breakpoint *b, /* Return a vector of all the static tracepoints set at ADDR. The caller is responsible for releasing the vector. */ -VEC(breakpoint_p) * +std::vector static_tracepoints_here (CORE_ADDR addr) { struct breakpoint *b; - VEC(breakpoint_p) *found = 0; + std::vector found; struct bp_location *loc; ALL_BREAKPOINTS (b) @@ -1157,7 +1157,7 @@ static_tracepoints_here (CORE_ADDR addr) { for (loc = b->loc; loc; loc = loc->next) if (loc->address == addr) - VEC_safe_push(breakpoint_p, found, b); + found.push_back (b); } return found; @@ -15166,15 +15166,15 @@ save_tracepoints_command (const char *args, int from_tty) /* Create a vector of all tracepoints. */ -VEC(breakpoint_p) * +std::vector all_tracepoints (void) { - VEC(breakpoint_p) *tp_vec = 0; + std::vector tp_vec; struct breakpoint *tp; ALL_TRACEPOINTS (tp) { - VEC_safe_push (breakpoint_p, tp_vec, tp); + tp_vec.push_back (tp); } return tp_vec; diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index 3f75aa4..7da9452 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -904,8 +904,6 @@ struct tracepoint : public breakpoint int static_trace_marker_id_idx; }; -typedef struct breakpoint *breakpoint_p; -DEF_VEC_P(breakpoint_p); /* The following stuff is an abstract data type "bpstat" ("breakpoint status"). This provides the ability to determine whether we have @@ -1626,16 +1624,13 @@ extern struct tracepoint * get_tracepoint_by_number (const char **arg, number_or_range_parser *parser); -/* Return a vector of all tracepoints currently defined. The vector - is newly allocated; the caller should free when done with it. */ -extern VEC(breakpoint_p) *all_tracepoints (void); +/* Return a vector of all tracepoints currently defined. */ +extern std::vector all_tracepoints (void); extern int is_tracepoint (const struct breakpoint *b); -/* Return a vector of all static tracepoints defined at ADDR. The - vector is newly allocated; the caller should free when done with - it. */ -extern VEC(breakpoint_p) *static_tracepoints_here (CORE_ADDR addr); +/* Return a vector of all static tracepoints defined at ADDR. */ +extern std::vector static_tracepoints_here (CORE_ADDR addr); /* Create an instance of this to start registering breakpoint numbers for a later "commands" command. */ diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 5af3cfe..ab80b10 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -1495,15 +1495,11 @@ collection_list::add_aexpr (agent_expr_up aexpr) static void process_tracepoint_on_disconnect (void) { - VEC(breakpoint_p) *tp_vec = NULL; - int ix; - struct breakpoint *b; int has_pending_p = 0; /* Check whether we still have pending tracepoint. If we have, warn the user that pending tracepoint will no longer work. */ - tp_vec = all_tracepoints (); - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++) + for (breakpoint *b : all_tracepoints ()) { if (b->loc == NULL) { @@ -1527,7 +1523,6 @@ process_tracepoint_on_disconnect (void) break; } } - VEC_free (breakpoint_p, tp_vec); if (has_pending_p) warning (_("Pending tracepoints will not be resolved while" @@ -1548,23 +1543,17 @@ trace_reset_local_state (void) void start_tracing (const char *notes) { - VEC(breakpoint_p) *tp_vec = NULL; - int ix; - struct breakpoint *b; struct trace_state_variable *tsv; int any_enabled = 0, num_to_download = 0; int ret; - tp_vec = all_tracepoints (); + std::vector tp_vec = all_tracepoints (); /* No point in tracing without any tracepoints... */ - if (VEC_length (breakpoint_p, tp_vec) == 0) - { - VEC_free (breakpoint_p, tp_vec); - error (_("No tracepoints defined, not starting trace")); - } + if (tp_vec.empty ()) + error (_("No tracepoints defined, not starting trace")); - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++) + for (breakpoint *b : tp_vec) { if (b->enable_state == bp_enabled) any_enabled = 1; @@ -1586,20 +1575,16 @@ start_tracing (const char *notes) { /* No point in tracing with only disabled tracepoints that cannot be re-enabled. */ - VEC_free (breakpoint_p, tp_vec); error (_("No tracepoints enabled, not starting trace")); } } if (num_to_download <= 0) - { - VEC_free (breakpoint_p, tp_vec); - error (_("No tracepoints that may be downloaded, not starting trace")); - } + error (_("No tracepoints that may be downloaded, not starting trace")); target_trace_init (); - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++) + for (breakpoint *b : tp_vec) { struct tracepoint *t = (struct tracepoint *) b; struct bp_location *loc; @@ -1638,7 +1623,6 @@ start_tracing (const char *notes) if (bp_location_downloaded) gdb::observers::breakpoint_modified.notify (b); } - VEC_free (breakpoint_p, tp_vec); /* Send down all the trace state variables too. */ for (const trace_state_variable &tsv : tvariables) @@ -1705,14 +1689,10 @@ void stop_tracing (const char *note) { int ret; - VEC(breakpoint_p) *tp_vec = NULL; - int ix; - struct breakpoint *t; target_trace_stop (); - tp_vec = all_tracepoints (); - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++) + for (breakpoint *t : all_tracepoints ()) { struct bp_location *loc; @@ -1733,8 +1713,6 @@ stop_tracing (const char *note) } } - VEC_free (breakpoint_p, tp_vec); - if (!note) note = trace_stop_notes; ret = target_set_trace_notes (NULL, NULL, note); @@ -1751,9 +1729,7 @@ static void tstatus_command (const char *args, int from_tty) { struct trace_status *ts = current_trace_status (); - int status, ix; - VEC(breakpoint_p) *tp_vec = NULL; - struct breakpoint *t; + int status; status = target_get_trace_status (ts); @@ -1896,12 +1872,8 @@ tstatus_command (const char *args, int from_tty) (long int) (ts->stop_time % 1000000)); /* Now report any per-tracepoint status available. */ - tp_vec = all_tracepoints (); - - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++) + for (breakpoint *t : all_tracepoints ()) target_get_tracepoint_status (t, NULL); - - VEC_free (breakpoint_p, tp_vec); } /* Report the trace status to uiout, in a way suitable for MI, and not @@ -3058,12 +3030,9 @@ cond_string_is_same (char *str1, char *str2) static struct bp_location * find_matching_tracepoint_location (struct uploaded_tp *utp) { - VEC(breakpoint_p) *tp_vec = all_tracepoints (); - int ix; - struct breakpoint *b; struct bp_location *loc; - for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++) + for (breakpoint *b : all_tracepoints ()) { struct tracepoint *t = (struct tracepoint *) b; @@ -3094,9 +3063,7 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps) { struct uploaded_tp *utp; /* A set of tracepoints which are modified. */ - VEC(breakpoint_p) *modified_tp = NULL; - int ix; - struct breakpoint *b; + std::vector modified_tp; /* Look for GDB tracepoints that match up with our uploaded versions. */ for (utp = *uploaded_tps; utp; utp = utp->next) @@ -3122,16 +3089,14 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps) MODIFIED_TP if not there yet. The 'breakpoint-modified' observers will be notified later once for each tracepoint saved in MODIFIED_TP. */ - for (ix = 0; - VEC_iterate (breakpoint_p, modified_tp, ix, b); - ix++) + for (breakpoint *b : modified_tp) if (b == loc->owner) { found = 1; break; } if (!found) - VEC_safe_push (breakpoint_p, modified_tp, loc->owner); + modified_tp.push_back (loc->owner); } else { @@ -3156,10 +3121,9 @@ merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps) /* Notify 'breakpoint-modified' observer that at least one of B's locations was changed. */ - for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++) + for (breakpoint *b : modified_tp) gdb::observers::breakpoint_modified.notify (b); - VEC_free (breakpoint_p, modified_tp); free_uploaded_tps (uploaded_tps); } @@ -3643,12 +3607,12 @@ print_one_static_tracepoint_marker (int count, char wrap_indent[80]; char extra_field_indent[80]; struct ui_out *uiout = current_uiout; - VEC(breakpoint_p) *tracepoints; symtab_and_line sal; sal.pc = marker.address; - tracepoints = static_tracepoints_here (marker.address); + std::vector tracepoints + = static_tracepoints_here (marker.address); ui_out_emit_tuple tuple_emitter (uiout, "marker"); @@ -3659,7 +3623,7 @@ print_one_static_tracepoint_marker (int count, uiout->field_string ("marker-id", marker.str_id.c_str ()); uiout->field_fmt ("enabled", "%c", - !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n'); + !tracepoints.empty () ? 'y' : 'n'); uiout->spaces (2); strcpy (wrap_indent, " "); @@ -3715,7 +3679,7 @@ print_one_static_tracepoint_marker (int count, uiout->field_string ("extra-data", marker.extra.c_str ()); uiout->text ("\"\n"); - if (!VEC_empty (breakpoint_p, tracepoints)) + if (!tracepoints.empty ()) { int ix; struct breakpoint *b; @@ -3725,22 +3689,20 @@ print_one_static_tracepoint_marker (int count, uiout->text (extra_field_indent); uiout->text (_("Probed by static tracepoints: ")); - for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++) + for (ix = 0; ix < tracepoints.size (); ix++) { if (ix > 0) uiout->text (", "); uiout->text ("#"); - uiout->field_int ("tracepoint-id", b->number); + uiout->field_int ("tracepoint-id", tracepoints[ix]->number); } } if (uiout->is_mi_like_p ()) - uiout->field_int ("number-of-tracepoints", - VEC_length(breakpoint_p, tracepoints)); + uiout->field_int ("number-of-tracepoints", tracepoints.size ()); else uiout->text ("\n"); } - VEC_free (breakpoint_p, tracepoints); } static void -- 2.7.4