-trace-define-variable and -trace-list-variables.
authorVladimir Prus <vladimir@codesourcery.com>
Tue, 23 Mar 2010 21:50:11 +0000 (21:50 +0000)
committerVladimir Prus <vladimir@codesourcery.com>
Tue, 23 Mar 2010 21:50:11 +0000 (21:50 +0000)
     * tracepoint.c (create_trace_state_variable): Make
     private copy of name, as opposed to assuming the
     pointer lives forever.
     (tvariables_info_1): New.
     (tvariables_info): Use the above.
     * tracepoint.h (create_trace_state_variable, tvariables_info_1):
     Declare.
     * mi/mi-cmds.c (mi_cmds): Register -trace-define-variable
     and -trace-list-variables.
     * mi/mi-cmds.h (mi_cmd_trace_define_variable)
     (mi_cmd_trace_list_variables): New.
     * mi/mi-main.c (mi_cmd_trace_define_variable)
     (mi_cmd_trace_list_variables): New.

gdb/ChangeLog
gdb/mi/mi-cmds.c
gdb/mi/mi-cmds.h
gdb/mi/mi-main.c
gdb/tracepoint.c
gdb/tracepoint.h

index 497e4ee4275bfa552f484451f7a73d52d2f695f7..7f74fe3373161b49d158bee3643ff59ee3689d42 100644 (file)
@@ -1,3 +1,21 @@
+2010-03-24  Vladimir Prus  <vladimir@codesourcery.com>
+
+       -trace-define-variable and -trace-list-variables.
+
+       * tracepoint.c (create_trace_state_variable): Make
+       private copy of name, as opposed to assuming the
+       pointer lives forever.
+       (tvariables_info_1): New.
+       (tvariables_info): Use the above.
+       * tracepoint.h (create_trace_state_variable, tvariables_info_1):
+       Declare.
+       * mi/mi-cmds.c (mi_cmds): Register -trace-define-variable
+       and -trace-list-variables.
+       * mi/mi-cmds.h (mi_cmd_trace_define_variable)
+       (mi_cmd_trace_list_variables): New.
+       * mi/mi-main.c (mi_cmd_trace_define_variable)
+       (mi_cmd_trace_list_variables): New.
+
 2010-03-24  Vladimir Prus  <vladimir@codesourcery.com>
 
        Implement -break-passcount.
index 6b260fc5f1a0b268ba7298f0133ed690cf1eaab9..a07ee3b437251e70dfaac08bbc8ec1d07a950b90 100644 (file)
@@ -106,6 +106,8 @@ struct mi_cmd mi_cmds[] =
   { "thread-info", { NULL, 0 }, mi_cmd_thread_info },
   { "thread-list-ids", { NULL, 0 }, mi_cmd_thread_list_ids},
   { "thread-select", { NULL, 0 }, mi_cmd_thread_select},
+  { "trace-define-variable", { NULL, 0 }, mi_cmd_trace_define_variable },
+  { "trace-list-variables", { NULL, 0 }, mi_cmd_trace_list_variables },
   { "trace-start", { NULL, 0 }, mi_cmd_trace_start },
   { "trace-status", { NULL, 0 }, mi_cmd_trace_status },
   { "trace-stop", { NULL, 0 }, mi_cmd_trace_stop },
index b5ff61f952d6b71cc94e0cf58ca90110e0382047..dc2b2c6c74fccd94c75911f2eb1a3fe35100b4a3 100644 (file)
@@ -89,6 +89,8 @@ extern mi_cmd_argv_ftype mi_cmd_target_file_delete;
 extern mi_cmd_argv_ftype mi_cmd_thread_info;
 extern mi_cmd_argv_ftype mi_cmd_thread_list_ids;
 extern mi_cmd_argv_ftype mi_cmd_thread_select;
+extern mi_cmd_argv_ftype mi_cmd_trace_define_variable;
+extern mi_cmd_argv_ftype mi_cmd_trace_list_variables;
 extern mi_cmd_argv_ftype mi_cmd_trace_start;
 extern mi_cmd_argv_ftype mi_cmd_trace_status;
 extern mi_cmd_argv_ftype mi_cmd_trace_stop;
index c30e0e534976569be57cf0850de3f2ba5c05d52b..031c00608ec290dcd2e14183f27237bf3afddc17 100644 (file)
@@ -2079,6 +2079,52 @@ print_diff (struct mi_timestamp *start, struct mi_timestamp *end)
        timeval_diff (start->stime, end->stime) / 1000000.0);
   }
 
+void
+mi_cmd_trace_define_variable (char *command, char **argv, int argc)
+{
+  struct expression *expr;
+  struct cleanup *back_to;
+  LONGEST initval = 0;
+  struct trace_state_variable *tsv;
+  char *name = 0;
+
+  if (argc != 1 && argc != 2)
+    error (_("Usage: -trace-define-variable VARIABLE [VALUE]"));
+
+  expr = parse_expression (argv[0]);
+  back_to = make_cleanup (xfree, expr);
+
+  if (expr->nelts == 3 && expr->elts[0].opcode == OP_INTERNALVAR)
+    {
+      struct internalvar *intvar = expr->elts[1].internalvar;
+      if (intvar)
+       name = internalvar_name (intvar);
+    }
+
+  if (!name || *name == '\0')
+    error (_("Invalid name of trace variable"));
+
+  tsv = find_trace_state_variable (name);
+  if (!tsv)
+    tsv = create_trace_state_variable (name);
+
+  if (argc == 2)
+    initval = value_as_long (parse_and_eval (argv[1]));
+
+  tsv->initial_value = initval;
+
+  do_cleanups (back_to);
+}
+
+void
+mi_cmd_trace_list_variables (char *command, char **argv, int argc)
+{
+  if (argc != 0)
+    error (_("-trace-list-variables: no arguments are allowed"));
+
+  tvariables_info_1 ();
+}
+
 void
 mi_cmd_trace_start (char *command, char **argv, int argc)
 {
index 5fe456d9596c96d9be715dde7f4e80e2063811f7..bf5cdba38ef53945850be02378932e8b2aad4b3f 100644 (file)
@@ -276,7 +276,7 @@ create_trace_state_variable (const char *name)
   struct trace_state_variable tsv;
 
   memset (&tsv, 0, sizeof (tsv));
-  tsv.name = name;
+  tsv.name = xstrdup (name);
   tsv.number = next_tsv_number++;
   return VEC_safe_push (tsv_s, tvariables, &tsv);
 }
@@ -305,6 +305,7 @@ delete_trace_state_variable (const char *name)
   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
     if (strcmp (name, tsv->name) == 0)
       {
+       xfree ((void *)tsv->name);
        VEC_unordered_remove (tsv_s, tvariables, ix);
        return;
       }
@@ -406,17 +407,15 @@ delete_trace_variable_command (char *args, int from_tty)
   dont_repeat ();
 }
 
-/* List all the trace state variables.  */
-
-static void
-tvariables_info (char *args, int from_tty)
+void
+tvariables_info_1 (void)
 {
   struct trace_state_variable *tsv;
   int ix;
-  char *reply;
-  ULONGEST tval;
+  int count = 0;
+  struct cleanup *back_to;
 
-  if (VEC_length (tsv_s, tvariables) == 0)
+  if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
     {
       printf_filtered (_("No trace state variables.\n"));
       return;
@@ -427,24 +426,56 @@ tvariables_info (char *args, int from_tty)
     tsv->value_known = target_get_trace_state_variable_value (tsv->number,
                                                              &(tsv->value));
 
-  printf_filtered (_("Name\t\t  Initial\tCurrent\n"));
+  back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
+                                                 count, "trace-variables");
+  ui_out_table_header (uiout, 15, ui_left, "name", "Name");
+  ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
+  ui_out_table_header (uiout, 11, ui_left, "current", "Current");
+
+  ui_out_table_body (uiout);
 
   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
     {
-      printf_filtered ("$%s", tsv->name);
-      print_spaces_filtered (17 - strlen (tsv->name), gdb_stdout);
-      printf_filtered ("%s ", plongest (tsv->initial_value));
-      print_spaces_filtered (11 - strlen (plongest (tsv->initial_value)), gdb_stdout);
+      struct cleanup *back_to2;
+      char *c;
+      char *name;
+
+      back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
+
+      name = concat ("$", tsv->name, NULL);
+      make_cleanup (xfree, name);
+      ui_out_field_string (uiout, "name", name);
+      ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
+
       if (tsv->value_known)
-       printf_filtered ("  %s", plongest (tsv->value));
+        c = plongest (tsv->value);
+      else if (ui_out_is_mi_like_p (uiout))
+        /* For MI, we prefer not to use magic string constants, but rather
+           omit the field completely.  The difference between unknown and
+           undefined does not seem important enough to represent.  */
+        c = NULL;
       else if (current_trace_status ()->running || traceframe_number >= 0)
        /* The value is/was defined, but we don't have it.  */
-       printf_filtered (_("  <unknown>"));
+        c = "<unknown>";
       else
        /* It is not meaningful to ask about the value.  */
-       printf_filtered (_("  <undefined>"));
-      printf_filtered ("\n");
+        c = "<undefined>";
+      if (c)
+        ui_out_field_string (uiout, "current", c);
+      ui_out_text (uiout, "\n");
+
+      do_cleanups (back_to2);
     }
+
+  do_cleanups (back_to);
+}
+
+/* List all the trace state variables.  */
+
+static void
+tvariables_info (char *args, int from_tty)
+{
+  tvariables_info_1 ();
 }
 
 /* ACTIONS functions: */
index 2c41cfd72f08ec4800d2e49d9e9c5c6673d3c28a..ef4c8f0334814dac3e9a24300d162c37d5a3e303 100644 (file)
@@ -155,6 +155,7 @@ extern void end_actions_pseudocommand (char *args, int from_tty);
 extern void while_stepping_pseudocommand (char *args, int from_tty);
 
 extern struct trace_state_variable *find_trace_state_variable (const char *name);
+extern struct trace_state_variable *create_trace_state_variable (const char *name);
 
 extern void parse_trace_status (char *line, struct trace_status *ts);
 
@@ -174,4 +175,6 @@ extern void stop_tracing (void);
 
 extern void trace_status_mi (int on_stop);
 
+extern void tvariables_info_1 (void);
+
 #endif /* TRACEPOINT_H */