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