From patchwork Sat Apr 7 17:00:04 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Simon Marchi X-Patchwork-Id: 26640 Received: (qmail 59292 invoked by alias); 7 Apr 2018 17:00:29 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 59207 invoked by uid 89); 7 Apr 2018 17:00:23 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-23.4 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_NONE, SPF_SOFTFAIL, UNWANTED_LANGUAGE_BODY autolearn=ham version=3.3.2 spammy=transparent, tracing, nicer, adjusted X-HELO: barracuda.ebox.ca Received: from barracuda.ebox.ca (HELO barracuda.ebox.ca) (96.127.255.19) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 07 Apr 2018 17:00:19 +0000 X-ASG-Debug-ID: 1523120405-0c856e61898b0090001-fS2M51 Received: from smtp.ebox.ca (smtp.electronicbox.net [96.127.255.82]) by barracuda.ebox.ca with ESMTP id E3WlscltxAQct4wJ (version=TLSv1 cipher=DHE-RSA-AES256-SHA bits=256 verify=NO); Sat, 07 Apr 2018 13:00:05 -0400 (EDT) X-Barracuda-Envelope-From: simon.marchi@polymtl.ca X-Barracuda-RBL-Trusted-Forwarder: 96.127.255.82 Received: from simark.lan (unknown [192.222.164.54]) by smtp.ebox.ca (Postfix) with ESMTP id 5AEDC441D64; Sat, 7 Apr 2018 13:00:05 -0400 (EDT) From: Simon Marchi X-Barracuda-Effective-Source-IP: 192-222-164-54.qc.cable.ebox.net[192.222.164.54] X-Barracuda-Apparent-Source-IP: 192.222.164.54 X-Barracuda-RBL-IP: 192.222.164.54 To: gdb-patches@sourceware.org Cc: Simon Marchi Subject: [PATCH] Remove VEC(tsv_s), use std::vector instead Date: Sat, 7 Apr 2018 13:00:04 -0400 X-ASG-Orig-Subj: [PATCH] Remove VEC(tsv_s), use std::vector instead Message-Id: <20180407170004.29960-1-simon.marchi@polymtl.ca> X-Barracuda-Connect: smtp.electronicbox.net[96.127.255.82] X-Barracuda-Start-Time: 1523120405 X-Barracuda-Encrypted: DHE-RSA-AES256-SHA X-Barracuda-URL: https://96.127.255.19:443/cgi-mod/mark.cgi X-Barracuda-Scan-Msg-Size: 19173 X-Barracuda-BRTS-Status: 1 X-Barracuda-Spam-Score: 1.50 X-Barracuda-Spam-Status: No, SCORE=1.50 using global scores of TAG_LEVEL=1000.0 QUARANTINE_LEVEL=1000.0 KILL_LEVEL=8.0 tests=BSF_SC0_MV0713, BSF_SC0_MV0713_2 X-Barracuda-Spam-Report: Code version 3.2, rules version 3.2.3.49670 Rule breakdown below pts rule name description ---- ---------------------- -------------------------------------------------- 1.00 BSF_SC0_MV0713_2 BSF_SC0_MV0713_2 0.50 BSF_SC0_MV0713 Custom rule MV0713 X-IsSubscribed: yes This patch removes VEC(tsv_s), using an std::vector instead. I C++ified trace_state_variable a bit in the process, using std::string for the name. I also thought it would be nicer to pass a const reference to target_download_trace_state_variable, since we know it will never be NULL. This highlighted that the make-target-delegates script didn't handle references well, so I adjusted this as well. It will surely be useful in the future. gdb/ChangeLog: * tracepoint.h (struct trace_state_variable): Add constructor. : Change type to std::string. * tracepoint.c (tsv_s): Remove. (DEF_VEC_O(tsv_s)): Remove. (tvariables): Change to std::vector. (create_trace_state_variable): Adjust to std::vector. (find_trace_state_variable): Likewise. (find_trace_state_variable_by_number): Likewise. (delete_trace_state_variable): Likewise. (trace_variable_command): Adjust to std::string. (delete_trace_variable_command): Likewise. (tvariables_info_1): Adjust to std::vector. (save_trace_state_variables): Likewise. (start_tracing): Likewise. (merge_uploaded_trace_state_variables): Adjust to std::vector and std::string. * target.h (struct target_ops) : Pass reference to trace_state_variable. * target-debug.h (target_debug_print_const_trace_state_variable_r): New. * target-delegates.c: Re-generate. * mi/mi-interp.c (mi_tsv_created): Adjust to std::string. (mi_tsv_deleted): Likewise. * mi/mi-main.c (mi_cmd_trace_frame_collected): Likewise. * remote.c (remote_download_trace_state_variable): Change pointer to reference and adjust. * make-target-delegates (parse_argtypes): Handle references. (write_function_header): Likewise. (munge_type): Likewise. --- gdb/make-target-delegates | 5 ++- gdb/mi/mi-interp.c | 4 +- gdb/mi/mi-main.c | 2 +- gdb/remote.c | 10 ++--- gdb/target-debug.h | 2 + gdb/target-delegates.c | 8 ++-- gdb/target.h | 2 +- gdb/tracepoint.c | 112 +++++++++++++++++----------------------------- gdb/tracepoint.h | 40 +++++++++-------- 9 files changed, 82 insertions(+), 103 deletions(-) diff --git a/gdb/make-target-delegates b/gdb/make-target-delegates index 5f77c9df982d..bf91ddc17cfe 100755 --- a/gdb/make-target-delegates +++ b/gdb/make-target-delegates @@ -115,7 +115,7 @@ sub parse_argtypes($) { foreach $iter (@typelist) { if ($iter =~ m/^(enum\s+${SYMBOL}\s*)(${SYMBOL})?$/) { $onetype = $1; - } elsif ($iter =~ m/^(.*(enum\s+)?${SYMBOL}.*(\s|\*))${SYMBOL}+$/) { + } elsif ($iter =~ m/^(.*(enum\s+)?${SYMBOL}.*(\s|\*|&))${SYMBOL}+$/) { $onetype = $1; } elsif ($iter eq 'void') { next; @@ -151,7 +151,7 @@ sub write_function_header($$@) { $val =~ s/$TARGET_DEBUG_PRINTER//; - if ($iter !~ m,\*$,) { + if ($iter !~ m,(\*|&)$,) { $val .= ' '; } @@ -234,6 +234,7 @@ sub munge_type($) { ($result = $typename) =~ s/\s+$//; $result =~ s/[ ()<>:]/_/g; $result =~ s/[*]/p/g; + $result =~ s/&/r/g; # Identifers with double underscores are reserved to the C++ # implementation. diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index 0a9613804fc4..8bfb1298a5c1 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -760,7 +760,7 @@ mi_tsv_created (const struct trace_state_variable *tsv) fprintf_unfiltered (mi->event_channel, "tsv-created," "name=\"%s\",initial=\"%s\"\n", - tsv->name, plongest (tsv->initial_value)); + tsv->name.c_str (), plongest (tsv->initial_value)); gdb_flush (mi->event_channel); } @@ -783,7 +783,7 @@ mi_tsv_deleted (const struct trace_state_variable *tsv) if (tsv != NULL) fprintf_unfiltered (mi->event_channel, "tsv-deleted," - "name=\"%s\"\n", tsv->name); + "name=\"%s\"\n", tsv->name.c_str ()); else fprintf_unfiltered (mi->event_channel, "tsv-deleted\n"); diff --git a/gdb/mi/mi-main.c b/gdb/mi/mi-main.c index deb96b4036b1..d7354606b52c 100644 --- a/gdb/mi/mi-main.c +++ b/gdb/mi/mi-main.c @@ -2665,7 +2665,7 @@ mi_cmd_trace_frame_collected (const char *command, char **argv, int argc) if (tsv != NULL) { - uiout->field_fmt ("name", "$%s", tsv->name); + uiout->field_fmt ("name", "$%s", tsv->name.c_str ()); tsv->value_known = target_get_trace_state_variable_value (tsv->number, &tsv->value); diff --git a/gdb/remote.c b/gdb/remote.c index 68c43f831274..71a825e165b1 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -12448,18 +12448,18 @@ remote_can_download_tracepoint (struct target_ops *self) static void remote_download_trace_state_variable (struct target_ops *self, - struct trace_state_variable *tsv) + const trace_state_variable &tsv) { struct remote_state *rs = get_remote_state (); char *p; xsnprintf (rs->buf, get_remote_packet_size (), "QTDV:%x:%s:%x:", - tsv->number, phex ((ULONGEST) tsv->initial_value, 8), - tsv->builtin); + tsv.number, phex ((ULONGEST) tsv.initial_value, 8), + tsv.builtin); p = rs->buf + strlen (rs->buf); - if ((p - rs->buf) + strlen (tsv->name) * 2 >= get_remote_packet_size ()) + if ((p - rs->buf) + tsv.name.length () * 2 >= get_remote_packet_size ()) error (_("Trace state variable name too long for tsv definition packet")); - p += 2 * bin2hex ((gdb_byte *) (tsv->name), p, strlen (tsv->name)); + p += 2 * bin2hex ((gdb_byte *) (tsv.name.data ()), p, tsv.name.length ()); *p++ = '\0'; putpkt (rs->buf); remote_get_noisy_reply (); diff --git a/gdb/target-debug.h b/gdb/target-debug.h index 6465824e91b2..233e4baf1932 100644 --- a/gdb/target-debug.h +++ b/gdb/target-debug.h @@ -126,6 +126,8 @@ target_debug_do_print (host_address_to_string (X)) #define target_debug_print_struct_trace_state_variable_p(X) \ target_debug_do_print (host_address_to_string (X)) +#define target_debug_print_const_trace_state_variable_r(X) \ + target_debug_do_print (host_address_to_string (&X)) #define target_debug_print_struct_trace_status_p(X) \ target_debug_do_print (host_address_to_string (X)) #define target_debug_print_struct_breakpoint_p(X) \ diff --git a/gdb/target-delegates.c b/gdb/target-delegates.c index dd3e391fe89c..9521240efd6e 100644 --- a/gdb/target-delegates.c +++ b/gdb/target-delegates.c @@ -2687,27 +2687,27 @@ debug_can_download_tracepoint (struct target_ops *self) } static void -delegate_download_trace_state_variable (struct target_ops *self, struct trace_state_variable *arg1) +delegate_download_trace_state_variable (struct target_ops *self, const trace_state_variable &arg1) { self = self->beneath; self->to_download_trace_state_variable (self, arg1); } static void -tdefault_download_trace_state_variable (struct target_ops *self, struct trace_state_variable *arg1) +tdefault_download_trace_state_variable (struct target_ops *self, const trace_state_variable &arg1) { tcomplain (); } static void -debug_download_trace_state_variable (struct target_ops *self, struct trace_state_variable *arg1) +debug_download_trace_state_variable (struct target_ops *self, const trace_state_variable &arg1) { fprintf_unfiltered (gdb_stdlog, "-> %s->to_download_trace_state_variable (...)\n", debug_target.to_shortname); debug_target.to_download_trace_state_variable (&debug_target, arg1); fprintf_unfiltered (gdb_stdlog, "<- %s->to_download_trace_state_variable (", debug_target.to_shortname); target_debug_print_struct_target_ops_p (&debug_target); fputs_unfiltered (", ", gdb_stdlog); - target_debug_print_struct_trace_state_variable_p (arg1); + target_debug_print_const_trace_state_variable_r (arg1); fputs_unfiltered (")\n", gdb_stdlog); } diff --git a/gdb/target.h b/gdb/target.h index 51ac884e01ad..abe25258d9cb 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -960,7 +960,7 @@ struct target_ops /* Send full details of a trace state variable to the target. */ void (*to_download_trace_state_variable) (struct target_ops *, - struct trace_state_variable *tsv) + const trace_state_variable &tsv) TARGET_DEFAULT_NORETURN (tcomplain ()); /* Enable a tracepoint on the target. */ diff --git a/gdb/tracepoint.c b/gdb/tracepoint.c index 24bb91418a01..ce64eaf1386b 100644 --- a/gdb/tracepoint.c +++ b/gdb/tracepoint.c @@ -114,10 +114,7 @@ void (*deprecated_trace_start_stop_hook) (int start, int from_tty); any of these for any reason - API is by name or number only - so it works to have a vector of objects. */ -typedef struct trace_state_variable tsv_s; -DEF_VEC_O(tsv_s); - -static VEC(tsv_s) *tvariables; +static std::vector tvariables; /* The next integer to assign to a variable. */ @@ -267,12 +264,8 @@ set_traceframe_context (struct frame_info *trace_frame) struct trace_state_variable * create_trace_state_variable (const char *name) { - struct trace_state_variable tsv; - - memset (&tsv, 0, sizeof (tsv)); - tsv.name = xstrdup (name); - tsv.number = next_tsv_number++; - return VEC_safe_push (tsv_s, tvariables, &tsv); + tvariables.emplace_back (name, next_tsv_number++); + return &tvariables.back (); } /* Look for a trace state variable of the given name. */ @@ -280,12 +273,9 @@ create_trace_state_variable (const char *name) struct trace_state_variable * find_trace_state_variable (const char *name) { - struct trace_state_variable *tsv; - int ix; - - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - if (strcmp (name, tsv->name) == 0) - return tsv; + for (trace_state_variable &tsv : tvariables) + if (tsv.name == name) + return &tsv; return NULL; } @@ -296,12 +286,9 @@ find_trace_state_variable (const char *name) struct trace_state_variable * find_trace_state_variable_by_number (int number) { - struct trace_state_variable *tsv; - int ix; - - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - if (tsv->number == number) - return tsv; + for (trace_state_variable &tsv : tvariables) + if (tsv.number == number) + return &tsv; return NULL; } @@ -309,17 +296,11 @@ find_trace_state_variable_by_number (int number) static void delete_trace_state_variable (const char *name) { - struct trace_state_variable *tsv; - int ix; - - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - if (strcmp (name, tsv->name) == 0) + for (auto it = tvariables.begin (); it != tvariables.end (); it++) + if (it->name == name) { - gdb::observers::tsv_deleted.notify (tsv); - - xfree ((void *)tsv->name); - VEC_unordered_remove (tsv_s, tvariables, ix); - + gdb::observers::tsv_deleted.notify (&*it); + tvariables.erase (it); return; } @@ -394,7 +375,7 @@ trace_variable_command (const char *args, int from_tty) } printf_filtered (_("Trace state variable $%s " "now has initial value %s.\n"), - tsv->name, plongest (tsv->initial_value)); + tsv->name.c_str (), plongest (tsv->initial_value)); return; } @@ -406,7 +387,7 @@ trace_variable_command (const char *args, int from_tty) printf_filtered (_("Trace state variable $%s " "created, with initial value %s.\n"), - tsv->name, plongest (tsv->initial_value)); + tsv->name.c_str (), plongest (tsv->initial_value)); } static void @@ -415,7 +396,7 @@ delete_trace_variable_command (const char *args, int from_tty) if (args == NULL) { if (query (_("Delete all trace state variables? "))) - VEC_free (tsv_s, tvariables); + tvariables.clear (); dont_repeat (); gdb::observers::tsv_deleted.notify (NULL); return; @@ -437,41 +418,38 @@ delete_trace_variable_command (const char *args, int from_tty) void tvariables_info_1 (void) { - struct trace_state_variable *tsv; - int ix; - int count = 0; struct ui_out *uiout = current_uiout; - if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ()) + if (tvariables.empty () && !uiout->is_mi_like_p ()) { printf_filtered (_("No trace state variables.\n")); return; } /* Try to acquire values from the target. */ - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count) - tsv->value_known = target_get_trace_state_variable_value (tsv->number, - &(tsv->value)); + for (trace_state_variable &tsv : tvariables) + tsv.value_known + = target_get_trace_state_variable_value (tsv.number, &tsv.value); - ui_out_emit_table table_emitter (uiout, 3, count, "trace-variables"); + ui_out_emit_table table_emitter (uiout, 3, tvariables.size (), + "trace-variables"); uiout->table_header (15, ui_left, "name", "Name"); uiout->table_header (11, ui_left, "initial", "Initial"); uiout->table_header (11, ui_left, "current", "Current"); uiout->table_body (); - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) + for (const trace_state_variable &tsv : tvariables) { const char *c; ui_out_emit_tuple tuple_emitter (uiout, "variable"); - std::string name = std::string ("$") + tsv->name; - uiout->field_string ("name", name.c_str ()); - uiout->field_string ("initial", plongest (tsv->initial_value)); + uiout->field_string ("name", std::string ("$") + tsv.name); + uiout->field_string ("initial", plongest (tsv.initial_value)); - if (tsv->value_known) - c = plongest (tsv->value); + if (tsv.value_known) + c = plongest (tsv.value); else if (uiout->is_mi_like_p ()) /* For MI, we prefer not to use magic string constants, but rather omit the field completely. The difference between unknown and @@ -502,14 +480,11 @@ info_tvariables_command (const char *args, int from_tty) void save_trace_state_variables (struct ui_file *fp) { - struct trace_state_variable *tsv; - int ix; - - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) + for (const trace_state_variable &tsv : tvariables) { - fprintf_unfiltered (fp, "tvariable $%s", tsv->name); - if (tsv->initial_value) - fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value)); + fprintf_unfiltered (fp, "tvariable $%s", tsv.name.c_str ()); + if (tsv.initial_value) + fprintf_unfiltered (fp, " = %s", plongest (tsv.initial_value)); fprintf_unfiltered (fp, "\n"); } } @@ -1664,10 +1639,8 @@ start_tracing (const char *notes) VEC_free (breakpoint_p, tp_vec); /* Send down all the trace state variables too. */ - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - { - target_download_trace_state_variable (tsv); - } + for (const trace_state_variable &tsv : tvariables) + target_download_trace_state_variable (tsv); /* Tell target to treat text-like sections as transparent. */ target_trace_set_readonly_regions (); @@ -3302,8 +3275,8 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs) /* Most likely some numbers will have to be reassigned as part of the merge, so clear them all in anticipation. */ - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - tsv->number = 0; + for (trace_state_variable &tsv : tvariables) + tsv.number = 0; for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next) { @@ -3313,7 +3286,7 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs) if (info_verbose) printf_filtered (_("Assuming trace state variable $%s " "is same as target's variable %d.\n"), - tsv->name, utsv->number); + tsv->name.c_str (), utsv->number); } else { @@ -3321,7 +3294,7 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs) if (info_verbose) printf_filtered (_("Created trace state variable " "$%s for target's variable %d.\n"), - tsv->name, utsv->number); + tsv->name.c_str (), utsv->number); } /* Give precedence to numberings that come from the target. */ if (tsv) @@ -3330,14 +3303,13 @@ merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs) /* Renumber everything that didn't get a target-assigned number. */ highest = 0; - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - if (tsv->number > highest) - highest = tsv->number; + for (const trace_state_variable &tsv : tvariables) + highest = std::max (tsv.number, highest); ++highest; - for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix) - if (tsv->number == 0) - tsv->number = highest++; + for (trace_state_variable &tsv : tvariables) + if (tsv.number == 0) + tsv.number = highest++; free_uploaded_tsvs (uploaded_tsvs); } diff --git a/gdb/tracepoint.h b/gdb/tracepoint.h index 8613cb2dd69e..d28a039f82c8 100644 --- a/gdb/tracepoint.h +++ b/gdb/tracepoint.h @@ -47,29 +47,33 @@ typedef std::unique_ptr traceframe_info_up; tracepoints. */ struct trace_state_variable - { - /* The variable's name. The user has to prefix with a dollar sign, - but we don't store that internally. */ - const char *name; +{ + trace_state_variable (std::string &&name_, int number_) + : name (name_), number (number_) + {} - /* An id number assigned by GDB, and transmitted to targets. */ - int number; + /* The variable's name. The user has to prefix with a dollar sign, + but we don't store that internally. */ + std::string name; + + /* An id number assigned by GDB, and transmitted to targets. */ + int number = 0; - /* The initial value of a variable is a 64-bit signed integer. */ - LONGEST initial_value; + /* The initial value of a variable is a 64-bit signed integer. */ + LONGEST initial_value = 0; - /* 1 if the value is known, else 0. The value is known during a - trace run, or in tfind mode if the variable was collected into - the current trace frame. */ - int value_known; + /* 1 if the value is known, else 0. The value is known during a + trace run, or in tfind mode if the variable was collected into + the current trace frame. */ + int value_known = 0; - /* The value of a variable is a 64-bit signed integer. */ - LONGEST value; + /* The value of a variable is a 64-bit signed integer. */ + LONGEST value = 0; - /* This is true for variables that are predefined and built into - the target. */ - int builtin; - }; + /* This is true for variables that are predefined and built into + the target. */ + int builtin = 0; + }; /* The trace status encompasses various info about the general state of the tracing run. */