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