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