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