Make encode_actions_rsp use std::vector
[external/binutils.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3    Copyright (C) 1997-2017 Free Software Foundation, Inc.
4
5    This file is part of GDB.
6
7    This program is free software; you can redistribute it and/or modify
8    it under the terms of the GNU General Public License as published by
9    the Free Software Foundation; either version 3 of the License, or
10    (at your option) any later version.
11
12    This program is distributed in the hope that it will be useful,
13    but WITHOUT ANY WARRANTY; without even the implied warranty of
14    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
15    GNU General Public License for more details.
16
17    You should have received a copy of the GNU General Public License
18    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
19
20 #include "defs.h"
21 #include "arch-utils.h"
22 #include "symtab.h"
23 #include "frame.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "gdbcmd.h"
27 #include "value.h"
28 #include "target.h"
29 #include "target-dcache.h"
30 #include "language.h"
31 #include "inferior.h"
32 #include "breakpoint.h"
33 #include "tracepoint.h"
34 #include "linespec.h"
35 #include "regcache.h"
36 #include "completer.h"
37 #include "block.h"
38 #include "dictionary.h"
39 #include "observer.h"
40 #include "user-regs.h"
41 #include "valprint.h"
42 #include "gdbcore.h"
43 #include "objfiles.h"
44 #include "filenames.h"
45 #include "gdbthread.h"
46 #include "stack.h"
47 #include "remote.h"
48 #include "source.h"
49 #include "ax.h"
50 #include "ax-gdb.h"
51 #include "memrange.h"
52 #include "cli/cli-utils.h"
53 #include "probe.h"
54 #include "ctf.h"
55 #include "filestuff.h"
56 #include "rsp-low.h"
57 #include "tracefile.h"
58 #include "location.h"
59 #include <algorithm>
60
61 /* readline include files */
62 #include "readline/readline.h"
63 #include "readline/history.h"
64
65 /* readline defines this.  */
66 #undef savestring
67
68 #include <unistd.h>
69
70 /* Maximum length of an agent aexpression.
71    This accounts for the fact that packets are limited to 400 bytes
72    (which includes everything -- including the checksum), and assumes
73    the worst case of maximum length for each of the pieces of a
74    continuation packet.
75
76    NOTE: expressions get mem2hex'ed otherwise this would be twice as
77    large.  (400 - 31)/2 == 184 */
78 #define MAX_AGENT_EXPR_LEN      184
79
80 /* A hook used to notify the UI of tracepoint operations.  */
81
82 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
83 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
84
85 /* 
86    Tracepoint.c:
87
88    This module defines the following debugger commands:
89    trace            : set a tracepoint on a function, line, or address.
90    info trace       : list all debugger-defined tracepoints.
91    delete trace     : delete one or more tracepoints.
92    enable trace     : enable one or more tracepoints.
93    disable trace    : disable one or more tracepoints.
94    actions          : specify actions to be taken at a tracepoint.
95    passcount        : specify a pass count for a tracepoint.
96    tstart           : start a trace experiment.
97    tstop            : stop a trace experiment.
98    tstatus          : query the status of a trace experiment.
99    tfind            : find a trace frame in the trace buffer.
100    tdump            : print everything collected at the current tracepoint.
101    save-tracepoints : write tracepoint setup into a file.
102
103    This module defines the following user-visible debugger variables:
104    $trace_frame : sequence number of trace frame currently being debugged.
105    $trace_line  : source line of trace frame currently being debugged.
106    $trace_file  : source file of trace frame currently being debugged.
107    $tracepoint  : tracepoint number of trace frame currently being debugged.
108  */
109
110
111 /* ======= Important global variables: ======= */
112
113 /* The list of all trace state variables.  We don't retain pointers to
114    any of these for any reason - API is by name or number only - so it
115    works to have a vector of objects.  */
116
117 typedef struct trace_state_variable tsv_s;
118 DEF_VEC_O(tsv_s);
119
120 static VEC(tsv_s) *tvariables;
121
122 /* The next integer to assign to a variable.  */
123
124 static int next_tsv_number = 1;
125
126 /* Number of last traceframe collected.  */
127 static int traceframe_number;
128
129 /* Tracepoint for last traceframe collected.  */
130 static int tracepoint_number;
131
132 /* The traceframe info of the current traceframe.  NULL if we haven't
133    yet attempted to fetch it, or if the target does not support
134    fetching this object, or if we're not inspecting a traceframe
135    presently.  */
136 static traceframe_info_up current_traceframe_info;
137
138 /* Tracing command lists.  */
139 static struct cmd_list_element *tfindlist;
140
141 /* List of expressions to collect by default at each tracepoint hit.  */
142 char *default_collect;
143
144 static int disconnected_tracing;
145
146 /* This variable controls whether we ask the target for a linear or
147    circular trace buffer.  */
148
149 static int circular_trace_buffer;
150
151 /* This variable is the requested trace buffer size, or -1 to indicate
152    that we don't care and leave it up to the target to set a size.  */
153
154 static int trace_buffer_size = -1;
155
156 /* Textual notes applying to the current and/or future trace runs.  */
157
158 char *trace_user = NULL;
159
160 /* Textual notes applying to the current and/or future trace runs.  */
161
162 char *trace_notes = NULL;
163
164 /* Textual notes applying to the stopping of a trace.  */
165
166 char *trace_stop_notes = NULL;
167
168 /* support routines */
169
170 struct collection_list;
171 static char *mem2hex (gdb_byte *, char *, int);
172
173 static struct command_line *
174   all_tracepoint_actions_and_cleanup (struct breakpoint *t);
175
176 static struct trace_status trace_status;
177
178 const char *stop_reason_names[] = {
179   "tunknown",
180   "tnotrun",
181   "tstop",
182   "tfull",
183   "tdisconnected",
184   "tpasscount",
185   "terror"
186 };
187
188 struct trace_status *
189 current_trace_status (void)
190 {
191   return &trace_status;
192 }
193
194 /* Free and clear the traceframe info cache of the current
195    traceframe.  */
196
197 static void
198 clear_traceframe_info (void)
199 {
200   current_traceframe_info = NULL;
201 }
202
203 /* Set traceframe number to NUM.  */
204 static void
205 set_traceframe_num (int num)
206 {
207   traceframe_number = num;
208   set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
209 }
210
211 /* Set tracepoint number to NUM.  */
212 static void
213 set_tracepoint_num (int num)
214 {
215   tracepoint_number = num;
216   set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
217 }
218
219 /* Set externally visible debug variables for querying/printing
220    the traceframe context (line, function, file).  */
221
222 static void
223 set_traceframe_context (struct frame_info *trace_frame)
224 {
225   CORE_ADDR trace_pc;
226   struct symbol *traceframe_fun;
227   symtab_and_line traceframe_sal;
228
229   /* Save as globals for internal use.  */
230   if (trace_frame != NULL
231       && get_frame_pc_if_available (trace_frame, &trace_pc))
232     {
233       traceframe_sal = find_pc_line (trace_pc, 0);
234       traceframe_fun = find_pc_function (trace_pc);
235
236       /* Save linenumber as "$trace_line", a debugger variable visible to
237          users.  */
238       set_internalvar_integer (lookup_internalvar ("trace_line"),
239                                traceframe_sal.line);
240     }
241   else
242     {
243       traceframe_fun = NULL;
244       set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
245     }
246
247   /* Save func name as "$trace_func", a debugger variable visible to
248      users.  */
249   if (traceframe_fun == NULL
250       || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
251     clear_internalvar (lookup_internalvar ("trace_func"));
252   else
253     set_internalvar_string (lookup_internalvar ("trace_func"),
254                             SYMBOL_LINKAGE_NAME (traceframe_fun));
255
256   /* Save file name as "$trace_file", a debugger variable visible to
257      users.  */
258   if (traceframe_sal.symtab == NULL)
259     clear_internalvar (lookup_internalvar ("trace_file"));
260   else
261     set_internalvar_string (lookup_internalvar ("trace_file"),
262                         symtab_to_filename_for_display (traceframe_sal.symtab));
263 }
264
265 /* Create a new trace state variable with the given name.  */
266
267 struct trace_state_variable *
268 create_trace_state_variable (const char *name)
269 {
270   struct trace_state_variable tsv;
271
272   memset (&tsv, 0, sizeof (tsv));
273   tsv.name = xstrdup (name);
274   tsv.number = next_tsv_number++;
275   return VEC_safe_push (tsv_s, tvariables, &tsv);
276 }
277
278 /* Look for a trace state variable of the given name.  */
279
280 struct trace_state_variable *
281 find_trace_state_variable (const char *name)
282 {
283   struct trace_state_variable *tsv;
284   int ix;
285
286   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
287     if (strcmp (name, tsv->name) == 0)
288       return tsv;
289
290   return NULL;
291 }
292
293 /* Look for a trace state variable of the given number.  Return NULL if
294    not found.  */
295
296 struct trace_state_variable *
297 find_trace_state_variable_by_number (int number)
298 {
299   struct trace_state_variable *tsv;
300   int ix;
301
302   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
303     if (tsv->number == number)
304       return tsv;
305
306   return NULL;
307 }
308
309 static void
310 delete_trace_state_variable (const char *name)
311 {
312   struct trace_state_variable *tsv;
313   int ix;
314
315   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
316     if (strcmp (name, tsv->name) == 0)
317       {
318         observer_notify_tsv_deleted (tsv);
319
320         xfree ((void *)tsv->name);
321         VEC_unordered_remove (tsv_s, tvariables, ix);
322
323         return;
324       }
325
326   warning (_("No trace variable named \"$%s\", not deleting"), name);
327 }
328
329 /* Throws an error if NAME is not valid syntax for a trace state
330    variable's name.  */
331
332 void
333 validate_trace_state_variable_name (const char *name)
334 {
335   const char *p;
336
337   if (*name == '\0')
338     error (_("Must supply a non-empty variable name"));
339
340   /* All digits in the name is reserved for value history
341      references.  */
342   for (p = name; isdigit (*p); p++)
343     ;
344   if (*p == '\0')
345     error (_("$%s is not a valid trace state variable name"), name);
346
347   for (p = name; isalnum (*p) || *p == '_'; p++)
348     ;
349   if (*p != '\0')
350     error (_("$%s is not a valid trace state variable name"), name);
351 }
352
353 /* The 'tvariable' command collects a name and optional expression to
354    evaluate into an initial value.  */
355
356 static void
357 trace_variable_command (const char *args, int from_tty)
358 {
359   LONGEST initval = 0;
360   struct trace_state_variable *tsv;
361   const char *name_start, *p;
362
363   if (!args || !*args)
364     error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
365
366   /* Only allow two syntaxes; "$name" and "$name=value".  */
367   p = skip_spaces (args);
368
369   if (*p++ != '$')
370     error (_("Name of trace variable should start with '$'"));
371
372   name_start = p;
373   while (isalnum (*p) || *p == '_')
374     p++;
375   std::string name (name_start, p - name_start);
376
377   p = skip_spaces (p);
378   if (*p != '=' && *p != '\0')
379     error (_("Syntax must be $NAME [ = EXPR ]"));
380
381   validate_trace_state_variable_name (name.c_str ());
382
383   if (*p == '=')
384     initval = value_as_long (parse_and_eval (++p));
385
386   /* If the variable already exists, just change its initial value.  */
387   tsv = find_trace_state_variable (name.c_str ());
388   if (tsv)
389     {
390       if (tsv->initial_value != initval)
391         {
392           tsv->initial_value = initval;
393           observer_notify_tsv_modified (tsv);
394         }
395       printf_filtered (_("Trace state variable $%s "
396                          "now has initial value %s.\n"),
397                        tsv->name, plongest (tsv->initial_value));
398       return;
399     }
400
401   /* Create a new variable.  */
402   tsv = create_trace_state_variable (name.c_str ());
403   tsv->initial_value = initval;
404
405   observer_notify_tsv_created (tsv);
406
407   printf_filtered (_("Trace state variable $%s "
408                      "created, with initial value %s.\n"),
409                    tsv->name, plongest (tsv->initial_value));
410 }
411
412 static void
413 delete_trace_variable_command (const char *args, int from_tty)
414 {
415   if (args == NULL)
416     {
417       if (query (_("Delete all trace state variables? ")))
418         VEC_free (tsv_s, tvariables);
419       dont_repeat ();
420       observer_notify_tsv_deleted (NULL);
421       return;
422     }
423
424   gdb_argv argv (args);
425
426   for (char *arg : argv)
427     {
428       if (*arg == '$')
429         delete_trace_state_variable (arg + 1);
430       else
431         warning (_("Name \"%s\" not prefixed with '$', ignoring"), arg);
432     }
433
434   dont_repeat ();
435 }
436
437 void
438 tvariables_info_1 (void)
439 {
440   struct trace_state_variable *tsv;
441   int ix;
442   int count = 0;
443   struct ui_out *uiout = current_uiout;
444
445   if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ())
446     {
447       printf_filtered (_("No trace state variables.\n"));
448       return;
449     }
450
451   /* Try to acquire values from the target.  */
452   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
453     tsv->value_known = target_get_trace_state_variable_value (tsv->number,
454                                                               &(tsv->value));
455
456   ui_out_emit_table table_emitter (uiout, 3, count, "trace-variables");
457   uiout->table_header (15, ui_left, "name", "Name");
458   uiout->table_header (11, ui_left, "initial", "Initial");
459   uiout->table_header (11, ui_left, "current", "Current");
460
461   uiout->table_body ();
462
463   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
464     {
465       const char *c;
466
467       ui_out_emit_tuple tuple_emitter (uiout, "variable");
468
469       std::string name = std::string ("$") + tsv->name;
470       uiout->field_string ("name", name.c_str ());
471       uiout->field_string ("initial", plongest (tsv->initial_value));
472
473       if (tsv->value_known)
474         c = plongest (tsv->value);
475       else if (uiout->is_mi_like_p ())
476         /* For MI, we prefer not to use magic string constants, but rather
477            omit the field completely.  The difference between unknown and
478            undefined does not seem important enough to represent.  */
479         c = NULL;
480       else if (current_trace_status ()->running || traceframe_number >= 0)
481         /* The value is/was defined, but we don't have it.  */
482         c = "<unknown>";
483       else
484         /* It is not meaningful to ask about the value.  */
485         c = "<undefined>";
486       if (c)
487         uiout->field_string ("current", c);
488       uiout->text ("\n");
489     }
490 }
491
492 /* List all the trace state variables.  */
493
494 static void
495 info_tvariables_command (const char *args, int from_tty)
496 {
497   tvariables_info_1 ();
498 }
499
500 /* Stash definitions of tsvs into the given file.  */
501
502 void
503 save_trace_state_variables (struct ui_file *fp)
504 {
505   struct trace_state_variable *tsv;
506   int ix;
507
508   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
509     {
510       fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
511       if (tsv->initial_value)
512         fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
513       fprintf_unfiltered (fp, "\n");
514     }
515 }
516
517 /* ACTIONS functions: */
518
519 /* The three functions:
520    collect_pseudocommand, 
521    while_stepping_pseudocommand, and 
522    end_actions_pseudocommand
523    are placeholders for "commands" that are actually ONLY to be used
524    within a tracepoint action list.  If the actual function is ever called,
525    it means that somebody issued the "command" at the top level,
526    which is always an error.  */
527
528 static void
529 end_actions_pseudocommand (const char *args, int from_tty)
530 {
531   error (_("This command cannot be used at the top level."));
532 }
533
534 static void
535 while_stepping_pseudocommand (const char *args, int from_tty)
536 {
537   error (_("This command can only be used in a tracepoint actions list."));
538 }
539
540 static void
541 collect_pseudocommand (const char *args, int from_tty)
542 {
543   error (_("This command can only be used in a tracepoint actions list."));
544 }
545
546 static void
547 teval_pseudocommand (const char *args, int from_tty)
548 {
549   error (_("This command can only be used in a tracepoint actions list."));
550 }
551
552 /* Parse any collection options, such as /s for strings.  */
553
554 const char *
555 decode_agent_options (const char *exp, int *trace_string)
556 {
557   struct value_print_options opts;
558
559   *trace_string = 0;
560
561   if (*exp != '/')
562     return exp;
563
564   /* Call this to borrow the print elements default for collection
565      size.  */
566   get_user_print_options (&opts);
567
568   exp++;
569   if (*exp == 's')
570     {
571       if (target_supports_string_tracing ())
572         {
573           /* Allow an optional decimal number giving an explicit maximum
574              string length, defaulting it to the "print elements" value;
575              so "collect/s80 mystr" gets at most 80 bytes of string.  */
576           *trace_string = opts.print_max;
577           exp++;
578           if (*exp >= '0' && *exp <= '9')
579             *trace_string = atoi (exp);
580           while (*exp >= '0' && *exp <= '9')
581             exp++;
582         }
583       else
584         error (_("Target does not support \"/s\" option for string tracing."));
585     }
586   else
587     error (_("Undefined collection format \"%c\"."), *exp);
588
589   exp = skip_spaces (exp);
590
591   return exp;
592 }
593
594 /* Enter a list of actions for a tracepoint.  */
595 static void
596 actions_command (const char *args, int from_tty)
597 {
598   struct tracepoint *t;
599
600   t = get_tracepoint_by_number (&args, NULL);
601   if (t)
602     {
603       std::string tmpbuf =
604         string_printf ("Enter actions for tracepoint %d, one per line.",
605                        t->number);
606
607       command_line_up l = read_command_lines (&tmpbuf[0], from_tty, 1,
608                                               check_tracepoint_command, t);
609       breakpoint_set_commands (t, std::move (l));
610     }
611   /* else just return */
612 }
613
614 /* Report the results of checking the agent expression, as errors or
615    internal errors.  */
616
617 static void
618 report_agent_reqs_errors (struct agent_expr *aexpr)
619 {
620   /* All of the "flaws" are serious bytecode generation issues that
621      should never occur.  */
622   if (aexpr->flaw != agent_flaw_none)
623     internal_error (__FILE__, __LINE__, _("expression is malformed"));
624
625   /* If analysis shows a stack underflow, GDB must have done something
626      badly wrong in its bytecode generation.  */
627   if (aexpr->min_height < 0)
628     internal_error (__FILE__, __LINE__,
629                     _("expression has min height < 0"));
630
631   /* Issue this error if the stack is predicted to get too deep.  The
632      limit is rather arbitrary; a better scheme might be for the
633      target to report how much stack it will have available.  The
634      depth roughly corresponds to parenthesization, so a limit of 20
635      amounts to 20 levels of expression nesting, which is actually
636      a pretty big hairy expression.  */
637   if (aexpr->max_height > 20)
638     error (_("Expression is too complicated."));
639 }
640
641 /* worker function */
642 void
643 validate_actionline (const char *line, struct breakpoint *b)
644 {
645   struct cmd_list_element *c;
646   const char *tmp_p;
647   const char *p;
648   struct bp_location *loc;
649   struct tracepoint *t = (struct tracepoint *) b;
650
651   /* If EOF is typed, *line is NULL.  */
652   if (line == NULL)
653     return;
654
655   p = skip_spaces (line);
656
657   /* Symbol lookup etc.  */
658   if (*p == '\0')       /* empty line: just prompt for another line.  */
659     return;
660
661   if (*p == '#')                /* comment line */
662     return;
663
664   c = lookup_cmd (&p, cmdlist, "", -1, 1);
665   if (c == 0)
666     error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
667
668   if (cmd_cfunc_eq (c, collect_pseudocommand))
669     {
670       int trace_string = 0;
671
672       if (*p == '/')
673         p = decode_agent_options (p, &trace_string);
674
675       do
676         {                       /* Repeat over a comma-separated list.  */
677           QUIT;                 /* Allow user to bail out with ^C.  */
678           p = skip_spaces (p);
679
680           if (*p == '$')        /* Look for special pseudo-symbols.  */
681             {
682               if (0 == strncasecmp ("reg", p + 1, 3)
683                   || 0 == strncasecmp ("arg", p + 1, 3)
684                   || 0 == strncasecmp ("loc", p + 1, 3)
685                   || 0 == strncasecmp ("_ret", p + 1, 4)
686                   || 0 == strncasecmp ("_sdata", p + 1, 6))
687                 {
688                   p = strchr (p, ',');
689                   continue;
690                 }
691               /* else fall thru, treat p as an expression and parse it!  */
692             }
693           tmp_p = p;
694           for (loc = t->loc; loc; loc = loc->next)
695             {
696               p = tmp_p;
697               expression_up exp = parse_exp_1 (&p, loc->address,
698                                                block_for_pc (loc->address), 1);
699
700               if (exp->elts[0].opcode == OP_VAR_VALUE)
701                 {
702                   if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
703                     {
704                       error (_("constant `%s' (value %s) "
705                                "will not be collected."),
706                              SYMBOL_PRINT_NAME (exp->elts[2].symbol),
707                              plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
708                     }
709                   else if (SYMBOL_CLASS (exp->elts[2].symbol)
710                            == LOC_OPTIMIZED_OUT)
711                     {
712                       error (_("`%s' is optimized away "
713                                "and cannot be collected."),
714                              SYMBOL_PRINT_NAME (exp->elts[2].symbol));
715                     }
716                 }
717
718               /* We have something to collect, make sure that the expr to
719                  bytecode translator can handle it and that it's not too
720                  long.  */
721               agent_expr_up aexpr = gen_trace_for_expr (loc->address,
722                                                         exp.get (),
723                                                         trace_string);
724
725               if (aexpr->len > MAX_AGENT_EXPR_LEN)
726                 error (_("Expression is too complicated."));
727
728               ax_reqs (aexpr.get ());
729
730               report_agent_reqs_errors (aexpr.get ());
731             }
732         }
733       while (p && *p++ == ',');
734     }
735
736   else if (cmd_cfunc_eq (c, teval_pseudocommand))
737     {
738       do
739         {                       /* Repeat over a comma-separated list.  */
740           QUIT;                 /* Allow user to bail out with ^C.  */
741           p = skip_spaces (p);
742
743           tmp_p = p;
744           for (loc = t->loc; loc; loc = loc->next)
745             {
746               p = tmp_p;
747
748               /* Only expressions are allowed for this action.  */
749               expression_up exp = parse_exp_1 (&p, loc->address,
750                                                block_for_pc (loc->address), 1);
751
752               /* We have something to evaluate, make sure that the expr to
753                  bytecode translator can handle it and that it's not too
754                  long.  */
755               agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
756
757               if (aexpr->len > MAX_AGENT_EXPR_LEN)
758                 error (_("Expression is too complicated."));
759
760               ax_reqs (aexpr.get ());
761               report_agent_reqs_errors (aexpr.get ());
762             }
763         }
764       while (p && *p++ == ',');
765     }
766
767   else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
768     {
769       char *endp;
770
771       p = skip_spaces (p);
772       t->step_count = strtol (p, &endp, 0);
773       if (endp == p || t->step_count == 0)
774         error (_("while-stepping step count `%s' is malformed."), line);
775       p = endp;
776     }
777
778   else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
779     ;
780
781   else
782     error (_("`%s' is not a supported tracepoint action."), line);
783 }
784
785 enum {
786   memrange_absolute = -1
787 };
788
789 /* MEMRANGE functions: */
790
791 /* Compare memranges for std::sort.  */
792
793 static bool
794 memrange_comp (const memrange &a, const memrange &b)
795 {
796   if (a.type == b.type)
797     {
798       if (a.type == memrange_absolute)
799         return (bfd_vma) a.start < (bfd_vma) b.start;
800       else
801         return a.start < b.start;
802     }
803
804   return a.type < b.type;
805 }
806
807 /* Sort the memrange list using std::sort, and merge adjacent memranges.  */
808
809 static void
810 memrange_sortmerge (std::vector<memrange> &memranges)
811 {
812   if (!memranges.empty ())
813     {
814       int a, b;
815
816       std::sort (memranges.begin (), memranges.end (), memrange_comp);
817
818       for (a = 0, b = 1; b < memranges.size (); b++)
819         {
820           /* If memrange b overlaps or is adjacent to memrange a,
821              merge them.  */
822           if (memranges[a].type == memranges[b].type
823               && memranges[b].start <= memranges[a].end)
824             {
825               if (memranges[b].end > memranges[a].end)
826                 memranges[a].end = memranges[b].end;
827               continue;         /* next b, same a */
828             }
829           a++;                  /* next a */
830           if (a != b)
831             memranges[a] = memranges[b];
832         }
833       memranges.resize (a + 1);
834     }
835 }
836
837 /* Add a register to a collection list.  */
838
839 void
840 collection_list::add_register (unsigned int regno)
841 {
842   if (info_verbose)
843     printf_filtered ("collect register %d\n", regno);
844   if (regno >= (8 * sizeof (m_regs_mask)))
845     error (_("Internal: register number %d too large for tracepoint"),
846            regno);
847   m_regs_mask[regno / 8] |= 1 << (regno % 8);
848 }
849
850 /* Add a memrange to a collection list.  */
851
852 void
853 collection_list::add_memrange (struct gdbarch *gdbarch,
854                                int type, bfd_signed_vma base,
855                                unsigned long len)
856 {
857   if (info_verbose)
858     printf_filtered ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
859
860   /* type: memrange_absolute == memory, other n == basereg */
861   /* base: addr if memory, offset if reg relative.  */
862   /* len: we actually save end (base + len) for convenience */
863   m_memranges.emplace_back (type, base, base + len);
864
865   if (type != memrange_absolute)    /* Better collect the base register!  */
866     add_register (type);
867 }
868
869 /* Add a symbol to a collection list.  */
870
871 void
872 collection_list::collect_symbol (struct symbol *sym,
873                                  struct gdbarch *gdbarch,
874                                  long frame_regno, long frame_offset,
875                                  CORE_ADDR scope,
876                                  int trace_string)
877 {
878   unsigned long len;
879   unsigned int reg;
880   bfd_signed_vma offset;
881   int treat_as_expr = 0;
882
883   len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
884   switch (SYMBOL_CLASS (sym))
885     {
886     default:
887       printf_filtered ("%s: don't know symbol class %d\n",
888                        SYMBOL_PRINT_NAME (sym),
889                        SYMBOL_CLASS (sym));
890       break;
891     case LOC_CONST:
892       printf_filtered ("constant %s (value %s) will not be collected.\n",
893                        SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
894       break;
895     case LOC_STATIC:
896       offset = SYMBOL_VALUE_ADDRESS (sym);
897       if (info_verbose)
898         {
899           printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
900                            SYMBOL_PRINT_NAME (sym), len,
901                            paddress (gdbarch, offset));
902         }
903       /* A struct may be a C++ class with static fields, go to general
904          expression handling.  */
905       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
906         treat_as_expr = 1;
907       else
908         add_memrange (gdbarch, memrange_absolute, offset, len);
909       break;
910     case LOC_REGISTER:
911       reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
912       if (info_verbose)
913         printf_filtered ("LOC_REG[parm] %s: ", 
914                          SYMBOL_PRINT_NAME (sym));
915       add_register (reg);
916       /* Check for doubles stored in two registers.  */
917       /* FIXME: how about larger types stored in 3 or more regs?  */
918       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
919           len > register_size (gdbarch, reg))
920         add_register (reg + 1);
921       break;
922     case LOC_REF_ARG:
923       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
924       printf_filtered ("       (will not collect %s)\n",
925                        SYMBOL_PRINT_NAME (sym));
926       break;
927     case LOC_ARG:
928       reg = frame_regno;
929       offset = frame_offset + SYMBOL_VALUE (sym);
930       if (info_verbose)
931         {
932           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
933                            " from frame ptr reg %d\n",
934                            SYMBOL_PRINT_NAME (sym), len,
935                            paddress (gdbarch, offset), reg);
936         }
937       add_memrange (gdbarch, reg, offset, len);
938       break;
939     case LOC_REGPARM_ADDR:
940       reg = SYMBOL_VALUE (sym);
941       offset = 0;
942       if (info_verbose)
943         {
944           printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
945                            " from reg %d\n",
946                            SYMBOL_PRINT_NAME (sym), len,
947                            paddress (gdbarch, offset), reg);
948         }
949       add_memrange (gdbarch, reg, offset, len);
950       break;
951     case LOC_LOCAL:
952       reg = frame_regno;
953       offset = frame_offset + SYMBOL_VALUE (sym);
954       if (info_verbose)
955         {
956           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
957                            " from frame ptr reg %d\n",
958                            SYMBOL_PRINT_NAME (sym), len,
959                            paddress (gdbarch, offset), reg);
960         }
961       add_memrange (gdbarch, reg, offset, len);
962       break;
963
964     case LOC_UNRESOLVED:
965       treat_as_expr = 1;
966       break;
967
968     case LOC_OPTIMIZED_OUT:
969       printf_filtered ("%s has been optimized out of existence.\n",
970                        SYMBOL_PRINT_NAME (sym));
971       break;
972
973     case LOC_COMPUTED:
974       treat_as_expr = 1;
975       break;
976     }
977
978   /* Expressions are the most general case.  */
979   if (treat_as_expr)
980     {
981       agent_expr_up aexpr = gen_trace_for_var (scope, gdbarch,
982                                                sym, trace_string);
983
984       /* It can happen that the symbol is recorded as a computed
985          location, but it's been optimized away and doesn't actually
986          have a location expression.  */
987       if (!aexpr)
988         {
989           printf_filtered ("%s has been optimized out of existence.\n",
990                            SYMBOL_PRINT_NAME (sym));
991           return;
992         }
993
994       ax_reqs (aexpr.get ());
995
996       report_agent_reqs_errors (aexpr.get ());
997
998       /* Take care of the registers.  */
999       if (aexpr->reg_mask_len > 0)
1000         {
1001           for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1002             {
1003               QUIT;     /* Allow user to bail out with ^C.  */
1004               if (aexpr->reg_mask[ndx1] != 0)
1005                 {
1006                   /* Assume chars have 8 bits.  */
1007                   for (int ndx2 = 0; ndx2 < 8; ndx2++)
1008                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1009                       /* It's used -- record it.  */
1010                       add_register (ndx1 * 8 + ndx2);
1011                 }
1012             }
1013         }
1014
1015       add_aexpr (std::move (aexpr));
1016     }
1017 }
1018
1019 /* Data to be passed around in the calls to the locals and args
1020    iterators.  */
1021
1022 struct add_local_symbols_data
1023 {
1024   struct collection_list *collect;
1025   struct gdbarch *gdbarch;
1026   CORE_ADDR pc;
1027   long frame_regno;
1028   long frame_offset;
1029   int count;
1030   int trace_string;
1031 };
1032
1033 /* The callback for the locals and args iterators.  */
1034
1035 static void
1036 do_collect_symbol (const char *print_name,
1037                    struct symbol *sym,
1038                    void *cb_data)
1039 {
1040   struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
1041
1042   p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
1043                               p->frame_offset, p->pc, p->trace_string);
1044   p->count++;
1045
1046   p->collect->add_wholly_collected (print_name);
1047 }
1048
1049 void
1050 collection_list::add_wholly_collected (const char *print_name)
1051 {
1052   m_wholly_collected.push_back (print_name);
1053 }
1054
1055 /* Add all locals (or args) symbols to collection list.  */
1056
1057 void
1058 collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
1059                                     long frame_regno, long frame_offset, int type,
1060                                     int trace_string)
1061 {
1062   const struct block *block;
1063   struct add_local_symbols_data cb_data;
1064
1065   cb_data.collect = this;
1066   cb_data.gdbarch = gdbarch;
1067   cb_data.pc = pc;
1068   cb_data.frame_regno = frame_regno;
1069   cb_data.frame_offset = frame_offset;
1070   cb_data.count = 0;
1071   cb_data.trace_string = trace_string;
1072
1073   if (type == 'L')
1074     {
1075       block = block_for_pc (pc);
1076       if (block == NULL)
1077         {
1078           warning (_("Can't collect locals; "
1079                      "no symbol table info available.\n"));
1080           return;
1081         }
1082
1083       iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1084       if (cb_data.count == 0)
1085         warning (_("No locals found in scope."));
1086     }
1087   else
1088     {
1089       pc = get_pc_function_start (pc);
1090       block = block_for_pc (pc);
1091       if (block == NULL)
1092         {
1093           warning (_("Can't collect args; no symbol table info available."));
1094           return;
1095         }
1096
1097       iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1098       if (cb_data.count == 0)
1099         warning (_("No args found in scope."));
1100     }
1101 }
1102
1103 void
1104 collection_list::add_static_trace_data ()
1105 {
1106   if (info_verbose)
1107     printf_filtered ("collect static trace data\n");
1108   m_strace_data = true;
1109 }
1110
1111 collection_list::collection_list ()
1112   : m_regs_mask (),
1113     m_strace_data (false)
1114 {
1115   m_memranges.reserve (128);
1116   m_aexprs.reserve (128);
1117 }
1118
1119 /* Reduce a collection list to string form (for gdb protocol).  */
1120
1121 std::vector<std::string>
1122 collection_list::stringify ()
1123 {
1124   char temp_buf[2048];
1125   int count;
1126   char *end;
1127   long i;
1128   std::vector<std::string> str_list;
1129
1130   if (m_strace_data)
1131     {
1132       if (info_verbose)
1133         printf_filtered ("\nCollecting static trace data\n");
1134       end = temp_buf;
1135       *end++ = 'L';
1136       str_list.emplace_back (temp_buf, end - temp_buf);
1137     }
1138
1139   for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
1140     if (m_regs_mask[i] != 0)    /* Skip leading zeroes in regs_mask.  */
1141       break;
1142   if (m_regs_mask[i] != 0)      /* Prepare to send regs_mask to the stub.  */
1143     {
1144       if (info_verbose)
1145         printf_filtered ("\nCollecting registers (mask): 0x");
1146       end = temp_buf;
1147       *end++ = 'R';
1148       for (; i >= 0; i--)
1149         {
1150           QUIT;                 /* Allow user to bail out with ^C.  */
1151           if (info_verbose)
1152             printf_filtered ("%02X", m_regs_mask[i]);
1153           sprintf (end, "%02X", m_regs_mask[i]);
1154           end += 2;
1155         }
1156       str_list.emplace_back (temp_buf);
1157     }
1158   if (info_verbose)
1159     printf_filtered ("\n");
1160   if (!m_memranges.empty () && info_verbose)
1161     printf_filtered ("Collecting memranges: \n");
1162   for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
1163     {
1164       QUIT;                     /* Allow user to bail out with ^C.  */
1165       if (info_verbose)
1166         {
1167           printf_filtered ("(%d, %s, %ld)\n", 
1168                            m_memranges[i].type,
1169                            paddress (target_gdbarch (),
1170                                      m_memranges[i].start),
1171                            (long) (m_memranges[i].end
1172                                    - m_memranges[i].start));
1173         }
1174       if (count + 27 > MAX_AGENT_EXPR_LEN)
1175         {
1176           str_list.emplace_back (temp_buf, count);
1177           count = 0;
1178           end = temp_buf;
1179         }
1180
1181       {
1182         bfd_signed_vma length
1183           = m_memranges[i].end - m_memranges[i].start;
1184
1185         /* The "%X" conversion specifier expects an unsigned argument,
1186            so passing -1 (memrange_absolute) to it directly gives you
1187            "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1188            Special-case it.  */
1189         if (m_memranges[i].type == memrange_absolute)
1190           sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
1191                    (long) length);
1192         else
1193           sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
1194                    phex_nz (m_memranges[i].start, 0), (long) length);
1195       }
1196
1197       count += strlen (end);
1198       end = temp_buf + count;
1199     }
1200
1201   for (i = 0; i < m_aexprs.size (); i++)
1202     {
1203       QUIT;                     /* Allow user to bail out with ^C.  */
1204       if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
1205         {
1206           str_list.emplace_back (temp_buf, count);
1207           count = 0;
1208           end = temp_buf;
1209         }
1210       sprintf (end, "X%08X,", m_aexprs[i]->len);
1211       end += 10;                /* 'X' + 8 hex digits + ',' */
1212       count += 10;
1213
1214       end = mem2hex (m_aexprs[i]->buf, end, m_aexprs[i]->len);
1215       count += 2 * m_aexprs[i]->len;
1216     }
1217
1218   if (count != 0)
1219     {
1220       str_list.emplace_back (temp_buf, count);
1221       count = 0;
1222       end = temp_buf;
1223     }
1224
1225   return str_list;
1226 }
1227
1228 /* Add the printed expression EXP to *LIST.  */
1229
1230 void
1231 collection_list::append_exp (struct expression *exp)
1232 {
1233   string_file tmp_stream;
1234
1235   print_expression (exp, &tmp_stream);
1236
1237   m_computed.push_back (std::move (tmp_stream.string ()));
1238 }
1239
1240 void
1241 collection_list::finish ()
1242 {
1243   memrange_sortmerge (m_memranges);
1244 }
1245
1246 static void
1247 encode_actions_1 (struct command_line *action,
1248                   struct bp_location *tloc,
1249                   int frame_reg,
1250                   LONGEST frame_offset,
1251                   struct collection_list *collect,
1252                   struct collection_list *stepping_list)
1253 {
1254   const char *action_exp;
1255   int i;
1256   struct value *tempval;
1257   struct cmd_list_element *cmd;
1258
1259   for (; action; action = action->next)
1260     {
1261       QUIT;                     /* Allow user to bail out with ^C.  */
1262       action_exp = action->line;
1263       action_exp = skip_spaces (action_exp);
1264
1265       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1266       if (cmd == 0)
1267         error (_("Bad action list item: %s"), action_exp);
1268
1269       if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1270         {
1271           int trace_string = 0;
1272
1273           if (*action_exp == '/')
1274             action_exp = decode_agent_options (action_exp, &trace_string);
1275
1276           do
1277             {                   /* Repeat over a comma-separated list.  */
1278               QUIT;             /* Allow user to bail out with ^C.  */
1279               action_exp = skip_spaces (action_exp);
1280
1281               if (0 == strncasecmp ("$reg", action_exp, 4))
1282                 {
1283                   for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
1284                     collect->add_register (i);
1285                   action_exp = strchr (action_exp, ',');        /* more? */
1286                 }
1287               else if (0 == strncasecmp ("$arg", action_exp, 4))
1288                 {
1289                   collect->add_local_symbols (target_gdbarch (),
1290                                               tloc->address,
1291                                               frame_reg,
1292                                               frame_offset,
1293                                               'A',
1294                                               trace_string);
1295                   action_exp = strchr (action_exp, ',');        /* more? */
1296                 }
1297               else if (0 == strncasecmp ("$loc", action_exp, 4))
1298                 {
1299                   collect->add_local_symbols (target_gdbarch (),
1300                                               tloc->address,
1301                                               frame_reg,
1302                                               frame_offset,
1303                                               'L',
1304                                               trace_string);
1305                   action_exp = strchr (action_exp, ',');        /* more? */
1306                 }
1307               else if (0 == strncasecmp ("$_ret", action_exp, 5))
1308                 {
1309                   agent_expr_up aexpr
1310                     = gen_trace_for_return_address (tloc->address,
1311                                                     target_gdbarch (),
1312                                                     trace_string);
1313
1314                   ax_reqs (aexpr.get ());
1315                   report_agent_reqs_errors (aexpr.get ());
1316
1317                   /* take care of the registers */
1318                   if (aexpr->reg_mask_len > 0)
1319                     {
1320                       for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1321                         {
1322                           QUIT; /* allow user to bail out with ^C */
1323                           if (aexpr->reg_mask[ndx1] != 0)
1324                             {
1325                               /* assume chars have 8 bits */
1326                               for (int ndx2 = 0; ndx2 < 8; ndx2++)
1327                                 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1328                                   {
1329                                     /* It's used -- record it.  */
1330                                     collect->add_register (ndx1 * 8 + ndx2);
1331                                   }
1332                             }
1333                         }
1334                     }
1335
1336                   collect->add_aexpr (std::move (aexpr));
1337                   action_exp = strchr (action_exp, ',');        /* more? */
1338                 }
1339               else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1340                 {
1341                   collect->add_static_trace_data ();
1342                   action_exp = strchr (action_exp, ',');        /* more? */
1343                 }
1344               else
1345                 {
1346                   unsigned long addr;
1347
1348                   expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1349                                                    block_for_pc (tloc->address),
1350                                                    1);
1351
1352                   switch (exp->elts[0].opcode)
1353                     {
1354                     case OP_REGISTER:
1355                       {
1356                         const char *name = &exp->elts[2].string;
1357
1358                         i = user_reg_map_name_to_regnum (target_gdbarch (),
1359                                                          name, strlen (name));
1360                         if (i == -1)
1361                           internal_error (__FILE__, __LINE__,
1362                                           _("Register $%s not available"),
1363                                           name);
1364                         if (info_verbose)
1365                           printf_filtered ("OP_REGISTER: ");
1366                         collect->add_register (i);
1367                         break;
1368                       }
1369
1370                     case UNOP_MEMVAL:
1371                       /* Safe because we know it's a simple expression.  */
1372                       tempval = evaluate_expression (exp.get ());
1373                       addr = value_address (tempval);
1374                       /* Initialize the TYPE_LENGTH if it is a typedef.  */
1375                       check_typedef (exp->elts[1].type);
1376                       collect->add_memrange (target_gdbarch (),
1377                                              memrange_absolute, addr,
1378                                              TYPE_LENGTH (exp->elts[1].type));
1379                       collect->append_exp (exp.get ());
1380                       break;
1381
1382                     case OP_VAR_VALUE:
1383                       {
1384                         struct symbol *sym = exp->elts[2].symbol;
1385                         char_ptr name = (char_ptr) SYMBOL_NATURAL_NAME (sym);
1386
1387                         collect->collect_symbol (exp->elts[2].symbol,
1388                                                  target_gdbarch (),
1389                                                  frame_reg,
1390                                                  frame_offset,
1391                                                  tloc->address,
1392                                                  trace_string);
1393                         collect->add_wholly_collected (name);
1394                       }
1395                       break;
1396
1397                     default:    /* Full-fledged expression.  */
1398                       agent_expr_up aexpr = gen_trace_for_expr (tloc->address,
1399                                                                 exp.get (),
1400                                                                 trace_string);
1401
1402                       ax_reqs (aexpr.get ());
1403
1404                       report_agent_reqs_errors (aexpr.get ());
1405
1406                       /* Take care of the registers.  */
1407                       if (aexpr->reg_mask_len > 0)
1408                         {
1409                           for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1410                             {
1411                               QUIT;     /* Allow user to bail out with ^C.  */
1412                               if (aexpr->reg_mask[ndx1] != 0)
1413                                 {
1414                                   /* Assume chars have 8 bits.  */
1415                                   for (int ndx2 = 0; ndx2 < 8; ndx2++)
1416                                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1417                                       {
1418                                         /* It's used -- record it.  */
1419                                         collect->add_register (ndx1 * 8 + ndx2);
1420                                       }
1421                                 }
1422                             }
1423                         }
1424
1425                       collect->add_aexpr (std::move (aexpr));
1426                       collect->append_exp (exp.get ());
1427                       break;
1428                     }           /* switch */
1429                 }               /* do */
1430             }
1431           while (action_exp && *action_exp++ == ',');
1432         }                       /* if */
1433       else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1434         {
1435           do
1436             {                   /* Repeat over a comma-separated list.  */
1437               QUIT;             /* Allow user to bail out with ^C.  */
1438               action_exp = skip_spaces (action_exp);
1439
1440                 {
1441                   expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1442                                                    block_for_pc (tloc->address),
1443                                                    1);
1444
1445                   agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
1446                                                            exp.get ());
1447
1448                   ax_reqs (aexpr.get ());
1449                   report_agent_reqs_errors (aexpr.get ());
1450
1451                   /* Even though we're not officially collecting, add
1452                      to the collect list anyway.  */
1453                   collect->add_aexpr (std::move (aexpr));
1454                 }               /* do */
1455             }
1456           while (action_exp && *action_exp++ == ',');
1457         }                       /* if */
1458       else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1459         {
1460           /* We check against nested while-stepping when setting
1461              breakpoint action, so no way to run into nested
1462              here.  */
1463           gdb_assert (stepping_list);
1464
1465           encode_actions_1 (action->body_list[0], tloc, frame_reg,
1466                             frame_offset, stepping_list, NULL);
1467         }
1468       else
1469         error (_("Invalid tracepoint command '%s'"), action->line);
1470     }                           /* for */
1471 }
1472
1473 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1474    and STEPPING_LIST.  */
1475
1476 void
1477 encode_actions (struct bp_location *tloc,
1478                 struct collection_list *tracepoint_list,
1479                 struct collection_list *stepping_list)
1480 {
1481   struct command_line *actions;
1482   int frame_reg;
1483   LONGEST frame_offset;
1484
1485   gdbarch_virtual_frame_pointer (tloc->gdbarch,
1486                                  tloc->address, &frame_reg, &frame_offset);
1487
1488   actions = all_tracepoint_actions_and_cleanup (tloc->owner);
1489
1490   encode_actions_1 (actions, tloc, frame_reg, frame_offset,
1491                     tracepoint_list, stepping_list);
1492
1493   tracepoint_list->finish ();
1494   stepping_list->finish ();
1495 }
1496
1497 /* Render all actions into gdb protocol.  */
1498
1499 void
1500 encode_actions_rsp (struct bp_location *tloc,
1501                     std::vector<std::string> *tdp_actions,
1502                     std::vector<std::string> *stepping_actions)
1503 {
1504   struct collection_list tracepoint_list, stepping_list;
1505
1506   encode_actions (tloc, &tracepoint_list, &stepping_list);
1507
1508   *tdp_actions = tracepoint_list.stringify ();
1509   *stepping_actions = stepping_list.stringify ();
1510 }
1511
1512 void
1513 collection_list::add_aexpr (agent_expr_up aexpr)
1514 {
1515   m_aexprs.push_back (std::move (aexpr));
1516 }
1517
1518 static void
1519 process_tracepoint_on_disconnect (void)
1520 {
1521   VEC(breakpoint_p) *tp_vec = NULL;
1522   int ix;
1523   struct breakpoint *b;
1524   int has_pending_p = 0;
1525
1526   /* Check whether we still have pending tracepoint.  If we have, warn the
1527      user that pending tracepoint will no longer work.  */
1528   tp_vec = all_tracepoints ();
1529   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1530     {
1531       if (b->loc == NULL)
1532         {
1533           has_pending_p = 1;
1534           break;
1535         }
1536       else
1537         {
1538           struct bp_location *loc1;
1539
1540           for (loc1 = b->loc; loc1; loc1 = loc1->next)
1541             {
1542               if (loc1->shlib_disabled)
1543                 {
1544                   has_pending_p = 1;
1545                   break;
1546                 }
1547             }
1548
1549           if (has_pending_p)
1550             break;
1551         }
1552     }
1553   VEC_free (breakpoint_p, tp_vec);
1554
1555   if (has_pending_p)
1556     warning (_("Pending tracepoints will not be resolved while"
1557                " GDB is disconnected\n"));
1558 }
1559
1560 /* Reset local state of tracing.  */
1561
1562 void
1563 trace_reset_local_state (void)
1564 {
1565   set_traceframe_num (-1);
1566   set_tracepoint_num (-1);
1567   set_traceframe_context (NULL);
1568   clear_traceframe_info ();
1569 }
1570
1571 void
1572 start_tracing (const char *notes)
1573 {
1574   VEC(breakpoint_p) *tp_vec = NULL;
1575   int ix;
1576   struct breakpoint *b;
1577   struct trace_state_variable *tsv;
1578   int any_enabled = 0, num_to_download = 0;
1579   int ret;
1580
1581   tp_vec = all_tracepoints ();
1582
1583   /* No point in tracing without any tracepoints...  */
1584   if (VEC_length (breakpoint_p, tp_vec) == 0)
1585     {
1586       VEC_free (breakpoint_p, tp_vec);
1587       error (_("No tracepoints defined, not starting trace"));
1588     }
1589
1590   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1591     {
1592       if (b->enable_state == bp_enabled)
1593         any_enabled = 1;
1594
1595       if ((b->type == bp_fast_tracepoint
1596            ? may_insert_fast_tracepoints
1597            : may_insert_tracepoints))
1598         ++num_to_download;
1599       else
1600         warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1601                  (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1602     }
1603
1604   if (!any_enabled)
1605     {
1606       if (target_supports_enable_disable_tracepoint ())
1607         warning (_("No tracepoints enabled"));
1608       else
1609         {
1610           /* No point in tracing with only disabled tracepoints that
1611              cannot be re-enabled.  */
1612           VEC_free (breakpoint_p, tp_vec);
1613           error (_("No tracepoints enabled, not starting trace"));
1614         }
1615     }
1616
1617   if (num_to_download <= 0)
1618     {
1619       VEC_free (breakpoint_p, tp_vec);
1620       error (_("No tracepoints that may be downloaded, not starting trace"));
1621     }
1622
1623   target_trace_init ();
1624
1625   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1626     {
1627       struct tracepoint *t = (struct tracepoint *) b;
1628       struct bp_location *loc;
1629       int bp_location_downloaded = 0;
1630
1631       /* Clear `inserted' flag.  */
1632       for (loc = b->loc; loc; loc = loc->next)
1633         loc->inserted = 0;
1634
1635       if ((b->type == bp_fast_tracepoint
1636            ? !may_insert_fast_tracepoints
1637            : !may_insert_tracepoints))
1638         continue;
1639
1640       t->number_on_target = 0;
1641
1642       for (loc = b->loc; loc; loc = loc->next)
1643         {
1644           /* Since tracepoint locations are never duplicated, `inserted'
1645              flag should be zero.  */
1646           gdb_assert (!loc->inserted);
1647
1648           target_download_tracepoint (loc);
1649
1650           loc->inserted = 1;
1651           bp_location_downloaded = 1;
1652         }
1653
1654       t->number_on_target = b->number;
1655
1656       for (loc = b->loc; loc; loc = loc->next)
1657         if (loc->probe.probe != NULL
1658             && loc->probe.probe->pops->set_semaphore != NULL)
1659           loc->probe.probe->pops->set_semaphore (loc->probe.probe,
1660                                                  loc->probe.objfile,
1661                                                  loc->gdbarch);
1662
1663       if (bp_location_downloaded)
1664         observer_notify_breakpoint_modified (b);
1665     }
1666   VEC_free (breakpoint_p, tp_vec);
1667
1668   /* Send down all the trace state variables too.  */
1669   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1670     {
1671       target_download_trace_state_variable (tsv);
1672     }
1673   
1674   /* Tell target to treat text-like sections as transparent.  */
1675   target_trace_set_readonly_regions ();
1676   /* Set some mode flags.  */
1677   target_set_disconnected_tracing (disconnected_tracing);
1678   target_set_circular_trace_buffer (circular_trace_buffer);
1679   target_set_trace_buffer_size (trace_buffer_size);
1680
1681   if (!notes)
1682     notes = trace_notes;
1683   ret = target_set_trace_notes (trace_user, notes, NULL);
1684
1685   if (!ret && (trace_user || notes))
1686     warning (_("Target does not support trace user/notes, info ignored"));
1687
1688   /* Now insert traps and begin collecting data.  */
1689   target_trace_start ();
1690
1691   /* Reset our local state.  */
1692   trace_reset_local_state ();
1693   current_trace_status()->running = 1;
1694 }
1695
1696 /* The tstart command requests the target to start a new trace run.
1697    The command passes any arguments it has to the target verbatim, as
1698    an optional "trace note".  This is useful as for instance a warning
1699    to other users if the trace runs disconnected, and you don't want
1700    anybody else messing with the target.  */
1701
1702 static void
1703 tstart_command (const char *args, int from_tty)
1704 {
1705   dont_repeat ();       /* Like "run", dangerous to repeat accidentally.  */
1706
1707   if (current_trace_status ()->running)
1708     {
1709       if (from_tty
1710           && !query (_("A trace is running already.  Start a new run? ")))
1711         error (_("New trace run not started."));
1712     }
1713
1714   start_tracing (args);
1715 }
1716
1717 /* The tstop command stops the tracing run.  The command passes any
1718    supplied arguments to the target verbatim as a "stop note"; if the
1719    target supports trace notes, then it will be reported back as part
1720    of the trace run's status.  */
1721
1722 static void
1723 tstop_command (const char *args, int from_tty)
1724 {
1725   if (!current_trace_status ()->running)
1726     error (_("Trace is not running."));
1727
1728   stop_tracing (args);
1729 }
1730
1731 void
1732 stop_tracing (const char *note)
1733 {
1734   int ret;
1735   VEC(breakpoint_p) *tp_vec = NULL;
1736   int ix;
1737   struct breakpoint *t;
1738
1739   target_trace_stop ();
1740
1741   tp_vec = all_tracepoints ();
1742   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1743     {
1744       struct bp_location *loc;
1745
1746       if ((t->type == bp_fast_tracepoint
1747            ? !may_insert_fast_tracepoints
1748            : !may_insert_tracepoints))
1749         continue;
1750
1751       for (loc = t->loc; loc; loc = loc->next)
1752         {
1753           /* GDB can be totally absent in some disconnected trace scenarios,
1754              but we don't really care if this semaphore goes out of sync.
1755              That's why we are decrementing it here, but not taking care
1756              in other places.  */
1757           if (loc->probe.probe != NULL
1758               && loc->probe.probe->pops->clear_semaphore != NULL)
1759             loc->probe.probe->pops->clear_semaphore (loc->probe.probe,
1760                                                      loc->probe.objfile,
1761                                                      loc->gdbarch);
1762         }
1763     }
1764
1765   VEC_free (breakpoint_p, tp_vec);
1766
1767   if (!note)
1768     note = trace_stop_notes;
1769   ret = target_set_trace_notes (NULL, NULL, note);
1770
1771   if (!ret && note)
1772     warning (_("Target does not support trace notes, note ignored"));
1773
1774   /* Should change in response to reply?  */
1775   current_trace_status ()->running = 0;
1776 }
1777
1778 /* tstatus command */
1779 static void
1780 tstatus_command (const char *args, int from_tty)
1781 {
1782   struct trace_status *ts = current_trace_status ();
1783   int status, ix;
1784   VEC(breakpoint_p) *tp_vec = NULL;
1785   struct breakpoint *t;
1786   
1787   status = target_get_trace_status (ts);
1788
1789   if (status == -1)
1790     {
1791       if (ts->filename != NULL)
1792         printf_filtered (_("Using a trace file.\n"));
1793       else
1794         {
1795           printf_filtered (_("Trace can not be run on this target.\n"));
1796           return;
1797         }
1798     }
1799
1800   if (!ts->running_known)
1801     {
1802       printf_filtered (_("Run/stop status is unknown.\n"));
1803     }
1804   else if (ts->running)
1805     {
1806       printf_filtered (_("Trace is running on the target.\n"));
1807     }
1808   else
1809     {
1810       switch (ts->stop_reason)
1811         {
1812         case trace_never_run:
1813           printf_filtered (_("No trace has been run on the target.\n"));
1814           break;
1815         case trace_stop_command:
1816           if (ts->stop_desc)
1817             printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1818                              ts->stop_desc);
1819           else
1820             printf_filtered (_("Trace stopped by a tstop command.\n"));
1821           break;
1822         case trace_buffer_full:
1823           printf_filtered (_("Trace stopped because the buffer was full.\n"));
1824           break;
1825         case trace_disconnected:
1826           printf_filtered (_("Trace stopped because of disconnection.\n"));
1827           break;
1828         case tracepoint_passcount:
1829           printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1830                            ts->stopping_tracepoint);
1831           break;
1832         case tracepoint_error:
1833           if (ts->stopping_tracepoint)
1834             printf_filtered (_("Trace stopped by an "
1835                                "error (%s, tracepoint %d).\n"),
1836                              ts->stop_desc, ts->stopping_tracepoint);
1837           else
1838             printf_filtered (_("Trace stopped by an error (%s).\n"),
1839                              ts->stop_desc);
1840           break;
1841         case trace_stop_reason_unknown:
1842           printf_filtered (_("Trace stopped for an unknown reason.\n"));
1843           break;
1844         default:
1845           printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1846                            ts->stop_reason);
1847           break;
1848         }
1849     }
1850
1851   if (ts->traceframes_created >= 0
1852       && ts->traceframe_count != ts->traceframes_created)
1853     {
1854       printf_filtered (_("Buffer contains %d trace "
1855                          "frames (of %d created total).\n"),
1856                        ts->traceframe_count, ts->traceframes_created);
1857     }
1858   else if (ts->traceframe_count >= 0)
1859     {
1860       printf_filtered (_("Collected %d trace frames.\n"),
1861                        ts->traceframe_count);
1862     }
1863
1864   if (ts->buffer_free >= 0)
1865     {
1866       if (ts->buffer_size >= 0)
1867         {
1868           printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1869                            ts->buffer_free, ts->buffer_size);
1870           if (ts->buffer_size > 0)
1871             printf_filtered (_(" (%d%% full)"),
1872                              ((int) ((((long long) (ts->buffer_size
1873                                                     - ts->buffer_free)) * 100)
1874                                      / ts->buffer_size)));
1875           printf_filtered (_(".\n"));
1876         }
1877       else
1878         printf_filtered (_("Trace buffer has %d bytes free.\n"),
1879                          ts->buffer_free);
1880     }
1881
1882   if (ts->disconnected_tracing)
1883     printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1884   else
1885     printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1886
1887   if (ts->circular_buffer)
1888     printf_filtered (_("Trace buffer is circular.\n"));
1889
1890   if (ts->user_name && strlen (ts->user_name) > 0)
1891     printf_filtered (_("Trace user is %s.\n"), ts->user_name);
1892
1893   if (ts->notes && strlen (ts->notes) > 0)
1894     printf_filtered (_("Trace notes: %s.\n"), ts->notes);
1895
1896   /* Now report on what we're doing with tfind.  */
1897   if (traceframe_number >= 0)
1898     printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1899                      traceframe_number, tracepoint_number);
1900   else
1901     printf_filtered (_("Not looking at any trace frame.\n"));
1902
1903   /* Report start/stop times if supplied.  */
1904   if (ts->start_time)
1905     {
1906       if (ts->stop_time)
1907         {
1908           LONGEST run_time = ts->stop_time - ts->start_time;
1909
1910           /* Reporting a run time is more readable than two long numbers.  */
1911           printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1912                            (long int) (ts->start_time / 1000000),
1913                            (long int) (ts->start_time % 1000000),
1914                            (long int) (run_time / 1000000),
1915                            (long int) (run_time % 1000000));
1916         }
1917       else
1918         printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
1919                          (long int) (ts->start_time / 1000000),
1920                          (long int) (ts->start_time % 1000000));
1921     }
1922   else if (ts->stop_time)
1923     printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
1924                      (long int) (ts->stop_time / 1000000),
1925                      (long int) (ts->stop_time % 1000000));
1926
1927   /* Now report any per-tracepoint status available.  */
1928   tp_vec = all_tracepoints ();
1929
1930   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1931     target_get_tracepoint_status (t, NULL);
1932
1933   VEC_free (breakpoint_p, tp_vec);
1934 }
1935
1936 /* Report the trace status to uiout, in a way suitable for MI, and not
1937    suitable for CLI.  If ON_STOP is true, suppress a few fields that
1938    are not meaningful in the -trace-stop response.
1939
1940    The implementation is essentially parallel to trace_status_command, but
1941    merging them will result in unreadable code.  */
1942 void
1943 trace_status_mi (int on_stop)
1944 {
1945   struct ui_out *uiout = current_uiout;
1946   struct trace_status *ts = current_trace_status ();
1947   int status;
1948
1949   status = target_get_trace_status (ts);
1950
1951   if (status == -1 && ts->filename == NULL)
1952     {
1953       uiout->field_string ("supported", "0");
1954       return;
1955     }
1956
1957   if (ts->filename != NULL)
1958     uiout->field_string ("supported", "file");
1959   else if (!on_stop)
1960     uiout->field_string ("supported", "1");
1961
1962   if (ts->filename != NULL)
1963     uiout->field_string ("trace-file", ts->filename);
1964
1965   gdb_assert (ts->running_known);
1966
1967   if (ts->running)
1968     {
1969       uiout->field_string ("running", "1");
1970
1971       /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1972          Given that the frontend gets the status either on -trace-stop, or from
1973          -trace-status after re-connection, it does not seem like this
1974          information is necessary for anything.  It is not necessary for either
1975          figuring the vital state of the target nor for navigation of trace
1976          frames.  If the frontend wants to show the current state is some
1977          configure dialog, it can request the value when such dialog is
1978          invoked by the user.  */
1979     }
1980   else
1981     {
1982       const char *stop_reason = NULL;
1983       int stopping_tracepoint = -1;
1984
1985       if (!on_stop)
1986         uiout->field_string ("running", "0");
1987
1988       if (ts->stop_reason != trace_stop_reason_unknown)
1989         {
1990           switch (ts->stop_reason)
1991             {
1992             case trace_stop_command:
1993               stop_reason = "request";
1994               break;
1995             case trace_buffer_full:
1996               stop_reason = "overflow";
1997               break;
1998             case trace_disconnected:
1999               stop_reason = "disconnection";
2000               break;
2001             case tracepoint_passcount:
2002               stop_reason = "passcount";
2003               stopping_tracepoint = ts->stopping_tracepoint;
2004               break;
2005             case tracepoint_error:
2006               stop_reason = "error";
2007               stopping_tracepoint = ts->stopping_tracepoint;
2008               break;
2009             }
2010           
2011           if (stop_reason)
2012             {
2013               uiout->field_string ("stop-reason", stop_reason);
2014               if (stopping_tracepoint != -1)
2015                 uiout->field_int ("stopping-tracepoint",
2016                                   stopping_tracepoint);
2017               if (ts->stop_reason == tracepoint_error)
2018                 uiout->field_string ("error-description",
2019                                      ts->stop_desc);
2020             }
2021         }
2022     }
2023
2024   if (ts->traceframe_count != -1)
2025     uiout->field_int ("frames", ts->traceframe_count);
2026   if (ts->traceframes_created != -1)
2027     uiout->field_int ("frames-created", ts->traceframes_created);
2028   if (ts->buffer_size != -1)
2029     uiout->field_int ("buffer-size", ts->buffer_size);
2030   if (ts->buffer_free != -1)
2031     uiout->field_int ("buffer-free", ts->buffer_free);
2032
2033   uiout->field_int ("disconnected",  ts->disconnected_tracing);
2034   uiout->field_int ("circular",  ts->circular_buffer);
2035
2036   uiout->field_string ("user-name", ts->user_name);
2037   uiout->field_string ("notes", ts->notes);
2038
2039   {
2040     char buf[100];
2041
2042     xsnprintf (buf, sizeof buf, "%ld.%06ld",
2043                (long int) (ts->start_time / 1000000),
2044                (long int) (ts->start_time % 1000000));
2045     uiout->field_string ("start-time", buf);
2046     xsnprintf (buf, sizeof buf, "%ld.%06ld",
2047                (long int) (ts->stop_time / 1000000),
2048                (long int) (ts->stop_time % 1000000));
2049     uiout->field_string ("stop-time", buf);
2050   }
2051 }
2052
2053 /* Check if a trace run is ongoing.  If so, and FROM_TTY, query the
2054    user if she really wants to detach.  */
2055
2056 void
2057 query_if_trace_running (int from_tty)
2058 {
2059   if (!from_tty)
2060     return;
2061
2062   /* It can happen that the target that was tracing went away on its
2063      own, and we didn't notice.  Get a status update, and if the
2064      current target doesn't even do tracing, then assume it's not
2065      running anymore.  */
2066   if (target_get_trace_status (current_trace_status ()) < 0)
2067     current_trace_status ()->running = 0;
2068
2069   /* If running interactively, give the user the option to cancel and
2070      then decide what to do differently with the run.  Scripts are
2071      just going to disconnect and let the target deal with it,
2072      according to how it's been instructed previously via
2073      disconnected-tracing.  */
2074   if (current_trace_status ()->running)
2075     {
2076       process_tracepoint_on_disconnect ();
2077
2078       if (current_trace_status ()->disconnected_tracing)
2079         {
2080           if (!query (_("Trace is running and will "
2081                         "continue after detach; detach anyway? ")))
2082             error (_("Not confirmed."));
2083         }
2084       else
2085         {
2086           if (!query (_("Trace is running but will "
2087                         "stop on detach; detach anyway? ")))
2088             error (_("Not confirmed."));
2089         }
2090     }
2091 }
2092
2093 /* This function handles the details of what to do about an ongoing
2094    tracing run if the user has asked to detach or otherwise disconnect
2095    from the target.  */
2096
2097 void
2098 disconnect_tracing (void)
2099 {
2100   /* Also we want to be out of tfind mode, otherwise things can get
2101      confusing upon reconnection.  Just use these calls instead of
2102      full tfind_1 behavior because we're in the middle of detaching,
2103      and there's no point to updating current stack frame etc.  */
2104   trace_reset_local_state ();
2105 }
2106
2107 /* Worker function for the various flavors of the tfind command.  */
2108 void
2109 tfind_1 (enum trace_find_type type, int num,
2110          CORE_ADDR addr1, CORE_ADDR addr2,
2111          int from_tty)
2112 {
2113   int target_frameno = -1, target_tracept = -1;
2114   struct frame_id old_frame_id = null_frame_id;
2115   struct tracepoint *tp;
2116   struct ui_out *uiout = current_uiout;
2117
2118   /* Only try to get the current stack frame if we have a chance of
2119      succeeding.  In particular, if we're trying to get a first trace
2120      frame while all threads are running, it's not going to succeed,
2121      so leave it with a default value and let the frame comparison
2122      below (correctly) decide to print out the source location of the
2123      trace frame.  */
2124   if (!(type == tfind_number && num == -1)
2125       && (has_stack_frames () || traceframe_number >= 0))
2126     old_frame_id = get_frame_id (get_current_frame ());
2127
2128   target_frameno = target_trace_find (type, num, addr1, addr2,
2129                                       &target_tracept);
2130   
2131   if (type == tfind_number
2132       && num == -1
2133       && target_frameno == -1)
2134     {
2135       /* We told the target to get out of tfind mode, and it did.  */
2136     }
2137   else if (target_frameno == -1)
2138     {
2139       /* A request for a non-existent trace frame has failed.
2140          Our response will be different, depending on FROM_TTY:
2141
2142          If FROM_TTY is true, meaning that this command was 
2143          typed interactively by the user, then give an error
2144          and DO NOT change the state of traceframe_number etc.
2145
2146          However if FROM_TTY is false, meaning that we're either
2147          in a script, a loop, or a user-defined command, then 
2148          DON'T give an error, but DO change the state of
2149          traceframe_number etc. to invalid.
2150
2151          The rationalle is that if you typed the command, you
2152          might just have committed a typo or something, and you'd
2153          like to NOT lose your current debugging state.  However
2154          if you're in a user-defined command or especially in a
2155          loop, then you need a way to detect that the command
2156          failed WITHOUT aborting.  This allows you to write
2157          scripts that search thru the trace buffer until the end,
2158          and then continue on to do something else.  */
2159   
2160       if (from_tty)
2161         error (_("Target failed to find requested trace frame."));
2162       else
2163         {
2164           if (info_verbose)
2165             printf_filtered ("End of trace buffer.\n");
2166 #if 0 /* dubious now?  */
2167           /* The following will not recurse, since it's
2168              special-cased.  */
2169           tfind_command ("-1", from_tty);
2170 #endif
2171         }
2172     }
2173   
2174   tp = get_tracepoint_by_number_on_target (target_tracept);
2175
2176   reinit_frame_cache ();
2177   target_dcache_invalidate ();
2178
2179   set_tracepoint_num (tp ? tp->number : target_tracept);
2180
2181   if (target_frameno != get_traceframe_number ())
2182     observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2183
2184   set_current_traceframe (target_frameno);
2185
2186   if (target_frameno == -1)
2187     set_traceframe_context (NULL);
2188   else
2189     set_traceframe_context (get_current_frame ());
2190
2191   if (traceframe_number >= 0)
2192     {
2193       /* Use different branches for MI and CLI to make CLI messages
2194          i18n-eable.  */
2195       if (uiout->is_mi_like_p ())
2196         {
2197           uiout->field_string ("found", "1");
2198           uiout->field_int ("tracepoint", tracepoint_number);
2199           uiout->field_int ("traceframe", traceframe_number);
2200         }
2201       else
2202         {
2203           printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2204                              traceframe_number, tracepoint_number);
2205         }
2206     }
2207   else
2208     {
2209       if (uiout->is_mi_like_p ())
2210         uiout->field_string ("found", "0");
2211       else if (type == tfind_number && num == -1)
2212         printf_unfiltered (_("No longer looking at any trace frame\n"));
2213       else /* This case may never occur, check.  */
2214         printf_unfiltered (_("No trace frame found\n"));
2215     }
2216
2217   /* If we're in nonstop mode and getting out of looking at trace
2218      frames, there won't be any current frame to go back to and
2219      display.  */
2220   if (from_tty
2221       && (has_stack_frames () || traceframe_number >= 0))
2222     {
2223       enum print_what print_what;
2224
2225       /* NOTE: in imitation of the step command, try to determine
2226          whether we have made a transition from one function to
2227          another.  If so, we'll print the "stack frame" (ie. the new
2228          function and it's arguments) -- otherwise we'll just show the
2229          new source line.  */
2230
2231       if (frame_id_eq (old_frame_id,
2232                        get_frame_id (get_current_frame ())))
2233         print_what = SRC_LINE;
2234       else
2235         print_what = SRC_AND_LOC;
2236
2237       print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
2238       do_displays ();
2239     }
2240 }
2241
2242 /* Error on looking at traceframes while trace is running.  */
2243
2244 void
2245 check_trace_running (struct trace_status *status)
2246 {
2247   if (status->running && status->filename == NULL)
2248     error (_("May not look at trace frames while trace is running."));
2249 }
2250
2251 /* trace_find_command takes a trace frame number n, 
2252    sends "QTFrame:<n>" to the target, 
2253    and accepts a reply that may contain several optional pieces
2254    of information: a frame number, a tracepoint number, and an
2255    indication of whether this is a trap frame or a stepping frame.
2256
2257    The minimal response is just "OK" (which indicates that the 
2258    target does not give us a frame number or a tracepoint number).
2259    Instead of that, the target may send us a string containing
2260    any combination of:
2261    F<hexnum>    (gives the selected frame number)
2262    T<hexnum>    (gives the selected tracepoint number)
2263  */
2264
2265 /* tfind command */
2266 static void
2267 tfind_command_1 (const char *args, int from_tty)
2268 { /* This should only be called with a numeric argument.  */
2269   int frameno = -1;
2270
2271   check_trace_running (current_trace_status ());
2272   
2273   if (args == 0 || *args == 0)
2274     { /* TFIND with no args means find NEXT trace frame.  */
2275       if (traceframe_number == -1)
2276         frameno = 0;    /* "next" is first one.  */
2277         else
2278         frameno = traceframe_number + 1;
2279     }
2280   else if (0 == strcmp (args, "-"))
2281     {
2282       if (traceframe_number == -1)
2283         error (_("not debugging trace buffer"));
2284       else if (from_tty && traceframe_number == 0)
2285         error (_("already at start of trace buffer"));
2286       
2287       frameno = traceframe_number - 1;
2288       }
2289   /* A hack to work around eval's need for fp to have been collected.  */
2290   else if (0 == strcmp (args, "-1"))
2291     frameno = -1;
2292   else
2293     frameno = parse_and_eval_long (args);
2294
2295   if (frameno < -1)
2296     error (_("invalid input (%d is less than zero)"), frameno);
2297
2298   tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2299 }
2300
2301 static void
2302 tfind_command (const char *args, int from_tty)
2303 {
2304   tfind_command_1 (args, from_tty);
2305 }
2306
2307 /* tfind end */
2308 static void
2309 tfind_end_command (const char *args, int from_tty)
2310 {
2311   tfind_command_1 ("-1", from_tty);
2312 }
2313
2314 /* tfind start */
2315 static void
2316 tfind_start_command (const char *args, int from_tty)
2317 {
2318   tfind_command_1 ("0", from_tty);
2319 }
2320
2321 /* tfind pc command */
2322 static void
2323 tfind_pc_command (const char *args, int from_tty)
2324 {
2325   CORE_ADDR pc;
2326
2327   check_trace_running (current_trace_status ());
2328
2329   if (args == 0 || *args == 0)
2330     pc = regcache_read_pc (get_current_regcache ());
2331   else
2332     pc = parse_and_eval_address (args);
2333
2334   tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2335 }
2336
2337 /* tfind tracepoint command */
2338 static void
2339 tfind_tracepoint_command (const char *args, int from_tty)
2340 {
2341   int tdp;
2342   struct tracepoint *tp;
2343
2344   check_trace_running (current_trace_status ());
2345
2346   if (args == 0 || *args == 0)
2347     {
2348       if (tracepoint_number == -1)
2349         error (_("No current tracepoint -- please supply an argument."));
2350       else
2351         tdp = tracepoint_number;        /* Default is current TDP.  */
2352     }
2353   else
2354     tdp = parse_and_eval_long (args);
2355
2356   /* If we have the tracepoint on hand, use the number that the
2357      target knows about (which may be different if we disconnected
2358      and reconnected).  */
2359   tp = get_tracepoint (tdp);
2360   if (tp)
2361     tdp = tp->number_on_target;
2362
2363   tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2364 }
2365
2366 /* TFIND LINE command:
2367
2368    This command will take a sourceline for argument, just like BREAK
2369    or TRACE (ie. anything that "decode_line_1" can handle).
2370
2371    With no argument, this command will find the next trace frame 
2372    corresponding to a source line OTHER THAN THE CURRENT ONE.  */
2373
2374 static void
2375 tfind_line_command (const char *args, int from_tty)
2376 {
2377   check_trace_running (current_trace_status ());
2378
2379   symtab_and_line sal;
2380   if (args == 0 || *args == 0)
2381     {
2382       sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2383     }
2384   else
2385     {
2386       std::vector<symtab_and_line> sals
2387         = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2388       sal = sals[0];
2389     }
2390
2391   if (sal.symtab == 0)
2392     error (_("No line number information available."));
2393
2394   CORE_ADDR start_pc, end_pc;
2395   if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2396     {
2397       if (start_pc == end_pc)
2398         {
2399           printf_filtered ("Line %d of \"%s\"",
2400                            sal.line,
2401                            symtab_to_filename_for_display (sal.symtab));
2402           wrap_here ("  ");
2403           printf_filtered (" is at address ");
2404           print_address (get_current_arch (), start_pc, gdb_stdout);
2405           wrap_here ("  ");
2406           printf_filtered (" but contains no code.\n");
2407           sal = find_pc_line (start_pc, 0);
2408           if (sal.line > 0
2409               && find_line_pc_range (sal, &start_pc, &end_pc)
2410               && start_pc != end_pc)
2411             printf_filtered ("Attempting to find line %d instead.\n",
2412                              sal.line);
2413           else
2414             error (_("Cannot find a good line."));
2415         }
2416       }
2417     else
2418     /* Is there any case in which we get here, and have an address
2419        which the user would want to see?  If we have debugging
2420        symbols and no line numbers?  */
2421     error (_("Line number %d is out of range for \"%s\"."),
2422            sal.line, symtab_to_filename_for_display (sal.symtab));
2423
2424   /* Find within range of stated line.  */
2425   if (args && *args)
2426     tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2427   else
2428     tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2429 }
2430
2431 /* tfind range command */
2432 static void
2433 tfind_range_command (const char *args, int from_tty)
2434 {
2435   static CORE_ADDR start, stop;
2436   const char *tmp;
2437
2438   check_trace_running (current_trace_status ());
2439
2440   if (args == 0 || *args == 0)
2441     { /* XXX FIXME: what should default behavior be?  */
2442       printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2443       return;
2444     }
2445
2446   if (0 != (tmp = strchr (args, ',')))
2447     {
2448       std::string start_addr (args, tmp);
2449       ++tmp;
2450       tmp = skip_spaces (tmp);
2451       start = parse_and_eval_address (start_addr.c_str ());
2452       stop = parse_and_eval_address (tmp);
2453     }
2454   else
2455     {                   /* No explicit end address?  */
2456       start = parse_and_eval_address (args);
2457       stop = start + 1; /* ??? */
2458     }
2459
2460   tfind_1 (tfind_range, 0, start, stop, from_tty);
2461 }
2462
2463 /* tfind outside command */
2464 static void
2465 tfind_outside_command (const char *args, int from_tty)
2466 {
2467   CORE_ADDR start, stop;
2468   const char *tmp;
2469
2470   if (current_trace_status ()->running
2471       && current_trace_status ()->filename == NULL)
2472     error (_("May not look at trace frames while trace is running."));
2473
2474   if (args == 0 || *args == 0)
2475     { /* XXX FIXME: what should default behavior be?  */
2476       printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2477       return;
2478     }
2479
2480   if (0 != (tmp = strchr (args, ',')))
2481     {
2482       std::string start_addr (args, tmp);
2483       ++tmp;
2484       tmp = skip_spaces (tmp);
2485       start = parse_and_eval_address (start_addr.c_str ());
2486       stop = parse_and_eval_address (tmp);
2487     }
2488   else
2489     {                   /* No explicit end address?  */
2490       start = parse_and_eval_address (args);
2491       stop = start + 1; /* ??? */
2492     }
2493
2494   tfind_1 (tfind_outside, 0, start, stop, from_tty);
2495 }
2496
2497 /* info scope command: list the locals for a scope.  */
2498 static void
2499 info_scope_command (const char *args_in, int from_tty)
2500 {
2501   struct symbol *sym;
2502   struct bound_minimal_symbol msym;
2503   const struct block *block;
2504   const char *symname;
2505   const char *save_args = args_in;
2506   struct block_iterator iter;
2507   int j, count = 0;
2508   struct gdbarch *gdbarch;
2509   int regno;
2510   const char *args = args_in;
2511
2512   if (args == 0 || *args == 0)
2513     error (_("requires an argument (function, "
2514              "line or *addr) to define a scope"));
2515
2516   event_location_up location = string_to_event_location (&args,
2517                                                          current_language);
2518   std::vector<symtab_and_line> sals
2519     = decode_line_1 (location.get (), DECODE_LINE_FUNFIRSTLINE,
2520                      NULL, NULL, 0);
2521   if (sals.empty ())
2522     {
2523       /* Presumably decode_line_1 has already warned.  */
2524       return;
2525     }
2526
2527   /* Resolve line numbers to PC.  */
2528   resolve_sal_pc (&sals[0]);
2529   block = block_for_pc (sals[0].pc);
2530
2531   while (block != 0)
2532     {
2533       QUIT;                     /* Allow user to bail out with ^C.  */
2534       ALL_BLOCK_SYMBOLS (block, iter, sym)
2535         {
2536           QUIT;                 /* Allow user to bail out with ^C.  */
2537           if (count == 0)
2538             printf_filtered ("Scope for %s:\n", save_args);
2539           count++;
2540
2541           symname = SYMBOL_PRINT_NAME (sym);
2542           if (symname == NULL || *symname == '\0')
2543             continue;           /* Probably botched, certainly useless.  */
2544
2545           gdbarch = symbol_arch (sym);
2546
2547           printf_filtered ("Symbol %s is ", symname);
2548
2549           if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2550             SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2551                                                           BLOCK_START (block),
2552                                                           gdb_stdout);
2553           else
2554             {
2555               switch (SYMBOL_CLASS (sym))
2556                 {
2557                 default:
2558                 case LOC_UNDEF: /* Messed up symbol?  */
2559                   printf_filtered ("a bogus symbol, class %d.\n",
2560                                    SYMBOL_CLASS (sym));
2561                   count--;              /* Don't count this one.  */
2562                   continue;
2563                 case LOC_CONST:
2564                   printf_filtered ("a constant with value %s (%s)",
2565                                    plongest (SYMBOL_VALUE (sym)),
2566                                    hex_string (SYMBOL_VALUE (sym)));
2567                   break;
2568                 case LOC_CONST_BYTES:
2569                   printf_filtered ("constant bytes: ");
2570                   if (SYMBOL_TYPE (sym))
2571                     for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2572                       fprintf_filtered (gdb_stdout, " %02x",
2573                                         (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2574                   break;
2575                 case LOC_STATIC:
2576                   printf_filtered ("in static storage at address ");
2577                   printf_filtered ("%s", paddress (gdbarch,
2578                                                    SYMBOL_VALUE_ADDRESS (sym)));
2579                   break;
2580                 case LOC_REGISTER:
2581                   /* GDBARCH is the architecture associated with the objfile
2582                      the symbol is defined in; the target architecture may be
2583                      different, and may provide additional registers.  However,
2584                      we do not know the target architecture at this point.
2585                      We assume the objfile architecture will contain all the
2586                      standard registers that occur in debug info in that
2587                      objfile.  */
2588                   regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2589                                                                       gdbarch);
2590
2591                   if (SYMBOL_IS_ARGUMENT (sym))
2592                     printf_filtered ("an argument in register $%s",
2593                                      gdbarch_register_name (gdbarch, regno));
2594                   else
2595                     printf_filtered ("a local variable in register $%s",
2596                                      gdbarch_register_name (gdbarch, regno));
2597                   break;
2598                 case LOC_ARG:
2599                   printf_filtered ("an argument at stack/frame offset %s",
2600                                    plongest (SYMBOL_VALUE (sym)));
2601                   break;
2602                 case LOC_LOCAL:
2603                   printf_filtered ("a local variable at frame offset %s",
2604                                    plongest (SYMBOL_VALUE (sym)));
2605                   break;
2606                 case LOC_REF_ARG:
2607                   printf_filtered ("a reference argument at offset %s",
2608                                    plongest (SYMBOL_VALUE (sym)));
2609                   break;
2610                 case LOC_REGPARM_ADDR:
2611                   /* Note comment at LOC_REGISTER.  */
2612                   regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2613                                                                       gdbarch);
2614                   printf_filtered ("the address of an argument, in register $%s",
2615                                    gdbarch_register_name (gdbarch, regno));
2616                   break;
2617                 case LOC_TYPEDEF:
2618                   printf_filtered ("a typedef.\n");
2619                   continue;
2620                 case LOC_LABEL:
2621                   printf_filtered ("a label at address ");
2622                   printf_filtered ("%s", paddress (gdbarch,
2623                                                    SYMBOL_VALUE_ADDRESS (sym)));
2624                   break;
2625                 case LOC_BLOCK:
2626                   printf_filtered ("a function at address ");
2627                   printf_filtered ("%s",
2628                                    paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2629                   break;
2630                 case LOC_UNRESOLVED:
2631                   msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2632                                                 NULL, NULL);
2633                   if (msym.minsym == NULL)
2634                     printf_filtered ("Unresolved Static");
2635                   else
2636                     {
2637                       printf_filtered ("static storage at address ");
2638                       printf_filtered ("%s",
2639                                        paddress (gdbarch,
2640                                                  BMSYMBOL_VALUE_ADDRESS (msym)));
2641                     }
2642                   break;
2643                 case LOC_OPTIMIZED_OUT:
2644                   printf_filtered ("optimized out.\n");
2645                   continue;
2646                 case LOC_COMPUTED:
2647                   gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2648                 }
2649             }
2650           if (SYMBOL_TYPE (sym))
2651             printf_filtered (", length %d.\n",
2652                              TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2653         }
2654       if (BLOCK_FUNCTION (block))
2655         break;
2656       else
2657         block = BLOCK_SUPERBLOCK (block);
2658     }
2659   if (count <= 0)
2660     printf_filtered ("Scope for %s contains no locals or arguments.\n",
2661                      save_args);
2662 }
2663
2664 /* Helper for trace_dump_command.  Dump the action list starting at
2665    ACTION.  STEPPING_ACTIONS is true if we're iterating over the
2666    actions of the body of a while-stepping action.  STEPPING_FRAME is
2667    set if the current traceframe was determined to be a while-stepping
2668    traceframe.  */
2669
2670 static void
2671 trace_dump_actions (struct command_line *action,
2672                     int stepping_actions, int stepping_frame,
2673                     int from_tty)
2674 {
2675   const char *action_exp, *next_comma;
2676
2677   for (; action != NULL; action = action->next)
2678     {
2679       struct cmd_list_element *cmd;
2680
2681       QUIT;                     /* Allow user to bail out with ^C.  */
2682       action_exp = action->line;
2683       action_exp = skip_spaces (action_exp);
2684
2685       /* The collection actions to be done while stepping are
2686          bracketed by the commands "while-stepping" and "end".  */
2687
2688       if (*action_exp == '#')   /* comment line */
2689         continue;
2690
2691       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2692       if (cmd == 0)
2693         error (_("Bad action list item: %s"), action_exp);
2694
2695       if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2696         {
2697           int i;
2698
2699           for (i = 0; i < action->body_count; ++i)
2700             trace_dump_actions (action->body_list[i],
2701                                 1, stepping_frame, from_tty);
2702         }
2703       else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2704         {
2705           /* Display the collected data.
2706              For the trap frame, display only what was collected at
2707              the trap.  Likewise for stepping frames, display only
2708              what was collected while stepping.  This means that the
2709              two boolean variables, STEPPING_FRAME and
2710              STEPPING_ACTIONS should be equal.  */
2711           if (stepping_frame == stepping_actions)
2712             {
2713               char *cmd = NULL;
2714               struct cleanup *old_chain
2715                 = make_cleanup (free_current_contents, &cmd);
2716               int trace_string = 0;
2717
2718               if (*action_exp == '/')
2719                 action_exp = decode_agent_options (action_exp, &trace_string);
2720
2721               do
2722                 {               /* Repeat over a comma-separated list.  */
2723                   QUIT;         /* Allow user to bail out with ^C.  */
2724                   if (*action_exp == ',')
2725                     action_exp++;
2726                   action_exp = skip_spaces (action_exp);
2727
2728                   next_comma = strchr (action_exp, ',');
2729
2730                   if (0 == strncasecmp (action_exp, "$reg", 4))
2731                     registers_info (NULL, from_tty);
2732                   else if (0 == strncasecmp (action_exp, "$_ret", 5))
2733                     ;
2734                   else if (0 == strncasecmp (action_exp, "$loc", 4))
2735                     info_locals_command (NULL, from_tty);
2736                   else if (0 == strncasecmp (action_exp, "$arg", 4))
2737                     info_args_command (NULL, from_tty);
2738                   else
2739                     {           /* variable */
2740                       if (next_comma != NULL)
2741                         {
2742                           size_t len = next_comma - action_exp;
2743
2744                           cmd = (char *) xrealloc (cmd, len + 1);
2745                           memcpy (cmd, action_exp, len);
2746                           cmd[len] = 0;
2747                         }
2748                       else
2749                         {
2750                           size_t len = strlen (action_exp);
2751
2752                           cmd = (char *) xrealloc (cmd, len + 1);
2753                           memcpy (cmd, action_exp, len + 1);
2754                         }
2755
2756                       printf_filtered ("%s = ", cmd);
2757                       output_command_const (cmd, from_tty);
2758                       printf_filtered ("\n");
2759                     }
2760                   action_exp = next_comma;
2761                 }
2762               while (action_exp && *action_exp == ',');
2763
2764               do_cleanups (old_chain);
2765             }
2766         }
2767     }
2768 }
2769
2770 /* Return bp_location of the tracepoint associated with the current
2771    traceframe.  Set *STEPPING_FRAME_P to 1 if the current traceframe
2772    is a stepping traceframe.  */
2773
2774 struct bp_location *
2775 get_traceframe_location (int *stepping_frame_p)
2776 {
2777   struct tracepoint *t;
2778   struct bp_location *tloc;
2779   struct regcache *regcache;
2780
2781   if (tracepoint_number == -1)
2782     error (_("No current trace frame."));
2783
2784   t = get_tracepoint (tracepoint_number);
2785
2786   if (t == NULL)
2787     error (_("No known tracepoint matches 'current' tracepoint #%d."),
2788            tracepoint_number);
2789
2790   /* The current frame is a trap frame if the frame PC is equal to the
2791      tracepoint PC.  If not, then the current frame was collected
2792      during single-stepping.  */
2793   regcache = get_current_regcache ();
2794
2795   /* If the traceframe's address matches any of the tracepoint's
2796      locations, assume it is a direct hit rather than a while-stepping
2797      frame.  (FIXME this is not reliable, should record each frame's
2798      type.)  */
2799   for (tloc = t->loc; tloc; tloc = tloc->next)
2800     if (tloc->address == regcache_read_pc (regcache))
2801       {
2802         *stepping_frame_p = 0;
2803         return tloc;
2804       }
2805
2806   /* If this is a stepping frame, we don't know which location
2807      triggered.  The first is as good (or bad) a guess as any...  */
2808   *stepping_frame_p = 1;
2809   return t->loc;
2810 }
2811
2812 /* Return all the actions, including default collect, of a tracepoint
2813    T.  It constructs cleanups into the chain, and leaves the caller to
2814    handle them (call do_cleanups).  */
2815
2816 static struct command_line *
2817 all_tracepoint_actions_and_cleanup (struct breakpoint *t)
2818 {
2819   struct command_line *actions;
2820
2821   actions = breakpoint_commands (t);
2822
2823   /* If there are default expressions to collect, make up a collect
2824      action and prepend to the action list to encode.  Note that since
2825      validation is per-tracepoint (local var "xyz" might be valid for
2826      one tracepoint and not another, etc), we make up the action on
2827      the fly, and don't cache it.  */
2828   if (*default_collect)
2829     {
2830       struct command_line *default_collect_action;
2831       char *default_collect_line;
2832
2833       default_collect_line = xstrprintf ("collect %s", default_collect);
2834       make_cleanup (xfree, default_collect_line);
2835
2836       validate_actionline (default_collect_line, t);
2837       default_collect_action = XNEW (struct command_line);
2838       make_cleanup (xfree, default_collect_action);
2839       default_collect_action->next = actions;
2840       default_collect_action->line = default_collect_line;
2841       actions = default_collect_action;
2842     }
2843
2844   return actions;
2845 }
2846
2847 /* The tdump command.  */
2848
2849 static void
2850 tdump_command (const char *args, int from_tty)
2851 {
2852   int stepping_frame = 0;
2853   struct bp_location *loc;
2854   struct command_line *actions;
2855
2856   /* This throws an error is not inspecting a trace frame.  */
2857   loc = get_traceframe_location (&stepping_frame);
2858
2859   printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2860                    tracepoint_number, traceframe_number);
2861
2862   /* This command only makes sense for the current frame, not the
2863      selected frame.  */
2864   scoped_restore_current_thread restore_thread;
2865
2866   select_frame (get_current_frame ());
2867
2868   actions = all_tracepoint_actions_and_cleanup (loc->owner);
2869
2870   trace_dump_actions (actions, 0, stepping_frame, from_tty);
2871 }
2872
2873 /* Encode a piece of a tracepoint's source-level definition in a form
2874    that is suitable for both protocol and saving in files.  */
2875 /* This version does not do multiple encodes for long strings; it should
2876    return an offset to the next piece to encode.  FIXME  */
2877
2878 int
2879 encode_source_string (int tpnum, ULONGEST addr,
2880                       const char *srctype, const char *src,
2881                       char *buf, int buf_size)
2882 {
2883   if (80 + strlen (srctype) > buf_size)
2884     error (_("Buffer too small for source encoding"));
2885   sprintf (buf, "%x:%s:%s:%x:%x:",
2886            tpnum, phex_nz (addr, sizeof (addr)),
2887            srctype, 0, (int) strlen (src));
2888   if (strlen (buf) + strlen (src) * 2 >= buf_size)
2889     error (_("Source string too long for buffer"));
2890   bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src));
2891   return -1;
2892 }
2893
2894 /* Tell the target what to do with an ongoing tracing run if GDB
2895    disconnects for some reason.  */
2896
2897 static void
2898 set_disconnected_tracing (const char *args, int from_tty,
2899                           struct cmd_list_element *c)
2900 {
2901   target_set_disconnected_tracing (disconnected_tracing);
2902 }
2903
2904 static void
2905 set_circular_trace_buffer (const char *args, int from_tty,
2906                            struct cmd_list_element *c)
2907 {
2908   target_set_circular_trace_buffer (circular_trace_buffer);
2909 }
2910
2911 static void
2912 set_trace_buffer_size (const char *args, int from_tty,
2913                            struct cmd_list_element *c)
2914 {
2915   target_set_trace_buffer_size (trace_buffer_size);
2916 }
2917
2918 static void
2919 set_trace_user (const char *args, int from_tty,
2920                 struct cmd_list_element *c)
2921 {
2922   int ret;
2923
2924   ret = target_set_trace_notes (trace_user, NULL, NULL);
2925
2926   if (!ret)
2927     warning (_("Target does not support trace notes, user ignored"));
2928 }
2929
2930 static void
2931 set_trace_notes (const char *args, int from_tty,
2932                  struct cmd_list_element *c)
2933 {
2934   int ret;
2935
2936   ret = target_set_trace_notes (NULL, trace_notes, NULL);
2937
2938   if (!ret)
2939     warning (_("Target does not support trace notes, note ignored"));
2940 }
2941
2942 static void
2943 set_trace_stop_notes (const char *args, int from_tty,
2944                       struct cmd_list_element *c)
2945 {
2946   int ret;
2947
2948   ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
2949
2950   if (!ret)
2951     warning (_("Target does not support trace notes, stop note ignored"));
2952 }
2953
2954 /* Convert the memory pointed to by mem into hex, placing result in buf.
2955  * Return a pointer to the last char put in buf (null)
2956  * "stolen" from sparc-stub.c
2957  */
2958
2959 static const char hexchars[] = "0123456789abcdef";
2960
2961 static char *
2962 mem2hex (gdb_byte *mem, char *buf, int count)
2963 {
2964   gdb_byte ch;
2965
2966   while (count-- > 0)
2967     {
2968       ch = *mem++;
2969
2970       *buf++ = hexchars[ch >> 4];
2971       *buf++ = hexchars[ch & 0xf];
2972     }
2973
2974   *buf = 0;
2975
2976   return buf;
2977 }
2978
2979 int
2980 get_traceframe_number (void)
2981 {
2982   return traceframe_number;
2983 }
2984
2985 int
2986 get_tracepoint_number (void)
2987 {
2988   return tracepoint_number;
2989 }
2990
2991 /* Make the traceframe NUM be the current trace frame.  Does nothing
2992    if NUM is already current.  */
2993
2994 void
2995 set_current_traceframe (int num)
2996 {
2997   int newnum;
2998
2999   if (traceframe_number == num)
3000     {
3001       /* Nothing to do.  */
3002       return;
3003     }
3004
3005   newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3006
3007   if (newnum != num)
3008     warning (_("could not change traceframe"));
3009
3010   set_traceframe_num (newnum);
3011
3012   /* Changing the traceframe changes our view of registers and of the
3013      frame chain.  */
3014   registers_changed ();
3015
3016   clear_traceframe_info ();
3017 }
3018
3019 /* A cleanup used when switching away and back from tfind mode.  */
3020
3021 struct current_traceframe_cleanup
3022 {
3023   /* The traceframe we were inspecting.  */
3024   int traceframe_number;
3025 };
3026
3027 static void
3028 do_restore_current_traceframe_cleanup (void *arg)
3029 {
3030   struct current_traceframe_cleanup *old
3031     = (struct current_traceframe_cleanup *) arg;
3032
3033   set_current_traceframe (old->traceframe_number);
3034 }
3035
3036 static void
3037 restore_current_traceframe_cleanup_dtor (void *arg)
3038 {
3039   struct current_traceframe_cleanup *old
3040     = (struct current_traceframe_cleanup *) arg;
3041
3042   xfree (old);
3043 }
3044
3045 struct cleanup *
3046 make_cleanup_restore_current_traceframe (void)
3047 {
3048   struct current_traceframe_cleanup *old =
3049     XNEW (struct current_traceframe_cleanup);
3050
3051   old->traceframe_number = traceframe_number;
3052
3053   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3054                             restore_current_traceframe_cleanup_dtor);
3055 }
3056
3057 /* Given a number and address, return an uploaded tracepoint with that
3058    number, creating if necessary.  */
3059
3060 struct uploaded_tp *
3061 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3062 {
3063   struct uploaded_tp *utp;
3064
3065   for (utp = *utpp; utp; utp = utp->next)
3066     if (utp->number == num && utp->addr == addr)
3067       return utp;
3068
3069   utp = XCNEW (struct uploaded_tp);
3070   utp->number = num;
3071   utp->addr = addr;
3072   utp->actions = NULL;
3073   utp->step_actions = NULL;
3074   utp->cmd_strings = NULL;
3075   utp->next = *utpp;
3076   *utpp = utp;
3077
3078   return utp;
3079 }
3080
3081 void
3082 free_uploaded_tps (struct uploaded_tp **utpp)
3083 {
3084   struct uploaded_tp *next_one;
3085
3086   while (*utpp)
3087     {
3088       next_one = (*utpp)->next;
3089       xfree (*utpp);
3090       *utpp = next_one;
3091     }
3092 }
3093
3094 /* Given a number and address, return an uploaded tracepoint with that
3095    number, creating if necessary.  */
3096
3097 struct uploaded_tsv *
3098 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3099 {
3100   struct uploaded_tsv *utsv;
3101
3102   for (utsv = *utsvp; utsv; utsv = utsv->next)
3103     if (utsv->number == num)
3104       return utsv;
3105
3106   utsv = XCNEW (struct uploaded_tsv);
3107   utsv->number = num;
3108   utsv->next = *utsvp;
3109   *utsvp = utsv;
3110
3111   return utsv;
3112 }
3113
3114 void
3115 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3116 {
3117   struct uploaded_tsv *next_one;
3118
3119   while (*utsvp)
3120     {
3121       next_one = (*utsvp)->next;
3122       xfree (*utsvp);
3123       *utsvp = next_one;
3124     }
3125 }
3126
3127 /* FIXME this function is heuristic and will miss the cases where the
3128    conditional is semantically identical but differs in whitespace,
3129    such as "x == 0" vs "x==0".  */
3130
3131 static int
3132 cond_string_is_same (char *str1, char *str2)
3133 {
3134   if (str1 == NULL || str2 == NULL)
3135     return (str1 == str2);
3136
3137   return (strcmp (str1, str2) == 0);
3138 }
3139
3140 /* Look for an existing tracepoint that seems similar enough to the
3141    uploaded one.  Enablement isn't compared, because the user can
3142    toggle that freely, and may have done so in anticipation of the
3143    next trace run.  Return the location of matched tracepoint.  */
3144
3145 static struct bp_location *
3146 find_matching_tracepoint_location (struct uploaded_tp *utp)
3147 {
3148   VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3149   int ix;
3150   struct breakpoint *b;
3151   struct bp_location *loc;
3152
3153   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3154     {
3155       struct tracepoint *t = (struct tracepoint *) b;
3156
3157       if (b->type == utp->type
3158           && t->step_count == utp->step
3159           && t->pass_count == utp->pass
3160           && cond_string_is_same (t->cond_string, utp->cond_string)
3161           /* FIXME also test actions.  */
3162           )
3163         {
3164           /* Scan the locations for an address match.  */
3165           for (loc = b->loc; loc; loc = loc->next)
3166             {
3167               if (loc->address == utp->addr)
3168                 return loc;
3169             }
3170         }
3171     }
3172   return NULL;
3173 }
3174
3175 /* Given a list of tracepoints uploaded from a target, attempt to
3176    match them up with existing tracepoints, and create new ones if not
3177    found.  */
3178
3179 void
3180 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3181 {
3182   struct uploaded_tp *utp;
3183   /* A set of tracepoints which are modified.  */
3184   VEC(breakpoint_p) *modified_tp = NULL;
3185   int ix;
3186   struct breakpoint *b;
3187
3188   /* Look for GDB tracepoints that match up with our uploaded versions.  */
3189   for (utp = *uploaded_tps; utp; utp = utp->next)
3190     {
3191       struct bp_location *loc;
3192       struct tracepoint *t;
3193
3194       loc = find_matching_tracepoint_location (utp);
3195       if (loc)
3196         {
3197           int found = 0;
3198
3199           /* Mark this location as already inserted.  */
3200           loc->inserted = 1;
3201           t = (struct tracepoint *) loc->owner;
3202           printf_filtered (_("Assuming tracepoint %d is same "
3203                              "as target's tracepoint %d at %s.\n"),
3204                            loc->owner->number, utp->number,
3205                            paddress (loc->gdbarch, utp->addr));
3206
3207           /* The tracepoint LOC->owner was modified (the location LOC
3208              was marked as inserted in the target).  Save it in
3209              MODIFIED_TP if not there yet.  The 'breakpoint-modified'
3210              observers will be notified later once for each tracepoint
3211              saved in MODIFIED_TP.  */
3212           for (ix = 0;
3213                VEC_iterate (breakpoint_p, modified_tp, ix, b);
3214                ix++)
3215             if (b == loc->owner)
3216               {
3217                 found = 1;
3218                 break;
3219               }
3220           if (!found)
3221             VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3222         }
3223       else
3224         {
3225           t = create_tracepoint_from_upload (utp);
3226           if (t)
3227             printf_filtered (_("Created tracepoint %d for "
3228                                "target's tracepoint %d at %s.\n"),
3229                              t->number, utp->number,
3230                              paddress (get_current_arch (), utp->addr));
3231           else
3232             printf_filtered (_("Failed to create tracepoint for target's "
3233                                "tracepoint %d at %s, skipping it.\n"),
3234                              utp->number,
3235                              paddress (get_current_arch (), utp->addr));
3236         }
3237       /* Whether found or created, record the number used by the
3238          target, to help with mapping target tracepoints back to their
3239          counterparts here.  */
3240       if (t)
3241         t->number_on_target = utp->number;
3242     }
3243
3244   /* Notify 'breakpoint-modified' observer that at least one of B's
3245      locations was changed.  */
3246   for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3247     observer_notify_breakpoint_modified (b);
3248
3249   VEC_free (breakpoint_p, modified_tp);
3250   free_uploaded_tps (uploaded_tps);
3251 }
3252
3253 /* Trace state variables don't have much to identify them beyond their
3254    name, so just use that to detect matches.  */
3255
3256 static struct trace_state_variable *
3257 find_matching_tsv (struct uploaded_tsv *utsv)
3258 {
3259   if (!utsv->name)
3260     return NULL;
3261
3262   return find_trace_state_variable (utsv->name);
3263 }
3264
3265 static struct trace_state_variable *
3266 create_tsv_from_upload (struct uploaded_tsv *utsv)
3267 {
3268   const char *namebase;
3269   std::string buf;
3270   int try_num = 0;
3271   struct trace_state_variable *tsv;
3272   struct cleanup *old_chain;
3273
3274   if (utsv->name)
3275     {
3276       namebase = utsv->name;
3277       buf = namebase;
3278     }
3279   else
3280     {
3281       namebase = "__tsv";
3282       buf = string_printf ("%s_%d", namebase, try_num++);
3283     }
3284
3285   /* Fish for a name that is not in use.  */
3286   /* (should check against all internal vars?)  */
3287   while (find_trace_state_variable (buf.c_str ()))
3288     buf = string_printf ("%s_%d", namebase, try_num++);
3289
3290   /* We have an available name, create the variable.  */
3291   tsv = create_trace_state_variable (buf.c_str ());
3292   tsv->initial_value = utsv->initial_value;
3293   tsv->builtin = utsv->builtin;
3294
3295   observer_notify_tsv_created (tsv);
3296
3297   return tsv;
3298 }
3299
3300 /* Given a list of uploaded trace state variables, try to match them
3301    up with existing variables, or create additional ones.  */
3302
3303 void
3304 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3305 {
3306   int ix;
3307   struct uploaded_tsv *utsv;
3308   struct trace_state_variable *tsv;
3309   int highest;
3310
3311   /* Most likely some numbers will have to be reassigned as part of
3312      the merge, so clear them all in anticipation.  */
3313   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3314     tsv->number = 0;
3315
3316   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3317     {
3318       tsv = find_matching_tsv (utsv);
3319       if (tsv)
3320         {
3321           if (info_verbose)
3322             printf_filtered (_("Assuming trace state variable $%s "
3323                                "is same as target's variable %d.\n"),
3324                              tsv->name, utsv->number);
3325         }
3326       else
3327         {
3328           tsv = create_tsv_from_upload (utsv);
3329           if (info_verbose)
3330             printf_filtered (_("Created trace state variable "
3331                                "$%s for target's variable %d.\n"),
3332                              tsv->name, utsv->number);
3333         }
3334       /* Give precedence to numberings that come from the target.  */
3335       if (tsv)
3336         tsv->number = utsv->number;
3337     }
3338
3339   /* Renumber everything that didn't get a target-assigned number.  */
3340   highest = 0;
3341   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3342     if (tsv->number > highest)
3343       highest = tsv->number;
3344
3345   ++highest;
3346   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3347     if (tsv->number == 0)
3348       tsv->number = highest++;
3349
3350   free_uploaded_tsvs (uploaded_tsvs);
3351 }
3352
3353 /* Parse the part of trace status syntax that is shared between
3354    the remote protocol and the trace file reader.  */
3355
3356 void
3357 parse_trace_status (const char *line, struct trace_status *ts)
3358 {
3359   const char *p = line, *p1, *p2, *p3, *p_temp;
3360   int end;
3361   ULONGEST val;
3362
3363   ts->running_known = 1;
3364   ts->running = (*p++ == '1');
3365   ts->stop_reason = trace_stop_reason_unknown;
3366   xfree (ts->stop_desc);
3367   ts->stop_desc = NULL;
3368   ts->traceframe_count = -1;
3369   ts->traceframes_created = -1;
3370   ts->buffer_free = -1;
3371   ts->buffer_size = -1;
3372   ts->disconnected_tracing = 0;
3373   ts->circular_buffer = 0;
3374   xfree (ts->user_name);
3375   ts->user_name = NULL;
3376   xfree (ts->notes);
3377   ts->notes = NULL;
3378   ts->start_time = ts->stop_time = 0;
3379
3380   while (*p++)
3381     {
3382       p1 = strchr (p, ':');
3383       if (p1 == NULL)
3384         error (_("Malformed trace status, at %s\n\
3385 Status line: '%s'\n"), p, line);
3386       p3 = strchr (p, ';');
3387       if (p3 == NULL)
3388         p3 = p + strlen (p);
3389       if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3390         {
3391           p = unpack_varlen_hex (++p1, &val);
3392           ts->stop_reason = trace_buffer_full;
3393         }
3394       else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3395         {
3396           p = unpack_varlen_hex (++p1, &val);
3397           ts->stop_reason = trace_never_run;
3398         }
3399       else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3400                         p1 - p) == 0)
3401         {
3402           p = unpack_varlen_hex (++p1, &val);
3403           ts->stop_reason = tracepoint_passcount;
3404           ts->stopping_tracepoint = val;
3405         }
3406       else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0)
3407         {
3408           p2 = strchr (++p1, ':');
3409           if (!p2 || p2 > p3)
3410             {
3411               /*older style*/
3412               p2 = p1;
3413             }
3414           else if (p2 != p1)
3415             {
3416               ts->stop_desc = (char *) xmalloc (strlen (line));
3417               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3418               ts->stop_desc[end] = '\0';
3419             }
3420           else
3421             ts->stop_desc = xstrdup ("");
3422
3423           p = unpack_varlen_hex (++p2, &val);
3424           ts->stop_reason = trace_stop_command;
3425         }
3426       else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3427         {
3428           p = unpack_varlen_hex (++p1, &val);
3429           ts->stop_reason = trace_disconnected;
3430         }
3431       else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3432         {
3433           p2 = strchr (++p1, ':');
3434           if (p2 != p1)
3435             {
3436               ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
3437               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3438               ts->stop_desc[end] = '\0';
3439             }
3440           else
3441             ts->stop_desc = xstrdup ("");
3442
3443           p = unpack_varlen_hex (++p2, &val);
3444           ts->stopping_tracepoint = val;
3445           ts->stop_reason = tracepoint_error;
3446         }
3447       else if (strncmp (p, "tframes", p1 - p) == 0)
3448         {
3449           p = unpack_varlen_hex (++p1, &val);
3450           ts->traceframe_count = val;
3451         }
3452       else if (strncmp (p, "tcreated", p1 - p) == 0)
3453         {
3454           p = unpack_varlen_hex (++p1, &val);
3455           ts->traceframes_created = val;
3456         }
3457       else if (strncmp (p, "tfree", p1 - p) == 0)
3458         {
3459           p = unpack_varlen_hex (++p1, &val);
3460           ts->buffer_free = val;
3461         }
3462       else if (strncmp (p, "tsize", p1 - p) == 0)
3463         {
3464           p = unpack_varlen_hex (++p1, &val);
3465           ts->buffer_size = val;
3466         }
3467       else if (strncmp (p, "disconn", p1 - p) == 0)
3468         {
3469           p = unpack_varlen_hex (++p1, &val);
3470           ts->disconnected_tracing = val;
3471         }
3472       else if (strncmp (p, "circular", p1 - p) == 0)
3473         {
3474           p = unpack_varlen_hex (++p1, &val);
3475           ts->circular_buffer = val;
3476         }
3477       else if (strncmp (p, "starttime", p1 - p) == 0)
3478         {
3479           p = unpack_varlen_hex (++p1, &val);
3480           ts->start_time = val;
3481         }
3482       else if (strncmp (p, "stoptime", p1 - p) == 0)
3483         {
3484           p = unpack_varlen_hex (++p1, &val);
3485           ts->stop_time = val;
3486         }
3487       else if (strncmp (p, "username", p1 - p) == 0)
3488         {
3489           ++p1;
3490           ts->user_name = (char *) xmalloc (strlen (p) / 2);
3491           end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1)  / 2);
3492           ts->user_name[end] = '\0';
3493           p = p3;
3494         }
3495       else if (strncmp (p, "notes", p1 - p) == 0)
3496         {
3497           ++p1;
3498           ts->notes = (char *) xmalloc (strlen (p) / 2);
3499           end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
3500           ts->notes[end] = '\0';
3501           p = p3;
3502         }
3503       else
3504         {
3505           /* Silently skip unknown optional info.  */
3506           p_temp = strchr (p1 + 1, ';');
3507           if (p_temp)
3508             p = p_temp;
3509           else
3510             /* Must be at the end.  */
3511             break;
3512         }
3513     }
3514 }
3515
3516 void
3517 parse_tracepoint_status (const char *p, struct breakpoint *bp,
3518                          struct uploaded_tp *utp)
3519 {
3520   ULONGEST uval;
3521   struct tracepoint *tp = (struct tracepoint *) bp;
3522
3523   p = unpack_varlen_hex (p, &uval);
3524   if (tp)
3525     tp->hit_count += uval;
3526   else
3527     utp->hit_count += uval;
3528   p = unpack_varlen_hex (p + 1, &uval);
3529   if (tp)
3530     tp->traceframe_usage += uval;
3531   else
3532     utp->traceframe_usage += uval;
3533   /* Ignore any extra, allowing for future extensions.  */
3534 }
3535
3536 /* Given a line of text defining a part of a tracepoint, parse it into
3537    an "uploaded tracepoint".  */
3538
3539 void
3540 parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
3541 {
3542   const char *p;
3543   char piece;
3544   ULONGEST num, addr, step, pass, orig_size, xlen, start;
3545   int enabled, end;
3546   enum bptype type;
3547   const char *srctype;
3548   char *cond, *buf;
3549   struct uploaded_tp *utp = NULL;
3550
3551   p = line;
3552   /* Both tracepoint and action definitions start with the same number
3553      and address sequence.  */
3554   piece = *p++;
3555   p = unpack_varlen_hex (p, &num);
3556   p++;  /* skip a colon */
3557   p = unpack_varlen_hex (p, &addr);
3558   p++;  /* skip a colon */
3559   if (piece == 'T')
3560     {
3561       enabled = (*p++ == 'E');
3562       p++;  /* skip a colon */
3563       p = unpack_varlen_hex (p, &step);
3564       p++;  /* skip a colon */
3565       p = unpack_varlen_hex (p, &pass);
3566       type = bp_tracepoint;
3567       cond = NULL;
3568       /* Thumb through optional fields.  */
3569       while (*p == ':')
3570         {
3571           p++;  /* skip a colon */
3572           if (*p == 'F')
3573             {
3574               type = bp_fast_tracepoint;
3575               p++;
3576               p = unpack_varlen_hex (p, &orig_size);
3577             }
3578           else if (*p == 'S')
3579             {
3580               type = bp_static_tracepoint;
3581               p++;
3582             }
3583           else if (*p == 'X')
3584             {
3585               p++;
3586               p = unpack_varlen_hex (p, &xlen);
3587               p++;  /* skip a comma */
3588               cond = (char *) xmalloc (2 * xlen + 1);
3589               strncpy (cond, p, 2 * xlen);
3590               cond[2 * xlen] = '\0';
3591               p += 2 * xlen;
3592             }
3593           else
3594             warning (_("Unrecognized char '%c' in tracepoint "
3595                        "definition, skipping rest"), *p);
3596         }
3597       utp = get_uploaded_tp (num, addr, utpp);
3598       utp->type = type;
3599       utp->enabled = enabled;
3600       utp->step = step;
3601       utp->pass = pass;
3602       utp->cond = cond;
3603     }
3604   else if (piece == 'A')
3605     {
3606       utp = get_uploaded_tp (num, addr, utpp);
3607       VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3608     }
3609   else if (piece == 'S')
3610     {
3611       utp = get_uploaded_tp (num, addr, utpp);
3612       VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3613     }
3614   else if (piece == 'Z')
3615     {
3616       /* Parse a chunk of source form definition.  */
3617       utp = get_uploaded_tp (num, addr, utpp);
3618       srctype = p;
3619       p = strchr (p, ':');
3620       p++;  /* skip a colon */
3621       p = unpack_varlen_hex (p, &start);
3622       p++;  /* skip a colon */
3623       p = unpack_varlen_hex (p, &xlen);
3624       p++;  /* skip a colon */
3625
3626       buf = (char *) alloca (strlen (line));
3627
3628       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3629       buf[end] = '\0';
3630
3631       if (startswith (srctype, "at:"))
3632         utp->at_string = xstrdup (buf);
3633       else if (startswith (srctype, "cond:"))
3634         utp->cond_string = xstrdup (buf);
3635       else if (startswith (srctype, "cmd:"))
3636         VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3637     }
3638   else if (piece == 'V')
3639     {
3640       utp = get_uploaded_tp (num, addr, utpp);
3641
3642       parse_tracepoint_status (p, NULL, utp);
3643     }
3644   else
3645     {
3646       /* Don't error out, the target might be sending us optional
3647          info that we don't care about.  */
3648       warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3649     }
3650 }
3651
3652 /* Convert a textual description of a trace state variable into an
3653    uploaded object.  */
3654
3655 void
3656 parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp)
3657 {
3658   const char *p;
3659   char *buf;
3660   ULONGEST num, initval, builtin;
3661   int end;
3662   struct uploaded_tsv *utsv = NULL;
3663
3664   buf = (char *) alloca (strlen (line));
3665
3666   p = line;
3667   p = unpack_varlen_hex (p, &num);
3668   p++; /* skip a colon */
3669   p = unpack_varlen_hex (p, &initval);
3670   p++; /* skip a colon */
3671   p = unpack_varlen_hex (p, &builtin);
3672   p++; /* skip a colon */
3673   end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3674   buf[end] = '\0';
3675
3676   utsv = get_uploaded_tsv (num, utsvp);
3677   utsv->initial_value = initval;
3678   utsv->builtin = builtin;
3679   utsv->name = xstrdup (buf);
3680 }
3681
3682 void
3683 free_current_marker (void *arg)
3684 {
3685   struct static_tracepoint_marker **marker_p
3686     = (struct static_tracepoint_marker **) arg;
3687
3688   if (*marker_p != NULL)
3689     {
3690       release_static_tracepoint_marker (*marker_p);
3691       xfree (*marker_p);
3692     }
3693   else
3694     *marker_p = NULL;
3695 }
3696
3697 /* Given a line of text defining a static tracepoint marker, parse it
3698    into a "static tracepoint marker" object.  Throws an error is
3699    parsing fails.  If PP is non-null, it points to one past the end of
3700    the parsed marker definition.  */
3701
3702 void
3703 parse_static_tracepoint_marker_definition (const char *line, const char **pp,
3704                                            struct static_tracepoint_marker *marker)
3705 {
3706   const char *p, *endp;
3707   ULONGEST addr;
3708   int end;
3709
3710   p = line;
3711   p = unpack_varlen_hex (p, &addr);
3712   p++;  /* skip a colon */
3713
3714   marker->gdbarch = target_gdbarch ();
3715   marker->address = (CORE_ADDR) addr;
3716
3717   endp = strchr (p, ':');
3718   if (endp == NULL)
3719     error (_("bad marker definition: %s"), line);
3720
3721   marker->str_id = (char *) xmalloc (endp - p + 1);
3722   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
3723   marker->str_id[end] = '\0';
3724
3725   p += 2 * end;
3726   p++;  /* skip a colon */
3727
3728   marker->extra = (char *) xmalloc (strlen (p) + 1);
3729   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
3730   marker->extra[end] = '\0';
3731
3732   if (pp)
3733     *pp = p;
3734 }
3735
3736 /* Release a static tracepoint marker's contents.  Note that the
3737    object itself isn't released here.  There objects are usually on
3738    the stack.  */
3739
3740 void
3741 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
3742 {
3743   xfree (marker->str_id);
3744   marker->str_id = NULL;
3745 }
3746
3747 /* Print MARKER to gdb_stdout.  */
3748
3749 static void
3750 print_one_static_tracepoint_marker (int count,
3751                                     struct static_tracepoint_marker *marker)
3752 {
3753   struct symbol *sym;
3754
3755   char wrap_indent[80];
3756   char extra_field_indent[80];
3757   struct ui_out *uiout = current_uiout;
3758   VEC(breakpoint_p) *tracepoints;
3759
3760   symtab_and_line sal;
3761   sal.pc = marker->address;
3762
3763   tracepoints = static_tracepoints_here (marker->address);
3764
3765   ui_out_emit_tuple tuple_emitter (uiout, "marker");
3766
3767   /* A counter field to help readability.  This is not a stable
3768      identifier!  */
3769   uiout->field_int ("count", count);
3770
3771   uiout->field_string ("marker-id", marker->str_id);
3772
3773   uiout->field_fmt ("enabled", "%c",
3774                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
3775   uiout->spaces (2);
3776
3777   strcpy (wrap_indent, "                                   ");
3778
3779   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
3780     strcat (wrap_indent, "           ");
3781   else
3782     strcat (wrap_indent, "                   ");
3783
3784   strcpy (extra_field_indent, "         ");
3785
3786   uiout->field_core_addr ("addr", marker->gdbarch, marker->address);
3787
3788   sal = find_pc_line (marker->address, 0);
3789   sym = find_pc_sect_function (marker->address, NULL);
3790   if (sym)
3791     {
3792       uiout->text ("in ");
3793       uiout->field_string ("func",
3794                            SYMBOL_PRINT_NAME (sym));
3795       uiout->wrap_hint (wrap_indent);
3796       uiout->text (" at ");
3797     }
3798   else
3799     uiout->field_skip ("func");
3800
3801   if (sal.symtab != NULL)
3802     {
3803       uiout->field_string ("file",
3804                            symtab_to_filename_for_display (sal.symtab));
3805       uiout->text (":");
3806
3807       if (uiout->is_mi_like_p ())
3808         {
3809           const char *fullname = symtab_to_fullname (sal.symtab);
3810
3811           uiout->field_string ("fullname", fullname);
3812         }
3813       else
3814         uiout->field_skip ("fullname");
3815
3816       uiout->field_int ("line", sal.line);
3817     }
3818   else
3819     {
3820       uiout->field_skip ("fullname");
3821       uiout->field_skip ("line");
3822     }
3823
3824   uiout->text ("\n");
3825   uiout->text (extra_field_indent);
3826   uiout->text (_("Data: \""));
3827   uiout->field_string ("extra-data", marker->extra);
3828   uiout->text ("\"\n");
3829
3830   if (!VEC_empty (breakpoint_p, tracepoints))
3831     {
3832       int ix;
3833       struct breakpoint *b;
3834
3835       {
3836         ui_out_emit_tuple tuple_emitter (uiout, "tracepoints-at");
3837
3838         uiout->text (extra_field_indent);
3839         uiout->text (_("Probed by static tracepoints: "));
3840         for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
3841           {
3842             if (ix > 0)
3843               uiout->text (", ");
3844             uiout->text ("#");
3845             uiout->field_int ("tracepoint-id", b->number);
3846           }
3847       }
3848
3849       if (uiout->is_mi_like_p ())
3850         uiout->field_int ("number-of-tracepoints",
3851                           VEC_length(breakpoint_p, tracepoints));
3852       else
3853         uiout->text ("\n");
3854     }
3855   VEC_free (breakpoint_p, tracepoints);
3856 }
3857
3858 static void
3859 info_static_tracepoint_markers_command (const char *arg, int from_tty)
3860 {
3861   VEC(static_tracepoint_marker_p) *markers;
3862   struct cleanup *old_chain;
3863   struct static_tracepoint_marker *marker;
3864   struct ui_out *uiout = current_uiout;
3865   int i;
3866
3867   /* We don't have to check target_can_use_agent and agent's capability on
3868      static tracepoint here, in order to be compatible with older GDBserver.
3869      We don't check USE_AGENT is true or not, because static tracepoints
3870      don't work without in-process agent, so we don't bother users to type
3871      `set agent on' when to use static tracepoint.  */
3872
3873   ui_out_emit_table table_emitter (uiout, 5, -1,
3874                                    "StaticTracepointMarkersTable");
3875
3876   uiout->table_header (7, ui_left, "counter", "Cnt");
3877
3878   uiout->table_header (40, ui_left, "marker-id", "ID");
3879
3880   uiout->table_header (3, ui_left, "enabled", "Enb");
3881   if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
3882     uiout->table_header (10, ui_left, "addr", "Address");
3883   else
3884     uiout->table_header (18, ui_left, "addr", "Address");
3885   uiout->table_header (40, ui_noalign, "what", "What");
3886
3887   uiout->table_body ();
3888
3889   markers = target_static_tracepoint_markers_by_strid (NULL);
3890   old_chain = make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
3891
3892   for (i = 0;
3893        VEC_iterate (static_tracepoint_marker_p,
3894                     markers, i, marker);
3895        i++)
3896     {
3897       print_one_static_tracepoint_marker (i + 1, marker);
3898       release_static_tracepoint_marker (marker);
3899     }
3900
3901   do_cleanups (old_chain);
3902 }
3903
3904 /* The $_sdata convenience variable is a bit special.  We don't know
3905    for sure type of the value until we actually have a chance to fetch
3906    the data --- the size of the object depends on what has been
3907    collected.  We solve this by making $_sdata be an internalvar that
3908    creates a new value on access.  */
3909
3910 /* Return a new value with the correct type for the sdata object of
3911    the current trace frame.  Return a void value if there's no object
3912    available.  */
3913
3914 static struct value *
3915 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
3916                   void *ignore)
3917 {
3918   LONGEST size;
3919   gdb_byte *buf;
3920
3921   /* We need to read the whole object before we know its size.  */
3922   size = target_read_alloc (&current_target,
3923                             TARGET_OBJECT_STATIC_TRACE_DATA,
3924                             NULL, &buf);
3925   if (size >= 0)
3926     {
3927       struct value *v;
3928       struct type *type;
3929
3930       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
3931                                size);
3932       v = allocate_value (type);
3933       memcpy (value_contents_raw (v), buf, size);
3934       xfree (buf);
3935       return v;
3936     }
3937   else
3938     return allocate_value (builtin_type (gdbarch)->builtin_void);
3939 }
3940
3941 #if !defined(HAVE_LIBEXPAT)
3942
3943 struct std::unique_ptr<traceframe_info>
3944 parse_traceframe_info (const char *tframe_info)
3945 {
3946   static int have_warned;
3947
3948   if (!have_warned)
3949     {
3950       have_warned = 1;
3951       warning (_("Can not parse XML trace frame info; XML support "
3952                  "was disabled at compile time"));
3953     }
3954
3955   return NULL;
3956 }
3957
3958 #else /* HAVE_LIBEXPAT */
3959
3960 #include "xml-support.h"
3961
3962 /* Handle the start of a <memory> element.  */
3963
3964 static void
3965 traceframe_info_start_memory (struct gdb_xml_parser *parser,
3966                               const struct gdb_xml_element *element,
3967                               void *user_data, VEC(gdb_xml_value_s) *attributes)
3968 {
3969   struct traceframe_info *info = (struct traceframe_info *) user_data;
3970   ULONGEST *start_p, *length_p;
3971
3972   start_p
3973     = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
3974   length_p
3975     = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
3976
3977   info->memory.emplace_back (*start_p, *length_p);
3978 }
3979
3980 /* Handle the start of a <tvar> element.  */
3981
3982 static void
3983 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
3984                              const struct gdb_xml_element *element,
3985                              void *user_data,
3986                              VEC(gdb_xml_value_s) *attributes)
3987 {
3988   struct traceframe_info *info = (struct traceframe_info *) user_data;
3989   const char *id_attrib
3990     = (const char *) xml_find_attribute (attributes, "id")->value;
3991   int id = gdb_xml_parse_ulongest (parser, id_attrib);
3992
3993   info->tvars.push_back (id);
3994 }
3995
3996 /* The allowed elements and attributes for an XML memory map.  */
3997
3998 static const struct gdb_xml_attribute memory_attributes[] = {
3999   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4000   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4001   { NULL, GDB_XML_AF_NONE, NULL, NULL }
4002 };
4003
4004 static const struct gdb_xml_attribute tvar_attributes[] = {
4005   { "id", GDB_XML_AF_NONE, NULL, NULL },
4006   { NULL, GDB_XML_AF_NONE, NULL, NULL }
4007 };
4008
4009 static const struct gdb_xml_element traceframe_info_children[] = {
4010   { "memory", memory_attributes, NULL,
4011     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4012     traceframe_info_start_memory, NULL },
4013   { "tvar", tvar_attributes, NULL,
4014     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4015     traceframe_info_start_tvar, NULL },
4016   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4017 };
4018
4019 static const struct gdb_xml_element traceframe_info_elements[] = {
4020   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4021     NULL, NULL },
4022   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4023 };
4024
4025 /* Parse a traceframe-info XML document.  */
4026
4027 traceframe_info_up
4028 parse_traceframe_info (const char *tframe_info)
4029 {
4030   traceframe_info_up result (new traceframe_info);
4031
4032   if (gdb_xml_parse_quick (_("trace frame info"),
4033                            "traceframe-info.dtd", traceframe_info_elements,
4034                            tframe_info, result.get ()) == 0)
4035     return result;
4036
4037   return NULL;
4038 }
4039
4040 #endif /* HAVE_LIBEXPAT */
4041
4042 /* Returns the traceframe_info object for the current traceframe.
4043    This is where we avoid re-fetching the object from the target if we
4044    already have it cached.  */
4045
4046 struct traceframe_info *
4047 get_traceframe_info (void)
4048 {
4049   if (current_traceframe_info == NULL)
4050     current_traceframe_info = target_traceframe_info ();
4051
4052   return current_traceframe_info.get ();
4053 }
4054
4055 /* If the target supports the query, return in RESULT the set of
4056    collected memory in the current traceframe, found within the LEN
4057    bytes range starting at MEMADDR.  Returns true if the target
4058    supports the query, otherwise returns false, and RESULT is left
4059    undefined.  */
4060
4061 int
4062 traceframe_available_memory (std::vector<mem_range> *result,
4063                              CORE_ADDR memaddr, ULONGEST len)
4064 {
4065   struct traceframe_info *info = get_traceframe_info ();
4066
4067   if (info != NULL)
4068     {
4069       result->clear ();
4070
4071       for (mem_range &r : info->memory)
4072         if (mem_ranges_overlap (r.start, r.length, memaddr, len))
4073           {
4074             ULONGEST lo1, hi1, lo2, hi2;
4075
4076             lo1 = memaddr;
4077             hi1 = memaddr + len;
4078
4079             lo2 = r.start;
4080             hi2 = r.start + r.length;
4081
4082             CORE_ADDR start = std::max (lo1, lo2);
4083             int length = std::min (hi1, hi2) - start;
4084
4085             result->emplace_back (start, length);
4086           }
4087
4088       normalize_mem_ranges (result);
4089       return 1;
4090     }
4091
4092   return 0;
4093 }
4094
4095 /* Implementation of `sdata' variable.  */
4096
4097 static const struct internalvar_funcs sdata_funcs =
4098 {
4099   sdata_make_value,
4100   NULL,
4101   NULL
4102 };
4103
4104 /* module initialization */
4105 void
4106 _initialize_tracepoint (void)
4107 {
4108   struct cmd_list_element *c;
4109
4110   /* Explicitly create without lookup, since that tries to create a
4111      value with a void typed value, and when we get here, gdbarch
4112      isn't initialized yet.  At this point, we're quite sure there
4113      isn't another convenience variable of the same name.  */
4114   create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
4115
4116   traceframe_number = -1;
4117   tracepoint_number = -1;
4118
4119   add_info ("scope", info_scope_command,
4120             _("List the variables local to a scope"));
4121
4122   add_cmd ("tracepoints", class_trace,
4123            _("Tracing of program execution without stopping the program."),
4124            &cmdlist);
4125
4126   add_com ("tdump", class_trace, tdump_command,
4127            _("Print everything collected at the current tracepoint."));
4128
4129   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4130 Define a trace state variable.\n\
4131 Argument is a $-prefixed name, optionally followed\n\
4132 by '=' and an expression that sets the initial value\n\
4133 at the start of tracing."));
4134   set_cmd_completer (c, expression_completer);
4135
4136   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4137 Delete one or more trace state variables.\n\
4138 Arguments are the names of the variables to delete.\n\
4139 If no arguments are supplied, delete all variables."), &deletelist);
4140   /* FIXME add a trace variable completer.  */
4141
4142   add_info ("tvariables", info_tvariables_command, _("\
4143 Status of trace state variables and their values.\n\
4144 "));
4145
4146   add_info ("static-tracepoint-markers",
4147             info_static_tracepoint_markers_command, _("\
4148 List target static tracepoints markers.\n\
4149 "));
4150
4151   add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
4152 Select a trace frame;\n\
4153 No argument means forward by one frame; '-' means backward by one frame."),
4154                   &tfindlist, "tfind ", 1, &cmdlist);
4155
4156   add_cmd ("outside", class_trace, tfind_outside_command, _("\
4157 Select a trace frame whose PC is outside the given range (exclusive).\n\
4158 Usage: tfind outside addr1, addr2"),
4159            &tfindlist);
4160
4161   add_cmd ("range", class_trace, tfind_range_command, _("\
4162 Select a trace frame whose PC is in the given range (inclusive).\n\
4163 Usage: tfind range addr1,addr2"),
4164            &tfindlist);
4165
4166   add_cmd ("line", class_trace, tfind_line_command, _("\
4167 Select a trace frame by source line.\n\
4168 Argument can be a line number (with optional source file),\n\
4169 a function name, or '*' followed by an address.\n\
4170 Default argument is 'the next source line that was traced'."),
4171            &tfindlist);
4172
4173   add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\
4174 Select a trace frame by tracepoint number.\n\
4175 Default is the tracepoint for the current trace frame."),
4176            &tfindlist);
4177
4178   add_cmd ("pc", class_trace, tfind_pc_command, _("\
4179 Select a trace frame by PC.\n\
4180 Default is the current PC, or the PC of the current trace frame."),
4181            &tfindlist);
4182
4183   add_cmd ("end", class_trace, tfind_end_command, _("\
4184 De-select any trace frame and resume 'live' debugging."),
4185            &tfindlist);
4186
4187   add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
4188
4189   add_cmd ("start", class_trace, tfind_start_command,
4190            _("Select the first trace frame in the trace buffer."),
4191            &tfindlist);
4192
4193   add_com ("tstatus", class_trace, tstatus_command,
4194            _("Display the status of the current trace data collection."));
4195
4196   add_com ("tstop", class_trace, tstop_command, _("\
4197 Stop trace data collection.\n\
4198 Usage: tstop [ <notes> ... ]\n\
4199 Any arguments supplied are recorded with the trace as a stop reason and\n\
4200 reported by tstatus (if the target supports trace notes)."));
4201
4202   add_com ("tstart", class_trace, tstart_command, _("\
4203 Start trace data collection.\n\
4204 Usage: tstart [ <notes> ... ]\n\
4205 Any arguments supplied are recorded with the trace as a note and\n\
4206 reported by tstatus (if the target supports trace notes)."));
4207
4208   add_com ("end", class_trace, end_actions_pseudocommand, _("\
4209 Ends a list of commands or actions.\n\
4210 Several GDB commands allow you to enter a list of commands or actions.\n\
4211 Entering \"end\" on a line by itself is the normal way to terminate\n\
4212 such a list.\n\n\
4213 Note: the \"end\" command cannot be used at the gdb prompt."));
4214
4215   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4216 Specify single-stepping behavior at a tracepoint.\n\
4217 Argument is number of instructions to trace in single-step mode\n\
4218 following the tracepoint.  This command is normally followed by\n\
4219 one or more \"collect\" commands, to specify what to collect\n\
4220 while single-stepping.\n\n\
4221 Note: this command can only be used in a tracepoint \"actions\" list."));
4222
4223   add_com_alias ("ws", "while-stepping", class_alias, 0);
4224   add_com_alias ("stepping", "while-stepping", class_alias, 0);
4225
4226   add_com ("collect", class_trace, collect_pseudocommand, _("\
4227 Specify one or more data items to be collected at a tracepoint.\n\
4228 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
4229 collect all data (variables, registers) referenced by that expression.\n\
4230 Also accepts the following special arguments:\n\
4231     $regs   -- all registers.\n\
4232     $args   -- all function arguments.\n\
4233     $locals -- all variables local to the block/function scope.\n\
4234     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4235 Note: this command can only be used in a tracepoint \"actions\" list."));
4236
4237   add_com ("teval", class_trace, teval_pseudocommand, _("\
4238 Specify one or more expressions to be evaluated at a tracepoint.\n\
4239 Accepts a comma-separated list of (one or more) expressions.\n\
4240 The result of each evaluation will be discarded.\n\
4241 Note: this command can only be used in a tracepoint \"actions\" list."));
4242
4243   add_com ("actions", class_trace, actions_command, _("\
4244 Specify the actions to be taken at a tracepoint.\n\
4245 Tracepoint actions may include collecting of specified data,\n\
4246 single-stepping, or enabling/disabling other tracepoints,\n\
4247 depending on target's capabilities."));
4248
4249   default_collect = xstrdup ("");
4250   add_setshow_string_cmd ("default-collect", class_trace,
4251                           &default_collect, _("\
4252 Set the list of expressions to collect by default"), _("\
4253 Show the list of expressions to collect by default"), NULL,
4254                           NULL, NULL,
4255                           &setlist, &showlist);
4256
4257   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4258                            &disconnected_tracing, _("\
4259 Set whether tracing continues after GDB disconnects."), _("\
4260 Show whether tracing continues after GDB disconnects."), _("\
4261 Use this to continue a tracing run even if GDB disconnects\n\
4262 or detaches from the target.  You can reconnect later and look at\n\
4263 trace data collected in the meantime."),
4264                            set_disconnected_tracing,
4265                            NULL,
4266                            &setlist,
4267                            &showlist);
4268
4269   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4270                            &circular_trace_buffer, _("\
4271 Set target's use of circular trace buffer."), _("\
4272 Show target's use of circular trace buffer."), _("\
4273 Use this to make the trace buffer into a circular buffer,\n\
4274 which will discard traceframes (oldest first) instead of filling\n\
4275 up and stopping the trace run."),
4276                            set_circular_trace_buffer,
4277                            NULL,
4278                            &setlist,
4279                            &showlist);
4280
4281   add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
4282                                        &trace_buffer_size, _("\
4283 Set requested size of trace buffer."), _("\
4284 Show requested size of trace buffer."), _("\
4285 Use this to choose a size for the trace buffer.  Some targets\n\
4286 may have fixed or limited buffer sizes.  Specifying \"unlimited\" or -1\n\
4287 disables any attempt to set the buffer size and lets the target choose."),
4288                                        set_trace_buffer_size, NULL,
4289                                        &setlist, &showlist);
4290
4291   add_setshow_string_cmd ("trace-user", class_trace,
4292                           &trace_user, _("\
4293 Set the user name to use for current and future trace runs"), _("\
4294 Show the user name to use for current and future trace runs"), NULL,
4295                           set_trace_user, NULL,
4296                           &setlist, &showlist);
4297
4298   add_setshow_string_cmd ("trace-notes", class_trace,
4299                           &trace_notes, _("\
4300 Set notes string to use for current and future trace runs"), _("\
4301 Show the notes string to use for current and future trace runs"), NULL,
4302                           set_trace_notes, NULL,
4303                           &setlist, &showlist);
4304
4305   add_setshow_string_cmd ("trace-stop-notes", class_trace,
4306                           &trace_stop_notes, _("\
4307 Set notes string to use for future tstop commands"), _("\
4308 Show the notes string to use for future tstop commands"), NULL,
4309                           set_trace_stop_notes, NULL,
4310                           &setlist, &showlist);
4311 }