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