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