Patchwork Remove VEC(tsv_s), use std::vector instead

login
register
mail settings
Submitter Simon Marchi
Date April 7, 2018, 5 p.m.
Message ID <20180407170004.29960-1-simon.marchi@polymtl.ca>
Download mbox | patch
Permalink /patch/26640/
State New
Headers show

Comments

Simon Marchi - April 7, 2018, 5 p.m.
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.
	<name>: 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)
	<to_download_trace_state_variable>: 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(-)
Pedro Alves - April 7, 2018, 6:54 p.m.
On 04/07/2018 06:00 PM, Simon Marchi wrote:
> 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.

Cool, I have a make-target-delegates patch that makes it grok
:: and <> too, needed for target_ops C++ification.

> 
> gdb/ChangeLog:
> 
> 	* tracepoint.h (struct trace_state_variable): Add constructor.
> 	<name>: 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)
> 	<to_download_trace_state_variable>: 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.

Looks good.

Thanks,
Pedro Alves
Simon Marchi - April 9, 2018, 7:16 p.m.
On 2018-04-07 14:54, Pedro Alves wrote:
> On 04/07/2018 06:00 PM, Simon Marchi wrote:
>> 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.
> 
> Cool, I have a make-target-delegates patch that makes it grok
> :: and <> too, needed for target_ops C++ification.

Is it this one that's already pushed?

https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=10f64178412d9c6e4f2faade0da271ab8be273c9

> Looks good.

Thanks, pushed.

Simon
Pedro Alves - April 9, 2018, 7:31 p.m.
On 04/09/2018 08:16 PM, Simon Marchi wrote:
> On 2018-04-07 14:54, Pedro Alves wrote:
>>
>> Cool, I have a make-target-delegates patch that makes it grok
>> :: and <> too, needed for target_ops C++ification.
> 
> Is it this one that's already pushed?
> 
> https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;a=commit;h=10f64178412d9c6e4f2faade0da271ab8be273c9

I was thinking of this bit in the branch:

  https://github.com/palves/gdb/commit/a39c7a444261acdacc8bdbc4e9c5b21b0907d7a0#diff-bd5f3f75b082255e6f600a789d7d7970R43

but now I'm not sure whether it's still needed.  I suspect it was needed
because of the need to grok a preceding "virtual".  Bah, will need to
re-investigate.

Thanks,
Pedro Alves

Patch

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<trace_state_variable> 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> 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.  */