gdb/
[platform/upstream/binutils.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3    Copyright (C) 1997-2013 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 "language.h"
30 #include "gdb_string.h"
31 #include "inferior.h"
32 #include "breakpoint.h"
33 #include "tracepoint.h"
34 #include "linespec.h"
35 #include "regcache.h"
36 #include "completer.h"
37 #include "block.h"
38 #include "dictionary.h"
39 #include "observer.h"
40 #include "user-regs.h"
41 #include "valprint.h"
42 #include "gdbcore.h"
43 #include "objfiles.h"
44 #include "filenames.h"
45 #include "gdbthread.h"
46 #include "stack.h"
47 #include "gdbcore.h"
48 #include "remote.h"
49 #include "source.h"
50 #include "ax.h"
51 #include "ax-gdb.h"
52 #include "memrange.h"
53 #include "exceptions.h"
54 #include "cli/cli-utils.h"
55 #include "probe.h"
56 #include "ctf.h"
57 #include "completer.h"
58 #include "filestuff.h"
59
60 /* readline include files */
61 #include "readline/readline.h"
62 #include "readline/history.h"
63
64 /* readline defines this.  */
65 #undef savestring
66
67 #ifdef HAVE_UNISTD_H
68 #include <unistd.h>
69 #endif
70
71 #ifndef O_LARGEFILE
72 #define O_LARGEFILE 0
73 #endif
74
75 /* Maximum length of an agent aexpression.
76    This accounts for the fact that packets are limited to 400 bytes
77    (which includes everything -- including the checksum), and assumes
78    the worst case of maximum length for each of the pieces of a
79    continuation packet.
80
81    NOTE: expressions get mem2hex'ed otherwise this would be twice as
82    large.  (400 - 31)/2 == 184 */
83 #define MAX_AGENT_EXPR_LEN      184
84
85 /* A hook used to notify the UI of tracepoint operations.  */
86
87 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
88 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
89
90 extern void (*deprecated_readline_begin_hook) (char *, ...);
91 extern char *(*deprecated_readline_hook) (char *);
92 extern void (*deprecated_readline_end_hook) (void);
93
94 /* 
95    Tracepoint.c:
96
97    This module defines the following debugger commands:
98    trace            : set a tracepoint on a function, line, or address.
99    info trace       : list all debugger-defined tracepoints.
100    delete trace     : delete one or more tracepoints.
101    enable trace     : enable one or more tracepoints.
102    disable trace    : disable one or more tracepoints.
103    actions          : specify actions to be taken at a tracepoint.
104    passcount        : specify a pass count for a tracepoint.
105    tstart           : start a trace experiment.
106    tstop            : stop a trace experiment.
107    tstatus          : query the status of a trace experiment.
108    tfind            : find a trace frame in the trace buffer.
109    tdump            : print everything collected at the current tracepoint.
110    save-tracepoints : write tracepoint setup into a file.
111
112    This module defines the following user-visible debugger variables:
113    $trace_frame : sequence number of trace frame currently being debugged.
114    $trace_line  : source line of trace frame currently being debugged.
115    $trace_file  : source file of trace frame currently being debugged.
116    $tracepoint  : tracepoint number of trace frame currently being debugged.
117  */
118
119
120 /* ======= Important global variables: ======= */
121
122 /* The list of all trace state variables.  We don't retain pointers to
123    any of these for any reason - API is by name or number only - so it
124    works to have a vector of objects.  */
125
126 typedef struct trace_state_variable tsv_s;
127 DEF_VEC_O(tsv_s);
128
129 static VEC(tsv_s) *tvariables;
130
131 /* The next integer to assign to a variable.  */
132
133 static int next_tsv_number = 1;
134
135 /* Number of last traceframe collected.  */
136 static int traceframe_number;
137
138 /* Tracepoint for last traceframe collected.  */
139 static int tracepoint_number;
140
141 /* Symbol for function for last traceframe collected.  */
142 static struct symbol *traceframe_fun;
143
144 /* Symtab and line for last traceframe collected.  */
145 static struct symtab_and_line traceframe_sal;
146
147 /* The traceframe info of the current traceframe.  NULL if we haven't
148    yet attempted to fetch it, or if the target does not support
149    fetching this object, or if we're not inspecting a traceframe
150    presently.  */
151 static struct traceframe_info *traceframe_info;
152
153 /* Tracing command lists.  */
154 static struct cmd_list_element *tfindlist;
155
156 /* List of expressions to collect by default at each tracepoint hit.  */
157 char *default_collect = "";
158
159 static int disconnected_tracing;
160
161 /* This variable controls whether we ask the target for a linear or
162    circular trace buffer.  */
163
164 static int circular_trace_buffer;
165
166 /* This variable is the requested trace buffer size, or -1 to indicate
167    that we don't care and leave it up to the target to set a size.  */
168
169 static int trace_buffer_size = -1;
170
171 /* Textual notes applying to the current and/or future trace runs.  */
172
173 char *trace_user = NULL;
174
175 /* Textual notes applying to the current and/or future trace runs.  */
176
177 char *trace_notes = NULL;
178
179 /* Textual notes applying to the stopping of a trace.  */
180
181 char *trace_stop_notes = NULL;
182
183 /* ======= Important command functions: ======= */
184 static void trace_actions_command (char *, int);
185 static void trace_start_command (char *, int);
186 static void trace_stop_command (char *, int);
187 static void trace_status_command (char *, int);
188 static void trace_find_command (char *, int);
189 static void trace_find_pc_command (char *, int);
190 static void trace_find_tracepoint_command (char *, int);
191 static void trace_find_line_command (char *, int);
192 static void trace_find_range_command (char *, int);
193 static void trace_find_outside_command (char *, int);
194 static void trace_dump_command (char *, int);
195
196 /* support routines */
197
198 struct collection_list;
199 static void add_aexpr (struct collection_list *, struct agent_expr *);
200 static char *mem2hex (gdb_byte *, char *, int);
201 static void add_register (struct collection_list *collection,
202                           unsigned int regno);
203
204 static void free_uploaded_tps (struct uploaded_tp **utpp);
205 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
206
207 static struct command_line *
208   all_tracepoint_actions_and_cleanup (struct breakpoint *t);
209
210 extern void _initialize_tracepoint (void);
211
212 static struct trace_status trace_status;
213
214 char *stop_reason_names[] = {
215   "tunknown",
216   "tnotrun",
217   "tstop",
218   "tfull",
219   "tdisconnected",
220   "tpasscount",
221   "terror"
222 };
223
224 struct trace_status *
225 current_trace_status (void)
226 {
227   return &trace_status;
228 }
229
230 /* Destroy INFO.  */
231
232 static void
233 free_traceframe_info (struct traceframe_info *info)
234 {
235   if (info != NULL)
236     {
237       VEC_free (mem_range_s, info->memory);
238
239       xfree (info);
240     }
241 }
242
243 /* Free and clear the traceframe info cache of the current
244    traceframe.  */
245
246 static void
247 clear_traceframe_info (void)
248 {
249   free_traceframe_info (traceframe_info);
250   traceframe_info = NULL;
251 }
252
253 /* Set traceframe number to NUM.  */
254 static void
255 set_traceframe_num (int num)
256 {
257   traceframe_number = num;
258   set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
259 }
260
261 /* Set tracepoint number to NUM.  */
262 static void
263 set_tracepoint_num (int num)
264 {
265   tracepoint_number = num;
266   set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
267 }
268
269 /* Set externally visible debug variables for querying/printing
270    the traceframe context (line, function, file).  */
271
272 static void
273 set_traceframe_context (struct frame_info *trace_frame)
274 {
275   CORE_ADDR trace_pc;
276
277   /* Save as globals for internal use.  */
278   if (trace_frame != NULL
279       && get_frame_pc_if_available (trace_frame, &trace_pc))
280     {
281       traceframe_sal = find_pc_line (trace_pc, 0);
282       traceframe_fun = find_pc_function (trace_pc);
283
284       /* Save linenumber as "$trace_line", a debugger variable visible to
285          users.  */
286       set_internalvar_integer (lookup_internalvar ("trace_line"),
287                                traceframe_sal.line);
288     }
289   else
290     {
291       init_sal (&traceframe_sal);
292       traceframe_fun = NULL;
293       set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
294     }
295
296   /* Save func name as "$trace_func", a debugger variable visible to
297      users.  */
298   if (traceframe_fun == NULL
299       || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
300     clear_internalvar (lookup_internalvar ("trace_func"));
301   else
302     set_internalvar_string (lookup_internalvar ("trace_func"),
303                             SYMBOL_LINKAGE_NAME (traceframe_fun));
304
305   /* Save file name as "$trace_file", a debugger variable visible to
306      users.  */
307   if (traceframe_sal.symtab == NULL)
308     clear_internalvar (lookup_internalvar ("trace_file"));
309   else
310     set_internalvar_string (lookup_internalvar ("trace_file"),
311                         symtab_to_filename_for_display (traceframe_sal.symtab));
312 }
313
314 /* Create a new trace state variable with the given name.  */
315
316 struct trace_state_variable *
317 create_trace_state_variable (const char *name)
318 {
319   struct trace_state_variable tsv;
320
321   memset (&tsv, 0, sizeof (tsv));
322   tsv.name = xstrdup (name);
323   tsv.number = next_tsv_number++;
324   return VEC_safe_push (tsv_s, tvariables, &tsv);
325 }
326
327 /* Look for a trace state variable of the given name.  */
328
329 struct trace_state_variable *
330 find_trace_state_variable (const char *name)
331 {
332   struct trace_state_variable *tsv;
333   int ix;
334
335   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
336     if (strcmp (name, tsv->name) == 0)
337       return tsv;
338
339   return NULL;
340 }
341
342 static void
343 delete_trace_state_variable (const char *name)
344 {
345   struct trace_state_variable *tsv;
346   int ix;
347
348   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
349     if (strcmp (name, tsv->name) == 0)
350       {
351         observer_notify_tsv_deleted (tsv);
352
353         xfree ((void *)tsv->name);
354         VEC_unordered_remove (tsv_s, tvariables, ix);
355
356         return;
357       }
358
359   warning (_("No trace variable named \"$%s\", not deleting"), name);
360 }
361
362 /* Throws an error if NAME is not valid syntax for a trace state
363    variable's name.  */
364
365 void
366 validate_trace_state_variable_name (const char *name)
367 {
368   const char *p;
369
370   if (*name == '\0')
371     error (_("Must supply a non-empty variable name"));
372
373   /* All digits in the name is reserved for value history
374      references.  */
375   for (p = name; isdigit (*p); p++)
376     ;
377   if (*p == '\0')
378     error (_("$%s is not a valid trace state variable name"), name);
379
380   for (p = name; isalnum (*p) || *p == '_'; p++)
381     ;
382   if (*p != '\0')
383     error (_("$%s is not a valid trace state variable name"), name);
384 }
385
386 /* The 'tvariable' command collects a name and optional expression to
387    evaluate into an initial value.  */
388
389 static void
390 trace_variable_command (char *args, int from_tty)
391 {
392   struct cleanup *old_chain;
393   LONGEST initval = 0;
394   struct trace_state_variable *tsv;
395   char *name, *p;
396
397   if (!args || !*args)
398     error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
399
400   /* Only allow two syntaxes; "$name" and "$name=value".  */
401   p = skip_spaces (args);
402
403   if (*p++ != '$')
404     error (_("Name of trace variable should start with '$'"));
405
406   name = p;
407   while (isalnum (*p) || *p == '_')
408     p++;
409   name = savestring (name, p - name);
410   old_chain = make_cleanup (xfree, name);
411
412   p = skip_spaces (p);
413   if (*p != '=' && *p != '\0')
414     error (_("Syntax must be $NAME [ = EXPR ]"));
415
416   validate_trace_state_variable_name (name);
417
418   if (*p == '=')
419     initval = value_as_long (parse_and_eval (++p));
420
421   /* If the variable already exists, just change its initial value.  */
422   tsv = find_trace_state_variable (name);
423   if (tsv)
424     {
425       if (tsv->initial_value != initval)
426         {
427           tsv->initial_value = initval;
428           observer_notify_tsv_modified (tsv);
429         }
430       printf_filtered (_("Trace state variable $%s "
431                          "now has initial value %s.\n"),
432                        tsv->name, plongest (tsv->initial_value));
433       do_cleanups (old_chain);
434       return;
435     }
436
437   /* Create a new variable.  */
438   tsv = create_trace_state_variable (name);
439   tsv->initial_value = initval;
440
441   observer_notify_tsv_created (tsv);
442
443   printf_filtered (_("Trace state variable $%s "
444                      "created, with initial value %s.\n"),
445                    tsv->name, plongest (tsv->initial_value));
446
447   do_cleanups (old_chain);
448 }
449
450 static void
451 delete_trace_variable_command (char *args, int from_tty)
452 {
453   int ix;
454   char **argv;
455   struct cleanup *back_to;
456
457   if (args == NULL)
458     {
459       if (query (_("Delete all trace state variables? ")))
460         VEC_free (tsv_s, tvariables);
461       dont_repeat ();
462       observer_notify_tsv_deleted (NULL);
463       return;
464     }
465
466   argv = gdb_buildargv (args);
467   back_to = make_cleanup_freeargv (argv);
468
469   for (ix = 0; argv[ix] != NULL; ix++)
470     {
471       if (*argv[ix] == '$')
472         delete_trace_state_variable (argv[ix] + 1);
473       else
474         warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
475     }
476
477   do_cleanups (back_to);
478
479   dont_repeat ();
480 }
481
482 void
483 tvariables_info_1 (void)
484 {
485   struct trace_state_variable *tsv;
486   int ix;
487   int count = 0;
488   struct cleanup *back_to;
489   struct ui_out *uiout = current_uiout;
490
491   if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
492     {
493       printf_filtered (_("No trace state variables.\n"));
494       return;
495     }
496
497   /* Try to acquire values from the target.  */
498   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
499     tsv->value_known = target_get_trace_state_variable_value (tsv->number,
500                                                               &(tsv->value));
501
502   back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
503                                                  count, "trace-variables");
504   ui_out_table_header (uiout, 15, ui_left, "name", "Name");
505   ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
506   ui_out_table_header (uiout, 11, ui_left, "current", "Current");
507
508   ui_out_table_body (uiout);
509
510   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
511     {
512       struct cleanup *back_to2;
513       char *c;
514       char *name;
515
516       back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
517
518       name = concat ("$", tsv->name, (char *) NULL);
519       make_cleanup (xfree, name);
520       ui_out_field_string (uiout, "name", name);
521       ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
522
523       if (tsv->value_known)
524         c = plongest (tsv->value);
525       else if (ui_out_is_mi_like_p (uiout))
526         /* For MI, we prefer not to use magic string constants, but rather
527            omit the field completely.  The difference between unknown and
528            undefined does not seem important enough to represent.  */
529         c = NULL;
530       else if (current_trace_status ()->running || traceframe_number >= 0)
531         /* The value is/was defined, but we don't have it.  */
532         c = "<unknown>";
533       else
534         /* It is not meaningful to ask about the value.  */
535         c = "<undefined>";
536       if (c)
537         ui_out_field_string (uiout, "current", c);
538       ui_out_text (uiout, "\n");
539
540       do_cleanups (back_to2);
541     }
542
543   do_cleanups (back_to);
544 }
545
546 /* List all the trace state variables.  */
547
548 static void
549 tvariables_info (char *args, int from_tty)
550 {
551   tvariables_info_1 ();
552 }
553
554 /* Stash definitions of tsvs into the given file.  */
555
556 void
557 save_trace_state_variables (struct ui_file *fp)
558 {
559   struct trace_state_variable *tsv;
560   int ix;
561
562   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
563     {
564       fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
565       if (tsv->initial_value)
566         fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
567       fprintf_unfiltered (fp, "\n");
568     }
569 }
570
571 /* ACTIONS functions: */
572
573 /* The three functions:
574    collect_pseudocommand, 
575    while_stepping_pseudocommand, and 
576    end_actions_pseudocommand
577    are placeholders for "commands" that are actually ONLY to be used
578    within a tracepoint action list.  If the actual function is ever called,
579    it means that somebody issued the "command" at the top level,
580    which is always an error.  */
581
582 static void
583 end_actions_pseudocommand (char *args, int from_tty)
584 {
585   error (_("This command cannot be used at the top level."));
586 }
587
588 static void
589 while_stepping_pseudocommand (char *args, int from_tty)
590 {
591   error (_("This command can only be used in a tracepoint actions list."));
592 }
593
594 static void
595 collect_pseudocommand (char *args, int from_tty)
596 {
597   error (_("This command can only be used in a tracepoint actions list."));
598 }
599
600 static void
601 teval_pseudocommand (char *args, int from_tty)
602 {
603   error (_("This command can only be used in a tracepoint actions list."));
604 }
605
606 /* Parse any collection options, such as /s for strings.  */
607
608 const char *
609 decode_agent_options (const char *exp, int *trace_string)
610 {
611   struct value_print_options opts;
612
613   *trace_string = 0;
614
615   if (*exp != '/')
616     return exp;
617
618   /* Call this to borrow the print elements default for collection
619      size.  */
620   get_user_print_options (&opts);
621
622   exp++;
623   if (*exp == 's')
624     {
625       if (target_supports_string_tracing ())
626         {
627           /* Allow an optional decimal number giving an explicit maximum
628              string length, defaulting it to the "print elements" value;
629              so "collect/s80 mystr" gets at most 80 bytes of string.  */
630           *trace_string = opts.print_max;
631           exp++;
632           if (*exp >= '0' && *exp <= '9')
633             *trace_string = atoi (exp);
634           while (*exp >= '0' && *exp <= '9')
635             exp++;
636         }
637       else
638         error (_("Target does not support \"/s\" option for string tracing."));
639     }
640   else
641     error (_("Undefined collection format \"%c\"."), *exp);
642
643   exp = skip_spaces_const (exp);
644
645   return exp;
646 }
647
648 /* Enter a list of actions for a tracepoint.  */
649 static void
650 trace_actions_command (char *args, int from_tty)
651 {
652   struct tracepoint *t;
653   struct command_line *l;
654
655   t = get_tracepoint_by_number (&args, NULL, 1);
656   if (t)
657     {
658       char *tmpbuf =
659         xstrprintf ("Enter actions for tracepoint %d, one per line.",
660                     t->base.number);
661       struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
662
663       l = read_command_lines (tmpbuf, from_tty, 1,
664                               check_tracepoint_command, t);
665       do_cleanups (cleanups);
666       breakpoint_set_commands (&t->base, l);
667     }
668   /* else just return */
669 }
670
671 /* Report the results of checking the agent expression, as errors or
672    internal errors.  */
673
674 static void
675 report_agent_reqs_errors (struct agent_expr *aexpr)
676 {
677   /* All of the "flaws" are serious bytecode generation issues that
678      should never occur.  */
679   if (aexpr->flaw != agent_flaw_none)
680     internal_error (__FILE__, __LINE__, _("expression is malformed"));
681
682   /* If analysis shows a stack underflow, GDB must have done something
683      badly wrong in its bytecode generation.  */
684   if (aexpr->min_height < 0)
685     internal_error (__FILE__, __LINE__,
686                     _("expression has min height < 0"));
687
688   /* Issue this error if the stack is predicted to get too deep.  The
689      limit is rather arbitrary; a better scheme might be for the
690      target to report how much stack it will have available.  The
691      depth roughly corresponds to parenthesization, so a limit of 20
692      amounts to 20 levels of expression nesting, which is actually
693      a pretty big hairy expression.  */
694   if (aexpr->max_height > 20)
695     error (_("Expression is too complicated."));
696 }
697
698 /* worker function */
699 void
700 validate_actionline (const char *line, struct breakpoint *b)
701 {
702   struct cmd_list_element *c;
703   struct expression *exp = NULL;
704   struct cleanup *old_chain = NULL;
705   const char *tmp_p;
706   const char *p;
707   struct bp_location *loc;
708   struct agent_expr *aexpr;
709   struct tracepoint *t = (struct tracepoint *) b;
710
711   /* If EOF is typed, *line is NULL.  */
712   if (line == NULL)
713     return;
714
715   p = skip_spaces_const (line);
716
717   /* Symbol lookup etc.  */
718   if (*p == '\0')       /* empty line: just prompt for another line.  */
719     return;
720
721   if (*p == '#')                /* comment line */
722     return;
723
724   c = lookup_cmd (&p, cmdlist, "", -1, 1);
725   if (c == 0)
726     error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
727
728   if (cmd_cfunc_eq (c, collect_pseudocommand))
729     {
730       int trace_string = 0;
731
732       if (*p == '/')
733         p = decode_agent_options (p, &trace_string);
734
735       do
736         {                       /* Repeat over a comma-separated list.  */
737           QUIT;                 /* Allow user to bail out with ^C.  */
738           p = skip_spaces_const (p);
739
740           if (*p == '$')        /* Look for special pseudo-symbols.  */
741             {
742               if (0 == strncasecmp ("reg", p + 1, 3)
743                   || 0 == strncasecmp ("arg", p + 1, 3)
744                   || 0 == strncasecmp ("loc", p + 1, 3)
745                   || 0 == strncasecmp ("_ret", p + 1, 4)
746                   || 0 == strncasecmp ("_sdata", p + 1, 6))
747                 {
748                   p = strchr (p, ',');
749                   continue;
750                 }
751               /* else fall thru, treat p as an expression and parse it!  */
752             }
753           tmp_p = p;
754           for (loc = t->base.loc; loc; loc = loc->next)
755             {
756               p = tmp_p;
757               exp = parse_exp_1 (&p, loc->address,
758                                  block_for_pc (loc->address), 1);
759               old_chain = make_cleanup (free_current_contents, &exp);
760
761               if (exp->elts[0].opcode == OP_VAR_VALUE)
762                 {
763                   if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
764                     {
765                       error (_("constant `%s' (value %s) "
766                                "will not be collected."),
767                              SYMBOL_PRINT_NAME (exp->elts[2].symbol),
768                              plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
769                     }
770                   else if (SYMBOL_CLASS (exp->elts[2].symbol)
771                            == LOC_OPTIMIZED_OUT)
772                     {
773                       error (_("`%s' is optimized away "
774                                "and cannot be collected."),
775                              SYMBOL_PRINT_NAME (exp->elts[2].symbol));
776                     }
777                 }
778
779               /* We have something to collect, make sure that the expr to
780                  bytecode translator can handle it and that it's not too
781                  long.  */
782               aexpr = gen_trace_for_expr (loc->address, exp, trace_string);
783               make_cleanup_free_agent_expr (aexpr);
784
785               if (aexpr->len > MAX_AGENT_EXPR_LEN)
786                 error (_("Expression is too complicated."));
787
788               ax_reqs (aexpr);
789
790               report_agent_reqs_errors (aexpr);
791
792               do_cleanups (old_chain);
793             }
794         }
795       while (p && *p++ == ',');
796     }
797
798   else if (cmd_cfunc_eq (c, teval_pseudocommand))
799     {
800       do
801         {                       /* Repeat over a comma-separated list.  */
802           QUIT;                 /* Allow user to bail out with ^C.  */
803           p = skip_spaces_const (p);
804
805           tmp_p = p;
806           for (loc = t->base.loc; loc; loc = loc->next)
807             {
808               p = tmp_p;
809
810               /* Only expressions are allowed for this action.  */
811               exp = parse_exp_1 (&p, loc->address,
812                                  block_for_pc (loc->address), 1);
813               old_chain = make_cleanup (free_current_contents, &exp);
814
815               /* We have something to evaluate, make sure that the expr to
816                  bytecode translator can handle it and that it's not too
817                  long.  */
818               aexpr = gen_eval_for_expr (loc->address, exp);
819               make_cleanup_free_agent_expr (aexpr);
820
821               if (aexpr->len > MAX_AGENT_EXPR_LEN)
822                 error (_("Expression is too complicated."));
823
824               ax_reqs (aexpr);
825               report_agent_reqs_errors (aexpr);
826
827               do_cleanups (old_chain);
828             }
829         }
830       while (p && *p++ == ',');
831     }
832
833   else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
834     {
835       char *endp;
836
837       p = skip_spaces_const (p);
838       t->step_count = strtol (p, &endp, 0);
839       if (endp == p || t->step_count == 0)
840         error (_("while-stepping step count `%s' is malformed."), line);
841       p = endp;
842     }
843
844   else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
845     ;
846
847   else
848     error (_("`%s' is not a supported tracepoint action."), line);
849 }
850
851 enum {
852   memrange_absolute = -1
853 };
854
855 struct memrange
856 {
857   int type;             /* memrange_absolute for absolute memory range,
858                            else basereg number.  */
859   bfd_signed_vma start;
860   bfd_signed_vma end;
861 };
862
863 struct collection_list
864   {
865     unsigned char regs_mask[32];        /* room for up to 256 regs */
866     long listsize;
867     long next_memrange;
868     struct memrange *list;
869     long aexpr_listsize;        /* size of array pointed to by expr_list elt */
870     long next_aexpr_elt;
871     struct agent_expr **aexpr_list;
872
873     /* True is the user requested a collection of "$_sdata", "static
874        tracepoint data".  */
875     int strace_data;
876   }
877 tracepoint_list, stepping_list;
878
879 /* MEMRANGE functions: */
880
881 static int memrange_cmp (const void *, const void *);
882
883 /* Compare memranges for qsort.  */
884 static int
885 memrange_cmp (const void *va, const void *vb)
886 {
887   const struct memrange *a = va, *b = vb;
888
889   if (a->type < b->type)
890     return -1;
891   if (a->type > b->type)
892     return 1;
893   if (a->type == memrange_absolute)
894     {
895       if ((bfd_vma) a->start < (bfd_vma) b->start)
896         return -1;
897       if ((bfd_vma) a->start > (bfd_vma) b->start)
898         return 1;
899     }
900   else
901     {
902       if (a->start < b->start)
903         return -1;
904       if (a->start > b->start)
905         return 1;
906     }
907   return 0;
908 }
909
910 /* Sort the memrange list using qsort, and merge adjacent memranges.  */
911 static void
912 memrange_sortmerge (struct collection_list *memranges)
913 {
914   int a, b;
915
916   qsort (memranges->list, memranges->next_memrange,
917          sizeof (struct memrange), memrange_cmp);
918   if (memranges->next_memrange > 0)
919     {
920       for (a = 0, b = 1; b < memranges->next_memrange; b++)
921         {
922           /* If memrange b overlaps or is adjacent to memrange a,
923              merge them.  */
924           if (memranges->list[a].type == memranges->list[b].type
925               && memranges->list[b].start <= memranges->list[a].end)
926             {
927               if (memranges->list[b].end > memranges->list[a].end)
928                 memranges->list[a].end = memranges->list[b].end;
929               continue;         /* next b, same a */
930             }
931           a++;                  /* next a */
932           if (a != b)
933             memcpy (&memranges->list[a], &memranges->list[b],
934                     sizeof (struct memrange));
935         }
936       memranges->next_memrange = a + 1;
937     }
938 }
939
940 /* Add a register to a collection list.  */
941 static void
942 add_register (struct collection_list *collection, unsigned int regno)
943 {
944   if (info_verbose)
945     printf_filtered ("collect register %d\n", regno);
946   if (regno >= (8 * sizeof (collection->regs_mask)))
947     error (_("Internal: register number %d too large for tracepoint"),
948            regno);
949   collection->regs_mask[regno / 8] |= 1 << (regno % 8);
950 }
951
952 /* Add a memrange to a collection list.  */
953 static void
954 add_memrange (struct collection_list *memranges, 
955               int type, bfd_signed_vma base,
956               unsigned long len)
957 {
958   if (info_verbose)
959     {
960       printf_filtered ("(%d,", type);
961       printf_vma (base);
962       printf_filtered (",%ld)\n", len);
963     }
964
965   /* type: memrange_absolute == memory, other n == basereg */
966   memranges->list[memranges->next_memrange].type = type;
967   /* base: addr if memory, offset if reg relative.  */
968   memranges->list[memranges->next_memrange].start = base;
969   /* len: we actually save end (base + len) for convenience */
970   memranges->list[memranges->next_memrange].end = base + len;
971   memranges->next_memrange++;
972   if (memranges->next_memrange >= memranges->listsize)
973     {
974       memranges->listsize *= 2;
975       memranges->list = xrealloc (memranges->list,
976                                   memranges->listsize);
977     }
978
979   if (type != memrange_absolute)    /* Better collect the base register!  */
980     add_register (memranges, type);
981 }
982
983 /* Add a symbol to a collection list.  */
984 static void
985 collect_symbol (struct collection_list *collect, 
986                 struct symbol *sym,
987                 struct gdbarch *gdbarch,
988                 long frame_regno, long frame_offset,
989                 CORE_ADDR scope,
990                 int trace_string)
991 {
992   unsigned long len;
993   unsigned int reg;
994   bfd_signed_vma offset;
995   int treat_as_expr = 0;
996
997   len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
998   switch (SYMBOL_CLASS (sym))
999     {
1000     default:
1001       printf_filtered ("%s: don't know symbol class %d\n",
1002                        SYMBOL_PRINT_NAME (sym),
1003                        SYMBOL_CLASS (sym));
1004       break;
1005     case LOC_CONST:
1006       printf_filtered ("constant %s (value %s) will not be collected.\n",
1007                        SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
1008       break;
1009     case LOC_STATIC:
1010       offset = SYMBOL_VALUE_ADDRESS (sym);
1011       if (info_verbose)
1012         {
1013           char tmp[40];
1014
1015           sprintf_vma (tmp, offset);
1016           printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
1017                            SYMBOL_PRINT_NAME (sym), len,
1018                            tmp /* address */);
1019         }
1020       /* A struct may be a C++ class with static fields, go to general
1021          expression handling.  */
1022       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
1023         treat_as_expr = 1;
1024       else
1025         add_memrange (collect, memrange_absolute, offset, len);
1026       break;
1027     case LOC_REGISTER:
1028       reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
1029       if (info_verbose)
1030         printf_filtered ("LOC_REG[parm] %s: ", 
1031                          SYMBOL_PRINT_NAME (sym));
1032       add_register (collect, reg);
1033       /* Check for doubles stored in two registers.  */
1034       /* FIXME: how about larger types stored in 3 or more regs?  */
1035       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
1036           len > register_size (gdbarch, reg))
1037         add_register (collect, reg + 1);
1038       break;
1039     case LOC_REF_ARG:
1040       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
1041       printf_filtered ("       (will not collect %s)\n",
1042                        SYMBOL_PRINT_NAME (sym));
1043       break;
1044     case LOC_ARG:
1045       reg = frame_regno;
1046       offset = frame_offset + SYMBOL_VALUE (sym);
1047       if (info_verbose)
1048         {
1049           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1050                            SYMBOL_PRINT_NAME (sym), len);
1051           printf_vma (offset);
1052           printf_filtered (" from frame ptr reg %d\n", reg);
1053         }
1054       add_memrange (collect, reg, offset, len);
1055       break;
1056     case LOC_REGPARM_ADDR:
1057       reg = SYMBOL_VALUE (sym);
1058       offset = 0;
1059       if (info_verbose)
1060         {
1061           printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
1062                            SYMBOL_PRINT_NAME (sym), len);
1063           printf_vma (offset);
1064           printf_filtered (" from reg %d\n", reg);
1065         }
1066       add_memrange (collect, reg, offset, len);
1067       break;
1068     case LOC_LOCAL:
1069       reg = frame_regno;
1070       offset = frame_offset + SYMBOL_VALUE (sym);
1071       if (info_verbose)
1072         {
1073           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1074                            SYMBOL_PRINT_NAME (sym), len);
1075           printf_vma (offset);
1076           printf_filtered (" from frame ptr reg %d\n", reg);
1077         }
1078       add_memrange (collect, reg, offset, len);
1079       break;
1080
1081     case LOC_UNRESOLVED:
1082       treat_as_expr = 1;
1083       break;
1084
1085     case LOC_OPTIMIZED_OUT:
1086       printf_filtered ("%s has been optimized out of existence.\n",
1087                        SYMBOL_PRINT_NAME (sym));
1088       break;
1089
1090     case LOC_COMPUTED:
1091       treat_as_expr = 1;
1092       break;
1093     }
1094
1095   /* Expressions are the most general case.  */
1096   if (treat_as_expr)
1097     {
1098       struct agent_expr *aexpr;
1099       struct cleanup *old_chain1 = NULL;
1100
1101       aexpr = gen_trace_for_var (scope, gdbarch, sym, trace_string);
1102
1103       /* It can happen that the symbol is recorded as a computed
1104          location, but it's been optimized away and doesn't actually
1105          have a location expression.  */
1106       if (!aexpr)
1107         {
1108           printf_filtered ("%s has been optimized out of existence.\n",
1109                            SYMBOL_PRINT_NAME (sym));
1110           return;
1111         }
1112
1113       old_chain1 = make_cleanup_free_agent_expr (aexpr);
1114
1115       ax_reqs (aexpr);
1116
1117       report_agent_reqs_errors (aexpr);
1118
1119       discard_cleanups (old_chain1);
1120       add_aexpr (collect, aexpr);
1121
1122       /* Take care of the registers.  */
1123       if (aexpr->reg_mask_len > 0)
1124         {
1125           int ndx1, ndx2;
1126
1127           for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1128             {
1129               QUIT;     /* Allow user to bail out with ^C.  */
1130               if (aexpr->reg_mask[ndx1] != 0)
1131                 {
1132                   /* Assume chars have 8 bits.  */
1133                   for (ndx2 = 0; ndx2 < 8; ndx2++)
1134                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1135                       /* It's used -- record it.  */
1136                       add_register (collect, ndx1 * 8 + ndx2);
1137                 }
1138             }
1139         }
1140     }
1141 }
1142
1143 /* Data to be passed around in the calls to the locals and args
1144    iterators.  */
1145
1146 struct add_local_symbols_data
1147 {
1148   struct collection_list *collect;
1149   struct gdbarch *gdbarch;
1150   CORE_ADDR pc;
1151   long frame_regno;
1152   long frame_offset;
1153   int count;
1154   int trace_string;
1155 };
1156
1157 /* The callback for the locals and args iterators.  */
1158
1159 static void
1160 do_collect_symbol (const char *print_name,
1161                    struct symbol *sym,
1162                    void *cb_data)
1163 {
1164   struct add_local_symbols_data *p = cb_data;
1165
1166   collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1167                   p->frame_offset, p->pc, p->trace_string);
1168   p->count++;
1169 }
1170
1171 /* Add all locals (or args) symbols to collection list.  */
1172 static void
1173 add_local_symbols (struct collection_list *collect,
1174                    struct gdbarch *gdbarch, CORE_ADDR pc,
1175                    long frame_regno, long frame_offset, int type,
1176                    int trace_string)
1177 {
1178   struct block *block;
1179   struct add_local_symbols_data cb_data;
1180
1181   cb_data.collect = collect;
1182   cb_data.gdbarch = gdbarch;
1183   cb_data.pc = pc;
1184   cb_data.frame_regno = frame_regno;
1185   cb_data.frame_offset = frame_offset;
1186   cb_data.count = 0;
1187   cb_data.trace_string = trace_string;
1188
1189   if (type == 'L')
1190     {
1191       block = block_for_pc (pc);
1192       if (block == NULL)
1193         {
1194           warning (_("Can't collect locals; "
1195                      "no symbol table info available.\n"));
1196           return;
1197         }
1198
1199       iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1200       if (cb_data.count == 0)
1201         warning (_("No locals found in scope."));
1202     }
1203   else
1204     {
1205       pc = get_pc_function_start (pc);
1206       block = block_for_pc (pc);
1207       if (block == NULL)
1208         {
1209           warning (_("Can't collect args; no symbol table info available."));
1210           return;
1211         }
1212
1213       iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1214       if (cb_data.count == 0)
1215         warning (_("No args found in scope."));
1216     }
1217 }
1218
1219 static void
1220 add_static_trace_data (struct collection_list *collection)
1221 {
1222   if (info_verbose)
1223     printf_filtered ("collect static trace data\n");
1224   collection->strace_data = 1;
1225 }
1226
1227 /* worker function */
1228 static void
1229 clear_collection_list (struct collection_list *list)
1230 {
1231   int ndx;
1232
1233   list->next_memrange = 0;
1234   for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1235     {
1236       free_agent_expr (list->aexpr_list[ndx]);
1237       list->aexpr_list[ndx] = NULL;
1238     }
1239   list->next_aexpr_elt = 0;
1240   memset (list->regs_mask, 0, sizeof (list->regs_mask));
1241   list->strace_data = 0;
1242 }
1243
1244 /* Reduce a collection list to string form (for gdb protocol).  */
1245 static char **
1246 stringify_collection_list (struct collection_list *list)
1247 {
1248   char temp_buf[2048];
1249   char tmp2[40];
1250   int count;
1251   int ndx = 0;
1252   char *(*str_list)[];
1253   char *end;
1254   long i;
1255
1256   count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
1257   str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1258
1259   if (list->strace_data)
1260     {
1261       if (info_verbose)
1262         printf_filtered ("\nCollecting static trace data\n");
1263       end = temp_buf;
1264       *end++ = 'L';
1265       (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1266       ndx++;
1267     }
1268
1269   for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1270     if (list->regs_mask[i] != 0)    /* Skip leading zeroes in regs_mask.  */
1271       break;
1272   if (list->regs_mask[i] != 0)  /* Prepare to send regs_mask to the stub.  */
1273     {
1274       if (info_verbose)
1275         printf_filtered ("\nCollecting registers (mask): 0x");
1276       end = temp_buf;
1277       *end++ = 'R';
1278       for (; i >= 0; i--)
1279         {
1280           QUIT;                 /* Allow user to bail out with ^C.  */
1281           if (info_verbose)
1282             printf_filtered ("%02X", list->regs_mask[i]);
1283           sprintf (end, "%02X", list->regs_mask[i]);
1284           end += 2;
1285         }
1286       (*str_list)[ndx] = xstrdup (temp_buf);
1287       ndx++;
1288     }
1289   if (info_verbose)
1290     printf_filtered ("\n");
1291   if (list->next_memrange > 0 && info_verbose)
1292     printf_filtered ("Collecting memranges: \n");
1293   for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1294     {
1295       QUIT;                     /* Allow user to bail out with ^C.  */
1296       sprintf_vma (tmp2, list->list[i].start);
1297       if (info_verbose)
1298         {
1299           printf_filtered ("(%d, %s, %ld)\n", 
1300                            list->list[i].type, 
1301                            tmp2, 
1302                            (long) (list->list[i].end - list->list[i].start));
1303         }
1304       if (count + 27 > MAX_AGENT_EXPR_LEN)
1305         {
1306           (*str_list)[ndx] = savestring (temp_buf, count);
1307           ndx++;
1308           count = 0;
1309           end = temp_buf;
1310         }
1311
1312       {
1313         bfd_signed_vma length = list->list[i].end - list->list[i].start;
1314
1315         /* The "%X" conversion specifier expects an unsigned argument,
1316            so passing -1 (memrange_absolute) to it directly gives you
1317            "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1318            Special-case it.  */
1319         if (list->list[i].type == memrange_absolute)
1320           sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1321         else
1322           sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1323       }
1324
1325       count += strlen (end);
1326       end = temp_buf + count;
1327     }
1328
1329   for (i = 0; i < list->next_aexpr_elt; i++)
1330     {
1331       QUIT;                     /* Allow user to bail out with ^C.  */
1332       if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1333         {
1334           (*str_list)[ndx] = savestring (temp_buf, count);
1335           ndx++;
1336           count = 0;
1337           end = temp_buf;
1338         }
1339       sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1340       end += 10;                /* 'X' + 8 hex digits + ',' */
1341       count += 10;
1342
1343       end = mem2hex (list->aexpr_list[i]->buf, 
1344                      end, list->aexpr_list[i]->len);
1345       count += 2 * list->aexpr_list[i]->len;
1346     }
1347
1348   if (count != 0)
1349     {
1350       (*str_list)[ndx] = savestring (temp_buf, count);
1351       ndx++;
1352       count = 0;
1353       end = temp_buf;
1354     }
1355   (*str_list)[ndx] = NULL;
1356
1357   if (ndx == 0)
1358     {
1359       xfree (str_list);
1360       return NULL;
1361     }
1362   else
1363     return *str_list;
1364 }
1365
1366
1367 static void
1368 encode_actions_1 (struct command_line *action,
1369                   struct bp_location *tloc,
1370                   int frame_reg,
1371                   LONGEST frame_offset,
1372                   struct collection_list *collect,
1373                   struct collection_list *stepping_list)
1374 {
1375   const char *action_exp;
1376   struct expression *exp = NULL;
1377   int i;
1378   struct value *tempval;
1379   struct cmd_list_element *cmd;
1380   struct agent_expr *aexpr;
1381
1382   for (; action; action = action->next)
1383     {
1384       QUIT;                     /* Allow user to bail out with ^C.  */
1385       action_exp = action->line;
1386       action_exp = skip_spaces_const (action_exp);
1387
1388       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1389       if (cmd == 0)
1390         error (_("Bad action list item: %s"), action_exp);
1391
1392       if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1393         {
1394           int trace_string = 0;
1395
1396           if (*action_exp == '/')
1397             action_exp = decode_agent_options (action_exp, &trace_string);
1398
1399           do
1400             {                   /* Repeat over a comma-separated list.  */
1401               QUIT;             /* Allow user to bail out with ^C.  */
1402               action_exp = skip_spaces_const (action_exp);
1403
1404               if (0 == strncasecmp ("$reg", action_exp, 4))
1405                 {
1406                   for (i = 0; i < gdbarch_num_regs (tloc->gdbarch); i++)
1407                     add_register (collect, i);
1408                   action_exp = strchr (action_exp, ',');        /* more? */
1409                 }
1410               else if (0 == strncasecmp ("$arg", action_exp, 4))
1411                 {
1412                   add_local_symbols (collect,
1413                                      tloc->gdbarch,
1414                                      tloc->address,
1415                                      frame_reg,
1416                                      frame_offset,
1417                                      'A',
1418                                      trace_string);
1419                   action_exp = strchr (action_exp, ',');        /* more? */
1420                 }
1421               else if (0 == strncasecmp ("$loc", action_exp, 4))
1422                 {
1423                   add_local_symbols (collect,
1424                                      tloc->gdbarch,
1425                                      tloc->address,
1426                                      frame_reg,
1427                                      frame_offset,
1428                                      'L',
1429                                      trace_string);
1430                   action_exp = strchr (action_exp, ',');        /* more? */
1431                 }
1432               else if (0 == strncasecmp ("$_ret", action_exp, 5))
1433                 {
1434                   struct cleanup *old_chain1 = NULL;
1435
1436                   aexpr = gen_trace_for_return_address (tloc->address,
1437                                                         tloc->gdbarch,
1438                                                         trace_string);
1439
1440                   old_chain1 = make_cleanup_free_agent_expr (aexpr);
1441
1442                   ax_reqs (aexpr);
1443                   report_agent_reqs_errors (aexpr);
1444
1445                   discard_cleanups (old_chain1);
1446                   add_aexpr (collect, aexpr);
1447
1448                   /* take care of the registers */
1449                   if (aexpr->reg_mask_len > 0)
1450                     {
1451                       int ndx1, ndx2;
1452
1453                       for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1454                         {
1455                           QUIT; /* allow user to bail out with ^C */
1456                           if (aexpr->reg_mask[ndx1] != 0)
1457                             {
1458                               /* assume chars have 8 bits */
1459                               for (ndx2 = 0; ndx2 < 8; ndx2++)
1460                                 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1461                                   /* it's used -- record it */
1462                                   add_register (collect, 
1463                                                 ndx1 * 8 + ndx2);
1464                             }
1465                         }
1466                     }
1467
1468                   action_exp = strchr (action_exp, ',');        /* more? */
1469                 }
1470               else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1471                 {
1472                   add_static_trace_data (collect);
1473                   action_exp = strchr (action_exp, ',');        /* more? */
1474                 }
1475               else
1476                 {
1477                   unsigned long addr;
1478                   struct cleanup *old_chain = NULL;
1479                   struct cleanup *old_chain1 = NULL;
1480
1481                   exp = parse_exp_1 (&action_exp, tloc->address,
1482                                      block_for_pc (tloc->address), 1);
1483                   old_chain = make_cleanup (free_current_contents, &exp);
1484
1485                   switch (exp->elts[0].opcode)
1486                     {
1487                     case OP_REGISTER:
1488                       {
1489                         const char *name = &exp->elts[2].string;
1490
1491                         i = user_reg_map_name_to_regnum (tloc->gdbarch,
1492                                                          name, strlen (name));
1493                         if (i == -1)
1494                           internal_error (__FILE__, __LINE__,
1495                                           _("Register $%s not available"),
1496                                           name);
1497                         if (info_verbose)
1498                           printf_filtered ("OP_REGISTER: ");
1499                         add_register (collect, i);
1500                         break;
1501                       }
1502
1503                     case UNOP_MEMVAL:
1504                       /* Safe because we know it's a simple expression.  */
1505                       tempval = evaluate_expression (exp);
1506                       addr = value_address (tempval);
1507                       /* Initialize the TYPE_LENGTH if it is a typedef.  */
1508                       check_typedef (exp->elts[1].type);
1509                       add_memrange (collect, memrange_absolute, addr,
1510                                     TYPE_LENGTH (exp->elts[1].type));
1511                       break;
1512
1513                     case OP_VAR_VALUE:
1514                       collect_symbol (collect,
1515                                       exp->elts[2].symbol,
1516                                       tloc->gdbarch,
1517                                       frame_reg,
1518                                       frame_offset,
1519                                       tloc->address,
1520                                       trace_string);
1521                       break;
1522
1523                     default:    /* Full-fledged expression.  */
1524                       aexpr = gen_trace_for_expr (tloc->address, exp,
1525                                                   trace_string);
1526
1527                       old_chain1 = make_cleanup_free_agent_expr (aexpr);
1528
1529                       ax_reqs (aexpr);
1530
1531                       report_agent_reqs_errors (aexpr);
1532
1533                       discard_cleanups (old_chain1);
1534                       add_aexpr (collect, aexpr);
1535
1536                       /* Take care of the registers.  */
1537                       if (aexpr->reg_mask_len > 0)
1538                         {
1539                           int ndx1;
1540                           int ndx2;
1541
1542                           for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1543                             {
1544                               QUIT;     /* Allow user to bail out with ^C.  */
1545                               if (aexpr->reg_mask[ndx1] != 0)
1546                                 {
1547                                   /* Assume chars have 8 bits.  */
1548                                   for (ndx2 = 0; ndx2 < 8; ndx2++)
1549                                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1550                                       /* It's used -- record it.  */
1551                                       add_register (collect, 
1552                                                     ndx1 * 8 + ndx2);
1553                                 }
1554                             }
1555                         }
1556                       break;
1557                     }           /* switch */
1558                   do_cleanups (old_chain);
1559                 }               /* do */
1560             }
1561           while (action_exp && *action_exp++ == ',');
1562         }                       /* if */
1563       else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1564         {
1565           do
1566             {                   /* Repeat over a comma-separated list.  */
1567               QUIT;             /* Allow user to bail out with ^C.  */
1568               action_exp = skip_spaces_const (action_exp);
1569
1570                 {
1571                   struct cleanup *old_chain = NULL;
1572                   struct cleanup *old_chain1 = NULL;
1573
1574                   exp = parse_exp_1 (&action_exp, tloc->address,
1575                                      block_for_pc (tloc->address), 1);
1576                   old_chain = make_cleanup (free_current_contents, &exp);
1577
1578                   aexpr = gen_eval_for_expr (tloc->address, exp);
1579                   old_chain1 = make_cleanup_free_agent_expr (aexpr);
1580
1581                   ax_reqs (aexpr);
1582                   report_agent_reqs_errors (aexpr);
1583
1584                   discard_cleanups (old_chain1);
1585                   /* Even though we're not officially collecting, add
1586                      to the collect list anyway.  */
1587                   add_aexpr (collect, aexpr);
1588
1589                   do_cleanups (old_chain);
1590                 }               /* do */
1591             }
1592           while (action_exp && *action_exp++ == ',');
1593         }                       /* if */
1594       else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1595         {
1596           /* We check against nested while-stepping when setting
1597              breakpoint action, so no way to run into nested
1598              here.  */
1599           gdb_assert (stepping_list);
1600
1601           encode_actions_1 (action->body_list[0], tloc, frame_reg,
1602                             frame_offset, stepping_list, NULL);
1603         }
1604       else
1605         error (_("Invalid tracepoint command '%s'"), action->line);
1606     }                           /* for */
1607 }
1608
1609 /* Render all actions into gdb protocol.  */
1610
1611 void
1612 encode_actions (struct bp_location *tloc, char ***tdp_actions,
1613                 char ***stepping_actions)
1614 {
1615   char *default_collect_line = NULL;
1616   struct command_line *actions;
1617   struct command_line *default_collect_action = NULL;
1618   int frame_reg;
1619   LONGEST frame_offset;
1620   struct cleanup *back_to;
1621
1622   back_to = make_cleanup (null_cleanup, NULL);
1623
1624   clear_collection_list (&tracepoint_list);
1625   clear_collection_list (&stepping_list);
1626
1627   *tdp_actions = NULL;
1628   *stepping_actions = NULL;
1629
1630   gdbarch_virtual_frame_pointer (tloc->gdbarch,
1631                                  tloc->address, &frame_reg, &frame_offset);
1632
1633   actions = all_tracepoint_actions_and_cleanup (tloc->owner);
1634
1635   encode_actions_1 (actions, tloc, frame_reg, frame_offset,
1636                     &tracepoint_list, &stepping_list);
1637
1638   memrange_sortmerge (&tracepoint_list);
1639   memrange_sortmerge (&stepping_list);
1640
1641   *tdp_actions = stringify_collection_list (&tracepoint_list);
1642   *stepping_actions = stringify_collection_list (&stepping_list);
1643
1644   do_cleanups (back_to);
1645 }
1646
1647 static void
1648 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1649 {
1650   if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1651     {
1652       collect->aexpr_list =
1653         xrealloc (collect->aexpr_list,
1654                   2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1655       collect->aexpr_listsize *= 2;
1656     }
1657   collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1658   collect->next_aexpr_elt++;
1659 }
1660
1661 static void
1662 process_tracepoint_on_disconnect (void)
1663 {
1664   VEC(breakpoint_p) *tp_vec = NULL;
1665   int ix;
1666   struct breakpoint *b;
1667   int has_pending_p = 0;
1668
1669   /* Check whether we still have pending tracepoint.  If we have, warn the
1670      user that pending tracepoint will no longer work.  */
1671   tp_vec = all_tracepoints ();
1672   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1673     {
1674       if (b->loc == NULL)
1675         {
1676           has_pending_p = 1;
1677           break;
1678         }
1679       else
1680         {
1681           struct bp_location *loc1;
1682
1683           for (loc1 = b->loc; loc1; loc1 = loc1->next)
1684             {
1685               if (loc1->shlib_disabled)
1686                 {
1687                   has_pending_p = 1;
1688                   break;
1689                 }
1690             }
1691
1692           if (has_pending_p)
1693             break;
1694         }
1695     }
1696   VEC_free (breakpoint_p, tp_vec);
1697
1698   if (has_pending_p)
1699     warning (_("Pending tracepoints will not be resolved while"
1700                " GDB is disconnected\n"));
1701 }
1702
1703
1704 void
1705 start_tracing (char *notes)
1706 {
1707   VEC(breakpoint_p) *tp_vec = NULL;
1708   int ix;
1709   struct breakpoint *b;
1710   struct trace_state_variable *tsv;
1711   int any_enabled = 0, num_to_download = 0;
1712   int ret;
1713
1714   tp_vec = all_tracepoints ();
1715
1716   /* No point in tracing without any tracepoints...  */
1717   if (VEC_length (breakpoint_p, tp_vec) == 0)
1718     {
1719       VEC_free (breakpoint_p, tp_vec);
1720       error (_("No tracepoints defined, not starting trace"));
1721     }
1722
1723   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1724     {
1725       struct tracepoint *t = (struct tracepoint *) b;
1726       struct bp_location *loc;
1727
1728       if (b->enable_state == bp_enabled)
1729         any_enabled = 1;
1730
1731       if ((b->type == bp_fast_tracepoint
1732            ? may_insert_fast_tracepoints
1733            : may_insert_tracepoints))
1734         ++num_to_download;
1735       else
1736         warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1737                  (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1738     }
1739
1740   if (!any_enabled)
1741     {
1742       if (target_supports_enable_disable_tracepoint ())
1743         warning (_("No tracepoints enabled"));
1744       else
1745         {
1746           /* No point in tracing with only disabled tracepoints that
1747              cannot be re-enabled.  */
1748           VEC_free (breakpoint_p, tp_vec);
1749           error (_("No tracepoints enabled, not starting trace"));
1750         }
1751     }
1752
1753   if (num_to_download <= 0)
1754     {
1755       VEC_free (breakpoint_p, tp_vec);
1756       error (_("No tracepoints that may be downloaded, not starting trace"));
1757     }
1758
1759   target_trace_init ();
1760
1761   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1762     {
1763       struct tracepoint *t = (struct tracepoint *) b;
1764       struct bp_location *loc;
1765       int bp_location_downloaded = 0;
1766
1767       /* Clear `inserted' flag.  */
1768       for (loc = b->loc; loc; loc = loc->next)
1769         loc->inserted = 0;
1770
1771       if ((b->type == bp_fast_tracepoint
1772            ? !may_insert_fast_tracepoints
1773            : !may_insert_tracepoints))
1774         continue;
1775
1776       t->number_on_target = 0;
1777
1778       for (loc = b->loc; loc; loc = loc->next)
1779         {
1780           /* Since tracepoint locations are never duplicated, `inserted'
1781              flag should be zero.  */
1782           gdb_assert (!loc->inserted);
1783
1784           target_download_tracepoint (loc);
1785
1786           loc->inserted = 1;
1787           bp_location_downloaded = 1;
1788         }
1789
1790       t->number_on_target = b->number;
1791
1792       for (loc = b->loc; loc; loc = loc->next)
1793         if (loc->probe != NULL)
1794           loc->probe->pops->set_semaphore (loc->probe, loc->gdbarch);
1795
1796       if (bp_location_downloaded)
1797         observer_notify_breakpoint_modified (b);
1798     }
1799   VEC_free (breakpoint_p, tp_vec);
1800
1801   /* Send down all the trace state variables too.  */
1802   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1803     {
1804       target_download_trace_state_variable (tsv);
1805     }
1806   
1807   /* Tell target to treat text-like sections as transparent.  */
1808   target_trace_set_readonly_regions ();
1809   /* Set some mode flags.  */
1810   target_set_disconnected_tracing (disconnected_tracing);
1811   target_set_circular_trace_buffer (circular_trace_buffer);
1812   target_set_trace_buffer_size (trace_buffer_size);
1813
1814   if (!notes)
1815     notes = trace_notes;
1816   ret = target_set_trace_notes (trace_user, notes, NULL);
1817
1818   if (!ret && (trace_user || notes))
1819     warning (_("Target does not support trace user/notes, info ignored"));
1820
1821   /* Now insert traps and begin collecting data.  */
1822   target_trace_start ();
1823
1824   /* Reset our local state.  */
1825   set_traceframe_num (-1);
1826   set_tracepoint_num (-1);
1827   set_traceframe_context (NULL);
1828   current_trace_status()->running = 1;
1829   clear_traceframe_info ();
1830 }
1831
1832 /* The tstart command requests the target to start a new trace run.
1833    The command passes any arguments it has to the target verbatim, as
1834    an optional "trace note".  This is useful as for instance a warning
1835    to other users if the trace runs disconnected, and you don't want
1836    anybody else messing with the target.  */
1837
1838 static void
1839 trace_start_command (char *args, int from_tty)
1840 {
1841   dont_repeat ();       /* Like "run", dangerous to repeat accidentally.  */
1842
1843   if (current_trace_status ()->running)
1844     {
1845       if (from_tty
1846           && !query (_("A trace is running already.  Start a new run? ")))
1847         error (_("New trace run not started."));
1848     }
1849
1850   start_tracing (args);
1851 }
1852
1853 /* The tstop command stops the tracing run.  The command passes any
1854    supplied arguments to the target verbatim as a "stop note"; if the
1855    target supports trace notes, then it will be reported back as part
1856    of the trace run's status.  */
1857
1858 static void
1859 trace_stop_command (char *args, int from_tty)
1860 {
1861   if (!current_trace_status ()->running)
1862     error (_("Trace is not running."));
1863
1864   stop_tracing (args);
1865 }
1866
1867 void
1868 stop_tracing (char *note)
1869 {
1870   int ret;
1871   VEC(breakpoint_p) *tp_vec = NULL;
1872   int ix;
1873   struct breakpoint *t;
1874
1875   target_trace_stop ();
1876
1877   tp_vec = all_tracepoints ();
1878   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1879     {
1880       struct bp_location *loc;
1881
1882       if ((t->type == bp_fast_tracepoint
1883            ? !may_insert_fast_tracepoints
1884            : !may_insert_tracepoints))
1885         continue;
1886
1887       for (loc = t->loc; loc; loc = loc->next)
1888         {
1889           /* GDB can be totally absent in some disconnected trace scenarios,
1890              but we don't really care if this semaphore goes out of sync.
1891              That's why we are decrementing it here, but not taking care
1892              in other places.  */
1893           if (loc->probe != NULL)
1894             loc->probe->pops->clear_semaphore (loc->probe, loc->gdbarch);
1895         }
1896     }
1897
1898   VEC_free (breakpoint_p, tp_vec);
1899
1900   if (!note)
1901     note = trace_stop_notes;
1902   ret = target_set_trace_notes (NULL, NULL, note);
1903
1904   if (!ret && note)
1905     warning (_("Target does not support trace notes, note ignored"));
1906
1907   /* Should change in response to reply?  */
1908   current_trace_status ()->running = 0;
1909 }
1910
1911 /* tstatus command */
1912 static void
1913 trace_status_command (char *args, int from_tty)
1914 {
1915   struct trace_status *ts = current_trace_status ();
1916   int status, ix;
1917   VEC(breakpoint_p) *tp_vec = NULL;
1918   struct breakpoint *t;
1919   
1920   status = target_get_trace_status (ts);
1921
1922   if (status == -1)
1923     {
1924       if (ts->filename != NULL)
1925         printf_filtered (_("Using a trace file.\n"));
1926       else
1927         {
1928           printf_filtered (_("Trace can not be run on this target.\n"));
1929           return;
1930         }
1931     }
1932
1933   if (!ts->running_known)
1934     {
1935       printf_filtered (_("Run/stop status is unknown.\n"));
1936     }
1937   else if (ts->running)
1938     {
1939       printf_filtered (_("Trace is running on the target.\n"));
1940     }
1941   else
1942     {
1943       switch (ts->stop_reason)
1944         {
1945         case trace_never_run:
1946           printf_filtered (_("No trace has been run on the target.\n"));
1947           break;
1948         case tstop_command:
1949           if (ts->stop_desc)
1950             printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1951                              ts->stop_desc);
1952           else
1953             printf_filtered (_("Trace stopped by a tstop command.\n"));
1954           break;
1955         case trace_buffer_full:
1956           printf_filtered (_("Trace stopped because the buffer was full.\n"));
1957           break;
1958         case trace_disconnected:
1959           printf_filtered (_("Trace stopped because of disconnection.\n"));
1960           break;
1961         case tracepoint_passcount:
1962           printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1963                            ts->stopping_tracepoint);
1964           break;
1965         case tracepoint_error:
1966           if (ts->stopping_tracepoint)
1967             printf_filtered (_("Trace stopped by an "
1968                                "error (%s, tracepoint %d).\n"),
1969                              ts->stop_desc, ts->stopping_tracepoint);
1970           else
1971             printf_filtered (_("Trace stopped by an error (%s).\n"),
1972                              ts->stop_desc);
1973           break;
1974         case trace_stop_reason_unknown:
1975           printf_filtered (_("Trace stopped for an unknown reason.\n"));
1976           break;
1977         default:
1978           printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1979                            ts->stop_reason);
1980           break;
1981         }
1982     }
1983
1984   if (ts->traceframes_created >= 0
1985       && ts->traceframe_count != ts->traceframes_created)
1986     {
1987       printf_filtered (_("Buffer contains %d trace "
1988                          "frames (of %d created total).\n"),
1989                        ts->traceframe_count, ts->traceframes_created);
1990     }
1991   else if (ts->traceframe_count >= 0)
1992     {
1993       printf_filtered (_("Collected %d trace frames.\n"),
1994                        ts->traceframe_count);
1995     }
1996
1997   if (ts->buffer_free >= 0)
1998     {
1999       if (ts->buffer_size >= 0)
2000         {
2001           printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
2002                            ts->buffer_free, ts->buffer_size);
2003           if (ts->buffer_size > 0)
2004             printf_filtered (_(" (%d%% full)"),
2005                              ((int) ((((long long) (ts->buffer_size
2006                                                     - ts->buffer_free)) * 100)
2007                                      / ts->buffer_size)));
2008           printf_filtered (_(".\n"));
2009         }
2010       else
2011         printf_filtered (_("Trace buffer has %d bytes free.\n"),
2012                          ts->buffer_free);
2013     }
2014
2015   if (ts->disconnected_tracing)
2016     printf_filtered (_("Trace will continue if GDB disconnects.\n"));
2017   else
2018     printf_filtered (_("Trace will stop if GDB disconnects.\n"));
2019
2020   if (ts->circular_buffer)
2021     printf_filtered (_("Trace buffer is circular.\n"));
2022
2023   if (ts->user_name && strlen (ts->user_name) > 0)
2024     printf_filtered (_("Trace user is %s.\n"), ts->user_name);
2025
2026   if (ts->notes && strlen (ts->notes) > 0)
2027     printf_filtered (_("Trace notes: %s.\n"), ts->notes);
2028
2029   /* Now report on what we're doing with tfind.  */
2030   if (traceframe_number >= 0)
2031     printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
2032                      traceframe_number, tracepoint_number);
2033   else
2034     printf_filtered (_("Not looking at any trace frame.\n"));
2035
2036   /* Report start/stop times if supplied.  */
2037   if (ts->start_time)
2038     {
2039       if (ts->stop_time)
2040         {
2041           LONGEST run_time = ts->stop_time - ts->start_time;
2042
2043           /* Reporting a run time is more readable than two long numbers.  */
2044           printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
2045                            (long int) ts->start_time / 1000000,
2046                            (long int) ts->start_time % 1000000,
2047                            (long int) run_time / 1000000,
2048                            (long int) run_time % 1000000);
2049         }
2050       else
2051         printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
2052                          (long int) ts->start_time / 1000000,
2053                          (long int) ts->start_time % 1000000);
2054     }
2055   else if (ts->stop_time)
2056     printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
2057                      (long int) ts->stop_time / 1000000,
2058                      (long int) ts->stop_time % 1000000);
2059
2060   /* Now report any per-tracepoint status available.  */
2061   tp_vec = all_tracepoints ();
2062
2063   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2064     target_get_tracepoint_status (t, NULL);
2065
2066   VEC_free (breakpoint_p, tp_vec);
2067 }
2068
2069 /* Report the trace status to uiout, in a way suitable for MI, and not
2070    suitable for CLI.  If ON_STOP is true, suppress a few fields that
2071    are not meaningful in the -trace-stop response.
2072
2073    The implementation is essentially parallel to trace_status_command, but
2074    merging them will result in unreadable code.  */
2075 void
2076 trace_status_mi (int on_stop)
2077 {
2078   struct ui_out *uiout = current_uiout;
2079   struct trace_status *ts = current_trace_status ();
2080   int status;
2081
2082   status = target_get_trace_status (ts);
2083
2084   if (status == -1 && ts->filename == NULL)
2085     {
2086       ui_out_field_string (uiout, "supported", "0");
2087       return;
2088     }
2089
2090   if (ts->filename != NULL)
2091     ui_out_field_string (uiout, "supported", "file");
2092   else if (!on_stop)
2093     ui_out_field_string (uiout, "supported", "1");
2094
2095   if (ts->filename != NULL)
2096     ui_out_field_string (uiout, "trace-file", ts->filename);
2097
2098   gdb_assert (ts->running_known);
2099
2100   if (ts->running)
2101     {
2102       ui_out_field_string (uiout, "running", "1");
2103
2104       /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
2105          Given that the frontend gets the status either on -trace-stop, or from
2106          -trace-status after re-connection, it does not seem like this
2107          information is necessary for anything.  It is not necessary for either
2108          figuring the vital state of the target nor for navigation of trace
2109          frames.  If the frontend wants to show the current state is some
2110          configure dialog, it can request the value when such dialog is
2111          invoked by the user.  */
2112     }
2113   else
2114     {
2115       char *stop_reason = NULL;
2116       int stopping_tracepoint = -1;
2117
2118       if (!on_stop)
2119         ui_out_field_string (uiout, "running", "0");
2120
2121       if (ts->stop_reason != trace_stop_reason_unknown)
2122         {
2123           switch (ts->stop_reason)
2124             {
2125             case tstop_command:
2126               stop_reason = "request";
2127               break;
2128             case trace_buffer_full:
2129               stop_reason = "overflow";
2130               break;
2131             case trace_disconnected:
2132               stop_reason = "disconnection";
2133               break;
2134             case tracepoint_passcount:
2135               stop_reason = "passcount";
2136               stopping_tracepoint = ts->stopping_tracepoint;
2137               break;
2138             case tracepoint_error:
2139               stop_reason = "error";
2140               stopping_tracepoint = ts->stopping_tracepoint;
2141               break;
2142             }
2143           
2144           if (stop_reason)
2145             {
2146               ui_out_field_string (uiout, "stop-reason", stop_reason);
2147               if (stopping_tracepoint != -1)
2148                 ui_out_field_int (uiout, "stopping-tracepoint",
2149                                   stopping_tracepoint);
2150               if (ts->stop_reason == tracepoint_error)
2151                 ui_out_field_string (uiout, "error-description",
2152                                      ts->stop_desc);
2153             }
2154         }
2155     }
2156
2157   if (ts->traceframe_count != -1)
2158     ui_out_field_int (uiout, "frames", ts->traceframe_count);
2159   if (ts->traceframes_created != -1)
2160     ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
2161   if (ts->buffer_size != -1)
2162     ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
2163   if (ts->buffer_free != -1)
2164     ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
2165
2166   ui_out_field_int (uiout, "disconnected",  ts->disconnected_tracing);
2167   ui_out_field_int (uiout, "circular",  ts->circular_buffer);
2168
2169   ui_out_field_string (uiout, "user-name", ts->user_name);
2170   ui_out_field_string (uiout, "notes", ts->notes);
2171
2172   {
2173     char buf[100];
2174
2175     xsnprintf (buf, sizeof buf, "%ld.%06ld",
2176                (long int) ts->start_time / 1000000,
2177                (long int) ts->start_time % 1000000);
2178     ui_out_field_string (uiout, "start-time", buf);
2179     xsnprintf (buf, sizeof buf, "%ld.%06ld",
2180                (long int) ts->stop_time / 1000000,
2181                (long int) ts->stop_time % 1000000);
2182     ui_out_field_string (uiout, "stop-time", buf);
2183   }
2184 }
2185
2186 /* Check if a trace run is ongoing.  If so, and FROM_TTY, query the
2187    user if she really wants to detach.  */
2188
2189 void
2190 query_if_trace_running (int from_tty)
2191 {
2192   if (!from_tty)
2193     return;
2194
2195   /* It can happen that the target that was tracing went away on its
2196      own, and we didn't notice.  Get a status update, and if the
2197      current target doesn't even do tracing, then assume it's not
2198      running anymore.  */
2199   if (target_get_trace_status (current_trace_status ()) < 0)
2200     current_trace_status ()->running = 0;
2201
2202   /* If running interactively, give the user the option to cancel and
2203      then decide what to do differently with the run.  Scripts are
2204      just going to disconnect and let the target deal with it,
2205      according to how it's been instructed previously via
2206      disconnected-tracing.  */
2207   if (current_trace_status ()->running)
2208     {
2209       process_tracepoint_on_disconnect ();
2210
2211       if (current_trace_status ()->disconnected_tracing)
2212         {
2213           if (!query (_("Trace is running and will "
2214                         "continue after detach; detach anyway? ")))
2215             error (_("Not confirmed."));
2216         }
2217       else
2218         {
2219           if (!query (_("Trace is running but will "
2220                         "stop on detach; detach anyway? ")))
2221             error (_("Not confirmed."));
2222         }
2223     }
2224 }
2225
2226 /* This function handles the details of what to do about an ongoing
2227    tracing run if the user has asked to detach or otherwise disconnect
2228    from the target.  */
2229
2230 void
2231 disconnect_tracing (void)
2232 {
2233   /* Also we want to be out of tfind mode, otherwise things can get
2234      confusing upon reconnection.  Just use these calls instead of
2235      full tfind_1 behavior because we're in the middle of detaching,
2236      and there's no point to updating current stack frame etc.  */
2237   set_current_traceframe (-1);
2238   set_tracepoint_num (-1);
2239   set_traceframe_context (NULL);
2240 }
2241
2242 /* Worker function for the various flavors of the tfind command.  */
2243 void
2244 tfind_1 (enum trace_find_type type, int num,
2245          CORE_ADDR addr1, CORE_ADDR addr2,
2246          int from_tty)
2247 {
2248   int target_frameno = -1, target_tracept = -1;
2249   struct frame_id old_frame_id = null_frame_id;
2250   struct tracepoint *tp;
2251   struct ui_out *uiout = current_uiout;
2252
2253   /* Only try to get the current stack frame if we have a chance of
2254      succeeding.  In particular, if we're trying to get a first trace
2255      frame while all threads are running, it's not going to succeed,
2256      so leave it with a default value and let the frame comparison
2257      below (correctly) decide to print out the source location of the
2258      trace frame.  */
2259   if (!(type == tfind_number && num == -1)
2260       && (has_stack_frames () || traceframe_number >= 0))
2261     old_frame_id = get_frame_id (get_current_frame ());
2262
2263   target_frameno = target_trace_find (type, num, addr1, addr2,
2264                                       &target_tracept);
2265   
2266   if (type == tfind_number
2267       && num == -1
2268       && target_frameno == -1)
2269     {
2270       /* We told the target to get out of tfind mode, and it did.  */
2271     }
2272   else if (target_frameno == -1)
2273     {
2274       /* A request for a non-existent trace frame has failed.
2275          Our response will be different, depending on FROM_TTY:
2276
2277          If FROM_TTY is true, meaning that this command was 
2278          typed interactively by the user, then give an error
2279          and DO NOT change the state of traceframe_number etc.
2280
2281          However if FROM_TTY is false, meaning that we're either
2282          in a script, a loop, or a user-defined command, then 
2283          DON'T give an error, but DO change the state of
2284          traceframe_number etc. to invalid.
2285
2286          The rationalle is that if you typed the command, you
2287          might just have committed a typo or something, and you'd
2288          like to NOT lose your current debugging state.  However
2289          if you're in a user-defined command or especially in a
2290          loop, then you need a way to detect that the command
2291          failed WITHOUT aborting.  This allows you to write
2292          scripts that search thru the trace buffer until the end,
2293          and then continue on to do something else.  */
2294   
2295       if (from_tty)
2296         error (_("Target failed to find requested trace frame."));
2297       else
2298         {
2299           if (info_verbose)
2300             printf_filtered ("End of trace buffer.\n");
2301 #if 0 /* dubious now?  */
2302           /* The following will not recurse, since it's
2303              special-cased.  */
2304           trace_find_command ("-1", from_tty);
2305 #endif
2306         }
2307     }
2308   
2309   tp = get_tracepoint_by_number_on_target (target_tracept);
2310
2311   reinit_frame_cache ();
2312   target_dcache_invalidate ();
2313
2314   set_tracepoint_num (tp ? tp->base.number : target_tracept);
2315
2316   if (target_frameno != get_traceframe_number ())
2317     observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2318
2319   set_current_traceframe (target_frameno);
2320
2321   if (target_frameno == -1)
2322     set_traceframe_context (NULL);
2323   else
2324     set_traceframe_context (get_current_frame ());
2325
2326   if (traceframe_number >= 0)
2327     {
2328       /* Use different branches for MI and CLI to make CLI messages
2329          i18n-eable.  */
2330       if (ui_out_is_mi_like_p (uiout))
2331         {
2332           ui_out_field_string (uiout, "found", "1");
2333           ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2334           ui_out_field_int (uiout, "traceframe", traceframe_number);
2335         }
2336       else
2337         {
2338           printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2339                              traceframe_number, tracepoint_number);
2340         }
2341     }
2342   else
2343     {
2344       if (ui_out_is_mi_like_p (uiout))
2345         ui_out_field_string (uiout, "found", "0");
2346       else if (type == tfind_number && num == -1)
2347         printf_unfiltered (_("No longer looking at any trace frame\n"));
2348       else /* This case may never occur, check.  */
2349         printf_unfiltered (_("No trace frame found\n"));
2350     }
2351
2352   /* If we're in nonstop mode and getting out of looking at trace
2353      frames, there won't be any current frame to go back to and
2354      display.  */
2355   if (from_tty
2356       && (has_stack_frames () || traceframe_number >= 0))
2357     {
2358       enum print_what print_what;
2359
2360       /* NOTE: in imitation of the step command, try to determine
2361          whether we have made a transition from one function to
2362          another.  If so, we'll print the "stack frame" (ie. the new
2363          function and it's arguments) -- otherwise we'll just show the
2364          new source line.  */
2365
2366       if (frame_id_eq (old_frame_id,
2367                        get_frame_id (get_current_frame ())))
2368         print_what = SRC_LINE;
2369       else
2370         print_what = SRC_AND_LOC;
2371
2372       print_stack_frame (get_selected_frame (NULL), 1, print_what);
2373       do_displays ();
2374     }
2375 }
2376
2377 /* trace_find_command takes a trace frame number n, 
2378    sends "QTFrame:<n>" to the target, 
2379    and accepts a reply that may contain several optional pieces
2380    of information: a frame number, a tracepoint number, and an
2381    indication of whether this is a trap frame or a stepping frame.
2382
2383    The minimal response is just "OK" (which indicates that the 
2384    target does not give us a frame number or a tracepoint number).
2385    Instead of that, the target may send us a string containing
2386    any combination of:
2387    F<hexnum>    (gives the selected frame number)
2388    T<hexnum>    (gives the selected tracepoint number)
2389  */
2390
2391 /* tfind command */
2392 static void
2393 trace_find_command (char *args, int from_tty)
2394 { /* This should only be called with a numeric argument.  */
2395   int frameno = -1;
2396
2397   if (current_trace_status ()->running
2398       && current_trace_status ()->filename == NULL)
2399     error (_("May not look at trace frames while trace is running."));
2400   
2401   if (args == 0 || *args == 0)
2402     { /* TFIND with no args means find NEXT trace frame.  */
2403       if (traceframe_number == -1)
2404         frameno = 0;    /* "next" is first one.  */
2405         else
2406         frameno = traceframe_number + 1;
2407     }
2408   else if (0 == strcmp (args, "-"))
2409     {
2410       if (traceframe_number == -1)
2411         error (_("not debugging trace buffer"));
2412       else if (from_tty && traceframe_number == 0)
2413         error (_("already at start of trace buffer"));
2414       
2415       frameno = traceframe_number - 1;
2416       }
2417   /* A hack to work around eval's need for fp to have been collected.  */
2418   else if (0 == strcmp (args, "-1"))
2419     frameno = -1;
2420   else
2421     frameno = parse_and_eval_long (args);
2422
2423   if (frameno < -1)
2424     error (_("invalid input (%d is less than zero)"), frameno);
2425
2426   tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2427 }
2428
2429 /* tfind end */
2430 static void
2431 trace_find_end_command (char *args, int from_tty)
2432 {
2433   trace_find_command ("-1", from_tty);
2434 }
2435
2436 /* tfind start */
2437 static void
2438 trace_find_start_command (char *args, int from_tty)
2439 {
2440   trace_find_command ("0", from_tty);
2441 }
2442
2443 /* tfind pc command */
2444 static void
2445 trace_find_pc_command (char *args, int from_tty)
2446 {
2447   CORE_ADDR pc;
2448
2449   if (current_trace_status ()->running
2450       && current_trace_status ()->filename == NULL)
2451     error (_("May not look at trace frames while trace is running."));
2452
2453   if (args == 0 || *args == 0)
2454     pc = regcache_read_pc (get_current_regcache ());
2455   else
2456     pc = parse_and_eval_address (args);
2457
2458   tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2459 }
2460
2461 /* tfind tracepoint command */
2462 static void
2463 trace_find_tracepoint_command (char *args, int from_tty)
2464 {
2465   int tdp;
2466   struct tracepoint *tp;
2467
2468   if (current_trace_status ()->running
2469       && current_trace_status ()->filename == NULL)
2470     error (_("May not look at trace frames while trace is running."));
2471
2472   if (args == 0 || *args == 0)
2473     {
2474       if (tracepoint_number == -1)
2475         error (_("No current tracepoint -- please supply an argument."));
2476       else
2477         tdp = tracepoint_number;        /* Default is current TDP.  */
2478     }
2479   else
2480     tdp = parse_and_eval_long (args);
2481
2482   /* If we have the tracepoint on hand, use the number that the
2483      target knows about (which may be different if we disconnected
2484      and reconnected).  */
2485   tp = get_tracepoint (tdp);
2486   if (tp)
2487     tdp = tp->number_on_target;
2488
2489   tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2490 }
2491
2492 /* TFIND LINE command:
2493
2494    This command will take a sourceline for argument, just like BREAK
2495    or TRACE (ie. anything that "decode_line_1" can handle).
2496
2497    With no argument, this command will find the next trace frame 
2498    corresponding to a source line OTHER THAN THE CURRENT ONE.  */
2499
2500 static void
2501 trace_find_line_command (char *args, int from_tty)
2502 {
2503   static CORE_ADDR start_pc, end_pc;
2504   struct symtabs_and_lines sals;
2505   struct symtab_and_line sal;
2506   struct cleanup *old_chain;
2507
2508   if (current_trace_status ()->running
2509       && current_trace_status ()->filename == NULL)
2510     error (_("May not look at trace frames while trace is running."));
2511
2512   if (args == 0 || *args == 0)
2513     {
2514       sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2515       sals.nelts = 1;
2516       sals.sals = (struct symtab_and_line *)
2517         xmalloc (sizeof (struct symtab_and_line));
2518       sals.sals[0] = sal;
2519     }
2520   else
2521     {
2522       sals = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2523       sal = sals.sals[0];
2524     }
2525   
2526   old_chain = make_cleanup (xfree, sals.sals);
2527   if (sal.symtab == 0)
2528     error (_("No line number information available."));
2529
2530   if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2531     {
2532       if (start_pc == end_pc)
2533         {
2534           printf_filtered ("Line %d of \"%s\"",
2535                            sal.line,
2536                            symtab_to_filename_for_display (sal.symtab));
2537           wrap_here ("  ");
2538           printf_filtered (" is at address ");
2539           print_address (get_current_arch (), start_pc, gdb_stdout);
2540           wrap_here ("  ");
2541           printf_filtered (" but contains no code.\n");
2542           sal = find_pc_line (start_pc, 0);
2543           if (sal.line > 0
2544               && find_line_pc_range (sal, &start_pc, &end_pc)
2545               && start_pc != end_pc)
2546             printf_filtered ("Attempting to find line %d instead.\n",
2547                              sal.line);
2548           else
2549             error (_("Cannot find a good line."));
2550         }
2551       }
2552     else
2553     /* Is there any case in which we get here, and have an address
2554        which the user would want to see?  If we have debugging
2555        symbols and no line numbers?  */
2556     error (_("Line number %d is out of range for \"%s\"."),
2557            sal.line, symtab_to_filename_for_display (sal.symtab));
2558
2559   /* Find within range of stated line.  */
2560   if (args && *args)
2561     tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2562   else
2563     tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2564   do_cleanups (old_chain);
2565 }
2566
2567 /* tfind range command */
2568 static void
2569 trace_find_range_command (char *args, int from_tty)
2570 {
2571   static CORE_ADDR start, stop;
2572   char *tmp;
2573
2574   if (current_trace_status ()->running
2575       && current_trace_status ()->filename == NULL)
2576     error (_("May not look at trace frames while trace is running."));
2577
2578   if (args == 0 || *args == 0)
2579     { /* XXX FIXME: what should default behavior be?  */
2580       printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2581       return;
2582     }
2583
2584   if (0 != (tmp = strchr (args, ',')))
2585     {
2586       *tmp++ = '\0';    /* Terminate start address.  */
2587       tmp = skip_spaces (tmp);
2588       start = parse_and_eval_address (args);
2589       stop = parse_and_eval_address (tmp);
2590     }
2591   else
2592     {                   /* No explicit end address?  */
2593       start = parse_and_eval_address (args);
2594       stop = start + 1; /* ??? */
2595     }
2596
2597   tfind_1 (tfind_range, 0, start, stop, from_tty);
2598 }
2599
2600 /* tfind outside command */
2601 static void
2602 trace_find_outside_command (char *args, int from_tty)
2603 {
2604   CORE_ADDR start, stop;
2605   char *tmp;
2606
2607   if (current_trace_status ()->running
2608       && current_trace_status ()->filename == NULL)
2609     error (_("May not look at trace frames while trace is running."));
2610
2611   if (args == 0 || *args == 0)
2612     { /* XXX FIXME: what should default behavior be?  */
2613       printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2614       return;
2615     }
2616
2617   if (0 != (tmp = strchr (args, ',')))
2618     {
2619       *tmp++ = '\0';    /* Terminate start address.  */
2620       tmp = skip_spaces (tmp);
2621       start = parse_and_eval_address (args);
2622       stop = parse_and_eval_address (tmp);
2623     }
2624   else
2625     {                   /* No explicit end address?  */
2626       start = parse_and_eval_address (args);
2627       stop = start + 1; /* ??? */
2628     }
2629
2630   tfind_1 (tfind_outside, 0, start, stop, from_tty);
2631 }
2632
2633 /* info scope command: list the locals for a scope.  */
2634 static void
2635 scope_info (char *args, int from_tty)
2636 {
2637   struct symtabs_and_lines sals;
2638   struct symbol *sym;
2639   struct minimal_symbol *msym;
2640   struct block *block;
2641   const char *symname;
2642   char *save_args = args;
2643   struct block_iterator iter;
2644   int j, count = 0;
2645   struct gdbarch *gdbarch;
2646   int regno;
2647
2648   if (args == 0 || *args == 0)
2649     error (_("requires an argument (function, "
2650              "line or *addr) to define a scope"));
2651
2652   sals = decode_line_1 (&args, DECODE_LINE_FUNFIRSTLINE, NULL, 0);
2653   if (sals.nelts == 0)
2654     return;             /* Presumably decode_line_1 has already warned.  */
2655
2656   /* Resolve line numbers to PC.  */
2657   resolve_sal_pc (&sals.sals[0]);
2658   block = block_for_pc (sals.sals[0].pc);
2659
2660   while (block != 0)
2661     {
2662       QUIT;                     /* Allow user to bail out with ^C.  */
2663       ALL_BLOCK_SYMBOLS (block, iter, sym)
2664         {
2665           QUIT;                 /* Allow user to bail out with ^C.  */
2666           if (count == 0)
2667             printf_filtered ("Scope for %s:\n", save_args);
2668           count++;
2669
2670           symname = SYMBOL_PRINT_NAME (sym);
2671           if (symname == NULL || *symname == '\0')
2672             continue;           /* Probably botched, certainly useless.  */
2673
2674           gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2675
2676           printf_filtered ("Symbol %s is ", symname);
2677
2678           if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2679             SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2680                                                           BLOCK_START (block),
2681                                                           gdb_stdout);
2682           else
2683             {
2684               switch (SYMBOL_CLASS (sym))
2685                 {
2686                 default:
2687                 case LOC_UNDEF: /* Messed up symbol?  */
2688                   printf_filtered ("a bogus symbol, class %d.\n",
2689                                    SYMBOL_CLASS (sym));
2690                   count--;              /* Don't count this one.  */
2691                   continue;
2692                 case LOC_CONST:
2693                   printf_filtered ("a constant with value %s (%s)",
2694                                    plongest (SYMBOL_VALUE (sym)),
2695                                    hex_string (SYMBOL_VALUE (sym)));
2696                   break;
2697                 case LOC_CONST_BYTES:
2698                   printf_filtered ("constant bytes: ");
2699                   if (SYMBOL_TYPE (sym))
2700                     for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2701                       fprintf_filtered (gdb_stdout, " %02x",
2702                                         (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2703                   break;
2704                 case LOC_STATIC:
2705                   printf_filtered ("in static storage at address ");
2706                   printf_filtered ("%s", paddress (gdbarch,
2707                                                    SYMBOL_VALUE_ADDRESS (sym)));
2708                   break;
2709                 case LOC_REGISTER:
2710                   /* GDBARCH is the architecture associated with the objfile
2711                      the symbol is defined in; the target architecture may be
2712                      different, and may provide additional registers.  However,
2713                      we do not know the target architecture at this point.
2714                      We assume the objfile architecture will contain all the
2715                      standard registers that occur in debug info in that
2716                      objfile.  */
2717                   regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2718                                                                       gdbarch);
2719
2720                   if (SYMBOL_IS_ARGUMENT (sym))
2721                     printf_filtered ("an argument in register $%s",
2722                                      gdbarch_register_name (gdbarch, regno));
2723                   else
2724                     printf_filtered ("a local variable in register $%s",
2725                                      gdbarch_register_name (gdbarch, regno));
2726                   break;
2727                 case LOC_ARG:
2728                   printf_filtered ("an argument at stack/frame offset %s",
2729                                    plongest (SYMBOL_VALUE (sym)));
2730                   break;
2731                 case LOC_LOCAL:
2732                   printf_filtered ("a local variable at frame offset %s",
2733                                    plongest (SYMBOL_VALUE (sym)));
2734                   break;
2735                 case LOC_REF_ARG:
2736                   printf_filtered ("a reference argument at offset %s",
2737                                    plongest (SYMBOL_VALUE (sym)));
2738                   break;
2739                 case LOC_REGPARM_ADDR:
2740                   /* Note comment at LOC_REGISTER.  */
2741                   regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2742                                                                       gdbarch);
2743                   printf_filtered ("the address of an argument, in register $%s",
2744                                    gdbarch_register_name (gdbarch, regno));
2745                   break;
2746                 case LOC_TYPEDEF:
2747                   printf_filtered ("a typedef.\n");
2748                   continue;
2749                 case LOC_LABEL:
2750                   printf_filtered ("a label at address ");
2751                   printf_filtered ("%s", paddress (gdbarch,
2752                                                    SYMBOL_VALUE_ADDRESS (sym)));
2753                   break;
2754                 case LOC_BLOCK:
2755                   printf_filtered ("a function at address ");
2756                   printf_filtered ("%s",
2757                                    paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2758                   break;
2759                 case LOC_UNRESOLVED:
2760                   msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2761                                                 NULL, NULL);
2762                   if (msym == NULL)
2763                     printf_filtered ("Unresolved Static");
2764                   else
2765                     {
2766                       printf_filtered ("static storage at address ");
2767                       printf_filtered ("%s",
2768                                        paddress (gdbarch,
2769                                                  SYMBOL_VALUE_ADDRESS (msym)));
2770                     }
2771                   break;
2772                 case LOC_OPTIMIZED_OUT:
2773                   printf_filtered ("optimized out.\n");
2774                   continue;
2775                 case LOC_COMPUTED:
2776                   gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2777                 }
2778             }
2779           if (SYMBOL_TYPE (sym))
2780             printf_filtered (", length %d.\n",
2781                              TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2782         }
2783       if (BLOCK_FUNCTION (block))
2784         break;
2785       else
2786         block = BLOCK_SUPERBLOCK (block);
2787     }
2788   if (count <= 0)
2789     printf_filtered ("Scope for %s contains no locals or arguments.\n",
2790                      save_args);
2791 }
2792
2793 /* Helper for trace_dump_command.  Dump the action list starting at
2794    ACTION.  STEPPING_ACTIONS is true if we're iterating over the
2795    actions of the body of a while-stepping action.  STEPPING_FRAME is
2796    set if the current traceframe was determined to be a while-stepping
2797    traceframe.  */
2798
2799 static void
2800 trace_dump_actions (struct command_line *action,
2801                     int stepping_actions, int stepping_frame,
2802                     int from_tty)
2803 {
2804   const char *action_exp, *next_comma;
2805
2806   for (; action != NULL; action = action->next)
2807     {
2808       struct cmd_list_element *cmd;
2809
2810       QUIT;                     /* Allow user to bail out with ^C.  */
2811       action_exp = action->line;
2812       action_exp = skip_spaces_const (action_exp);
2813
2814       /* The collection actions to be done while stepping are
2815          bracketed by the commands "while-stepping" and "end".  */
2816
2817       if (*action_exp == '#')   /* comment line */
2818         continue;
2819
2820       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2821       if (cmd == 0)
2822         error (_("Bad action list item: %s"), action_exp);
2823
2824       if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2825         {
2826           int i;
2827
2828           for (i = 0; i < action->body_count; ++i)
2829             trace_dump_actions (action->body_list[i],
2830                                 1, stepping_frame, from_tty);
2831         }
2832       else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2833         {
2834           /* Display the collected data.
2835              For the trap frame, display only what was collected at
2836              the trap.  Likewise for stepping frames, display only
2837              what was collected while stepping.  This means that the
2838              two boolean variables, STEPPING_FRAME and
2839              STEPPING_ACTIONS should be equal.  */
2840           if (stepping_frame == stepping_actions)
2841             {
2842               char *cmd = NULL;
2843               struct cleanup *old_chain
2844                 = make_cleanup (free_current_contents, &cmd);
2845               int trace_string = 0;
2846
2847               if (*action_exp == '/')
2848                 action_exp = decode_agent_options (action_exp, &trace_string);
2849
2850               do
2851                 {               /* Repeat over a comma-separated list.  */
2852                   QUIT;         /* Allow user to bail out with ^C.  */
2853                   if (*action_exp == ',')
2854                     action_exp++;
2855                   action_exp = skip_spaces_const (action_exp);
2856
2857                   next_comma = strchr (action_exp, ',');
2858
2859                   if (0 == strncasecmp (action_exp, "$reg", 4))
2860                     registers_info (NULL, from_tty);
2861                   else if (0 == strncasecmp (action_exp, "$_ret", 5))
2862                     ;
2863                   else if (0 == strncasecmp (action_exp, "$loc", 4))
2864                     locals_info (NULL, from_tty);
2865                   else if (0 == strncasecmp (action_exp, "$arg", 4))
2866                     args_info (NULL, from_tty);
2867                   else
2868                     {           /* variable */
2869                       if (next_comma != NULL)
2870                         {
2871                           size_t len = next_comma - action_exp;
2872
2873                           cmd = xrealloc (cmd, len + 1);
2874                           memcpy (cmd, action_exp, len);
2875                           cmd[len] = 0;
2876                         }
2877                       else
2878                         {
2879                           size_t len = strlen (action_exp);
2880
2881                           cmd = xrealloc (cmd, len + 1);
2882                           memcpy (cmd, action_exp, len + 1);
2883                         }
2884
2885                       printf_filtered ("%s = ", cmd);
2886                       output_command_const (cmd, from_tty);
2887                       printf_filtered ("\n");
2888                     }
2889                   action_exp = next_comma;
2890                 }
2891               while (action_exp && *action_exp == ',');
2892
2893               do_cleanups (old_chain);
2894             }
2895         }
2896     }
2897 }
2898
2899 /* Return all the actions, including default collect, of a tracepoint
2900    T.  It constructs cleanups into the chain, and leaves the caller to
2901    handle them (call do_cleanups).  */
2902
2903 static struct command_line *
2904 all_tracepoint_actions_and_cleanup (struct breakpoint *t)
2905 {
2906   struct command_line *actions;
2907
2908   actions = breakpoint_commands (t);
2909
2910   /* If there are default expressions to collect, make up a collect
2911      action and prepend to the action list to encode.  Note that since
2912      validation is per-tracepoint (local var "xyz" might be valid for
2913      one tracepoint and not another, etc), we make up the action on
2914      the fly, and don't cache it.  */
2915   if (*default_collect)
2916     {
2917       struct command_line *default_collect_action;
2918       char *default_collect_line;
2919
2920       default_collect_line = xstrprintf ("collect %s", default_collect);
2921       make_cleanup (xfree, default_collect_line);
2922
2923       validate_actionline (default_collect_line, t);
2924       default_collect_action = xmalloc (sizeof (struct command_line));
2925       make_cleanup (xfree, default_collect_action);
2926       default_collect_action->next = actions;
2927       default_collect_action->line = default_collect_line;
2928       actions = default_collect_action;
2929     }
2930
2931   return actions;
2932 }
2933
2934 /* The tdump command.  */
2935
2936 static void
2937 trace_dump_command (char *args, int from_tty)
2938 {
2939   struct regcache *regcache;
2940   struct tracepoint *t;
2941   int stepping_frame = 0;
2942   struct bp_location *loc;
2943   char *default_collect_line = NULL;
2944   struct command_line *actions, *default_collect_action = NULL;
2945   struct cleanup *old_chain;
2946
2947   if (tracepoint_number == -1)
2948     {
2949       warning (_("No current trace frame."));
2950       return;
2951     }
2952
2953   old_chain = make_cleanup (null_cleanup, NULL);
2954   t = get_tracepoint (tracepoint_number);
2955
2956   if (t == NULL)
2957     error (_("No known tracepoint matches 'current' tracepoint #%d."),
2958            tracepoint_number);
2959
2960   printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2961                    tracepoint_number, traceframe_number);
2962
2963   /* The current frame is a trap frame if the frame PC is equal
2964      to the tracepoint PC.  If not, then the current frame was
2965      collected during single-stepping.  */
2966
2967   regcache = get_current_regcache ();
2968
2969   /* If the traceframe's address matches any of the tracepoint's
2970      locations, assume it is a direct hit rather than a while-stepping
2971      frame.  (FIXME this is not reliable, should record each frame's
2972      type.)  */
2973   stepping_frame = 1;
2974   for (loc = t->base.loc; loc; loc = loc->next)
2975     if (loc->address == regcache_read_pc (regcache))
2976       stepping_frame = 0;
2977
2978   actions = all_tracepoint_actions_and_cleanup (&t->base);
2979
2980   trace_dump_actions (actions, 0, stepping_frame, from_tty);
2981
2982   do_cleanups (old_chain);
2983 }
2984
2985 /* Encode a piece of a tracepoint's source-level definition in a form
2986    that is suitable for both protocol and saving in files.  */
2987 /* This version does not do multiple encodes for long strings; it should
2988    return an offset to the next piece to encode.  FIXME  */
2989
2990 extern int
2991 encode_source_string (int tpnum, ULONGEST addr,
2992                       char *srctype, char *src, char *buf, int buf_size)
2993 {
2994   if (80 + strlen (srctype) > buf_size)
2995     error (_("Buffer too small for source encoding"));
2996   sprintf (buf, "%x:%s:%s:%x:%x:",
2997            tpnum, phex_nz (addr, sizeof (addr)),
2998            srctype, 0, (int) strlen (src));
2999   if (strlen (buf) + strlen (src) * 2 >= buf_size)
3000     error (_("Source string too long for buffer"));
3001   bin2hex ((gdb_byte *) src, buf + strlen (buf), 0);
3002   return -1;
3003 }
3004
3005 /* Free trace file writer.  */
3006
3007 static void
3008 trace_file_writer_xfree (void *arg)
3009 {
3010   struct trace_file_writer *writer = arg;
3011
3012   writer->ops->dtor (writer);
3013   xfree (writer);
3014 }
3015
3016 /* TFILE trace writer.  */
3017
3018 struct tfile_trace_file_writer
3019 {
3020   struct trace_file_writer base;
3021
3022   /* File pointer to tfile trace file.  */
3023   FILE *fp;
3024   /* Path name of the tfile trace file.  */
3025   char *pathname;
3026 };
3027
3028 /* This is the implementation of trace_file_write_ops method
3029    target_save.  We just call the generic target
3030    target_save_trace_data to do target-side saving.  */
3031
3032 static int
3033 tfile_target_save (struct trace_file_writer *self,
3034                    const char *filename)
3035 {
3036   int err = target_save_trace_data (filename);
3037
3038   return (err >= 0);
3039 }
3040
3041 /* This is the implementation of trace_file_write_ops method
3042    dtor.  */
3043
3044 static void
3045 tfile_dtor (struct trace_file_writer *self)
3046 {
3047   struct tfile_trace_file_writer *writer
3048     = (struct tfile_trace_file_writer *) self;
3049
3050   xfree (writer->pathname);
3051
3052   if (writer->fp != NULL)
3053     fclose (writer->fp);
3054 }
3055
3056 /* This is the implementation of trace_file_write_ops method
3057    start.  It creates the trace file FILENAME and registers some
3058    cleanups.  */
3059
3060 static void
3061 tfile_start (struct trace_file_writer *self, const char *filename)
3062 {
3063   struct tfile_trace_file_writer *writer
3064     = (struct tfile_trace_file_writer *) self;
3065
3066   writer->pathname = tilde_expand (filename);
3067   writer->fp = gdb_fopen_cloexec (writer->pathname, "wb");
3068   if (writer->fp == NULL)
3069     error (_("Unable to open file '%s' for saving trace data (%s)"),
3070            filename, safe_strerror (errno));
3071 }
3072
3073 /* This is the implementation of trace_file_write_ops method
3074    write_header.  Write the TFILE header.  */
3075
3076 static void
3077 tfile_write_header (struct trace_file_writer *self)
3078 {
3079   struct tfile_trace_file_writer *writer
3080     = (struct tfile_trace_file_writer *) self;
3081   int written;
3082
3083   /* Write a file header, with a high-bit-set char to indicate a
3084      binary file, plus a hint as what this file is, and a version
3085      number in case of future needs.  */
3086   written = fwrite ("\x7fTRACE0\n", 8, 1, writer->fp);
3087   if (written < 1)
3088     perror_with_name (writer->pathname);
3089 }
3090
3091 /* This is the implementation of trace_file_write_ops method
3092    write_regblock_type.  Write the size of register block.  */
3093
3094 static void
3095 tfile_write_regblock_type (struct trace_file_writer *self, int size)
3096 {
3097   struct tfile_trace_file_writer *writer
3098     = (struct tfile_trace_file_writer *) self;
3099
3100   fprintf (writer->fp, "R %x\n", size);
3101 }
3102
3103 /* This is the implementation of trace_file_write_ops method
3104    write_status.  */
3105
3106 static void
3107 tfile_write_status (struct trace_file_writer *self,
3108                     struct trace_status *ts)
3109 {
3110   struct tfile_trace_file_writer *writer
3111     = (struct tfile_trace_file_writer *) self;
3112
3113   fprintf (writer->fp, "status %c;%s",
3114            (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
3115   if (ts->stop_reason == tracepoint_error
3116       || ts->stop_reason == tstop_command)
3117     {
3118       char *buf = (char *) alloca (strlen (ts->stop_desc) * 2 + 1);
3119
3120       bin2hex ((gdb_byte *) ts->stop_desc, buf, 0);
3121       fprintf (writer->fp, ":%s", buf);
3122     }
3123   fprintf (writer->fp, ":%x", ts->stopping_tracepoint);
3124   if (ts->traceframe_count >= 0)
3125     fprintf (writer->fp, ";tframes:%x", ts->traceframe_count);
3126   if (ts->traceframes_created >= 0)
3127     fprintf (writer->fp, ";tcreated:%x", ts->traceframes_created);
3128   if (ts->buffer_free >= 0)
3129     fprintf (writer->fp, ";tfree:%x", ts->buffer_free);
3130   if (ts->buffer_size >= 0)
3131     fprintf (writer->fp, ";tsize:%x", ts->buffer_size);
3132   if (ts->disconnected_tracing)
3133     fprintf (writer->fp, ";disconn:%x", ts->disconnected_tracing);
3134   if (ts->circular_buffer)
3135     fprintf (writer->fp, ";circular:%x", ts->circular_buffer);
3136   if (ts->notes != NULL)
3137     {
3138       char *buf = (char *) alloca (strlen (ts->notes) * 2 + 1);
3139
3140       bin2hex ((gdb_byte *) ts->notes, buf, 0);
3141       fprintf (writer->fp, ";notes:%s", buf);
3142     }
3143   if (ts->user_name != NULL)
3144     {
3145       char *buf = (char *) alloca (strlen (ts->user_name) * 2 + 1);
3146
3147       bin2hex ((gdb_byte *) ts->user_name, buf, 0);
3148       fprintf (writer->fp, ";username:%s", buf);
3149     }
3150   fprintf (writer->fp, "\n");
3151 }
3152
3153 /* This is the implementation of trace_file_write_ops method
3154    write_uploaded_tsv.  */
3155
3156 static void
3157 tfile_write_uploaded_tsv (struct trace_file_writer *self,
3158                           struct uploaded_tsv *utsv)
3159 {
3160   char *buf = "";
3161   struct tfile_trace_file_writer *writer
3162     = (struct tfile_trace_file_writer *) self;
3163
3164   if (utsv->name)
3165     {
3166       buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
3167       bin2hex ((gdb_byte *) (utsv->name), buf, 0);
3168     }
3169
3170   fprintf (writer->fp, "tsv %x:%s:%x:%s\n",
3171            utsv->number, phex_nz (utsv->initial_value, 8),
3172            utsv->builtin, buf);
3173
3174   if (utsv->name)
3175     xfree (buf);
3176 }
3177
3178 #define MAX_TRACE_UPLOAD 2000
3179
3180 /* This is the implementation of trace_file_write_ops method
3181    write_uploaded_tp.  */
3182
3183 static void
3184 tfile_write_uploaded_tp (struct trace_file_writer *self,
3185                          struct uploaded_tp *utp)
3186 {
3187   struct tfile_trace_file_writer *writer
3188     = (struct tfile_trace_file_writer *) self;
3189   int a;
3190   char *act;
3191   char buf[MAX_TRACE_UPLOAD];
3192
3193   fprintf (writer->fp, "tp T%x:%s:%c:%x:%x",
3194            utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3195            (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
3196   if (utp->type == bp_fast_tracepoint)
3197     fprintf (writer->fp, ":F%x", utp->orig_size);
3198   if (utp->cond)
3199     fprintf (writer->fp,
3200              ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
3201              utp->cond);
3202   fprintf (writer->fp, "\n");
3203   for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
3204     fprintf (writer->fp, "tp A%x:%s:%s\n",
3205              utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3206   for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
3207     fprintf (writer->fp, "tp S%x:%s:%s\n",
3208              utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3209   if (utp->at_string)
3210     {
3211       encode_source_string (utp->number, utp->addr,
3212                             "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
3213       fprintf (writer->fp, "tp Z%s\n", buf);
3214     }
3215   if (utp->cond_string)
3216     {
3217       encode_source_string (utp->number, utp->addr,
3218                             "cond", utp->cond_string,
3219                             buf, MAX_TRACE_UPLOAD);
3220       fprintf (writer->fp, "tp Z%s\n", buf);
3221     }
3222   for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
3223     {
3224       encode_source_string (utp->number, utp->addr, "cmd", act,
3225                             buf, MAX_TRACE_UPLOAD);
3226       fprintf (writer->fp, "tp Z%s\n", buf);
3227     }
3228   fprintf (writer->fp, "tp V%x:%s:%x:%s\n",
3229            utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3230            utp->hit_count,
3231            phex_nz (utp->traceframe_usage,
3232                     sizeof (utp->traceframe_usage)));
3233 }
3234
3235 /* This is the implementation of trace_file_write_ops method
3236    write_definition_end.  */
3237
3238 static void
3239 tfile_write_definition_end (struct trace_file_writer *self)
3240 {
3241   struct tfile_trace_file_writer *writer
3242     = (struct tfile_trace_file_writer *) self;
3243
3244   fprintf (writer->fp, "\n");
3245 }
3246
3247 /* This is the implementation of trace_file_write_ops method
3248    write_raw_data.  */
3249
3250 static void
3251 tfile_write_raw_data (struct trace_file_writer *self, gdb_byte *buf,
3252                       LONGEST len)
3253 {
3254   struct tfile_trace_file_writer *writer
3255     = (struct tfile_trace_file_writer *) self;
3256
3257   if (fwrite (buf, len, 1, writer->fp) < 1)
3258     perror_with_name (writer->pathname);
3259 }
3260
3261 /* This is the implementation of trace_file_write_ops method
3262    end.  */
3263
3264 static void
3265 tfile_end (struct trace_file_writer *self)
3266 {
3267   struct tfile_trace_file_writer *writer
3268     = (struct tfile_trace_file_writer *) self;
3269   uint32_t gotten = 0;
3270
3271   /* Mark the end of trace data.  */
3272   if (fwrite (&gotten, 4, 1, writer->fp) < 1)
3273     perror_with_name (writer->pathname);
3274 }
3275
3276 /* Operations to write trace buffers into TFILE format.  */
3277
3278 static const struct trace_file_write_ops tfile_write_ops =
3279 {
3280   tfile_dtor,
3281   tfile_target_save,
3282   tfile_start,
3283   tfile_write_header,
3284   tfile_write_regblock_type,
3285   tfile_write_status,
3286   tfile_write_uploaded_tsv,
3287   tfile_write_uploaded_tp,
3288   tfile_write_definition_end,
3289   tfile_write_raw_data,
3290   NULL,
3291   tfile_end,
3292 };
3293
3294 /* Helper macros.  */
3295
3296 #define TRACE_WRITE_R_BLOCK(writer, buf, size)  \
3297   writer->ops->frame_ops->write_r_block ((writer), (buf), (size))
3298 #define TRACE_WRITE_M_BLOCK_HEADER(writer, addr, size)            \
3299   writer->ops->frame_ops->write_m_block_header ((writer), (addr), \
3300                                                 (size))
3301 #define TRACE_WRITE_M_BLOCK_MEMORY(writer, buf, size)     \
3302   writer->ops->frame_ops->write_m_block_memory ((writer), (buf), \
3303                                                 (size))
3304 #define TRACE_WRITE_V_BLOCK(writer, num, val)   \
3305   writer->ops->frame_ops->write_v_block ((writer), (num), (val))
3306
3307 /* Save tracepoint data to file named FILENAME through WRITER.  WRITER
3308    determines the trace file format.  If TARGET_DOES_SAVE is non-zero,
3309    the save is performed on the target, otherwise GDB obtains all trace
3310    data and saves it locally.  */
3311
3312 static void
3313 trace_save (const char *filename, struct trace_file_writer *writer,
3314             int target_does_save)
3315 {
3316   struct trace_status *ts = current_trace_status ();
3317   int status;
3318   struct uploaded_tp *uploaded_tps = NULL, *utp;
3319   struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
3320
3321   ULONGEST offset = 0;
3322   gdb_byte buf[MAX_TRACE_UPLOAD];
3323 #define MAX_TRACE_UPLOAD 2000
3324   int written;
3325   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
3326
3327   /* If the target is to save the data to a file on its own, then just
3328      send the command and be done with it.  */
3329   if (target_does_save)
3330     {
3331       if (!writer->ops->target_save (writer, filename))
3332         error (_("Target failed to save trace data to '%s'."),
3333                filename);
3334       return;
3335     }
3336
3337   /* Get the trace status first before opening the file, so if the
3338      target is losing, we can get out without touching files.  */
3339   status = target_get_trace_status (ts);
3340
3341   writer->ops->start (writer, filename);
3342
3343   writer->ops->write_header (writer);
3344
3345   /* Write descriptive info.  */
3346
3347   /* Write out the size of a register block.  */
3348   writer->ops->write_regblock_type (writer, trace_regblock_size);
3349
3350   /* Write out status of the tracing run (aka "tstatus" info).  */
3351   writer->ops->write_status (writer, ts);
3352
3353   /* Note that we want to upload tracepoints and save those, rather
3354      than simply writing out the local ones, because the user may have
3355      changed tracepoints in GDB in preparation for a future tracing
3356      run, or maybe just mass-deleted all types of breakpoints as part
3357      of cleaning up.  So as not to contaminate the session, leave the
3358      data in its uploaded form, don't make into real tracepoints.  */
3359
3360   /* Get trace state variables first, they may be checked when parsing
3361      uploaded commands.  */
3362
3363   target_upload_trace_state_variables (&uploaded_tsvs);
3364
3365   for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
3366     writer->ops->write_uploaded_tsv (writer, utsv);
3367
3368   free_uploaded_tsvs (&uploaded_tsvs);
3369
3370   target_upload_tracepoints (&uploaded_tps);
3371
3372   for (utp = uploaded_tps; utp; utp = utp->next)
3373     target_get_tracepoint_status (NULL, utp);
3374
3375   for (utp = uploaded_tps; utp; utp = utp->next)
3376     writer->ops->write_uploaded_tp (writer, utp);
3377
3378   free_uploaded_tps (&uploaded_tps);
3379
3380   /* Mark the end of the definition section.  */
3381   writer->ops->write_definition_end (writer);
3382
3383   /* Get and write the trace data proper.  */
3384   while (1)
3385     {
3386       LONGEST gotten = 0;
3387
3388       /* The writer supports writing the contents of trace buffer
3389           directly to trace file.  Don't parse the contents of trace
3390           buffer.  */
3391       if (writer->ops->write_trace_buffer != NULL)
3392         {
3393           /* We ask for big blocks, in the hopes of efficiency, but
3394              will take less if the target has packet size limitations
3395              or some such.  */
3396           gotten = target_get_raw_trace_data (buf, offset,
3397                                               MAX_TRACE_UPLOAD);
3398           if (gotten < 0)
3399             error (_("Failure to get requested trace buffer data"));
3400           /* No more data is forthcoming, we're done.  */
3401           if (gotten == 0)
3402             break;
3403
3404           writer->ops->write_trace_buffer (writer, buf, gotten);
3405
3406           offset += gotten;
3407         }
3408       else
3409         {
3410           uint16_t tp_num;
3411           uint32_t tf_size;
3412           /* Parse the trace buffers according to how data are stored
3413              in trace buffer in GDBserver.  */
3414
3415           gotten = target_get_raw_trace_data (buf, offset, 6);
3416
3417           if (gotten == 0)
3418             break;
3419
3420           /* Read the first six bytes in, which is the tracepoint
3421              number and trace frame size.  */
3422           tp_num = (uint16_t)
3423             extract_unsigned_integer (&buf[0], 2, byte_order);
3424
3425           tf_size = (uint32_t)
3426             extract_unsigned_integer (&buf[2], 4, byte_order);
3427
3428           writer->ops->frame_ops->start (writer, tp_num);
3429           gotten = 6;
3430
3431           if (tf_size > 0)
3432             {
3433               unsigned int block;
3434
3435               offset += 6;
3436
3437               for (block = 0; block < tf_size; )
3438                 {
3439                   gdb_byte block_type;
3440
3441                   /* We'll fetch one block each time, in order to
3442                      handle the extremely large 'M' block.  We first
3443                      fetch one byte to get the type of the block.  */
3444                   gotten = target_get_raw_trace_data (buf, offset, 1);
3445                   if (gotten < 1)
3446                     error (_("Failure to get requested trace buffer data"));
3447
3448                   gotten = 1;
3449                   block += 1;
3450                   offset += 1;
3451
3452                   block_type = buf[0];
3453                   switch (block_type)
3454                     {
3455                     case 'R':
3456                       gotten
3457                         = target_get_raw_trace_data (buf, offset,
3458                                                      trace_regblock_size);
3459                       if (gotten < trace_regblock_size)
3460                         error (_("Failure to get requested trace"
3461                                  " buffer data"));
3462
3463                       TRACE_WRITE_R_BLOCK (writer, buf,
3464                                            trace_regblock_size);
3465                       break;
3466                     case 'M':
3467                       {
3468                         unsigned short mlen;
3469                         ULONGEST addr;
3470                         LONGEST t;
3471                         int j;
3472
3473                         t = target_get_raw_trace_data (buf,offset, 10);
3474                         if (t < 10)
3475                           error (_("Failure to get requested trace"
3476                                    " buffer data"));
3477
3478                         offset += 10;
3479                         block += 10;
3480
3481                         gotten = 0;
3482                         addr = (ULONGEST)
3483                           extract_unsigned_integer (buf, 8,
3484                                                     byte_order);
3485                         mlen = (unsigned short)
3486                           extract_unsigned_integer (&buf[8], 2,
3487                                                     byte_order);
3488
3489                         TRACE_WRITE_M_BLOCK_HEADER (writer, addr,
3490                                                     mlen);
3491
3492                         /* The memory contents in 'M' block may be
3493                            very large.  Fetch the data from the target
3494                            and write them into file one by one.  */
3495                         for (j = 0; j < mlen; )
3496                           {
3497                             unsigned int read_length;
3498
3499                             if (mlen - j > MAX_TRACE_UPLOAD)
3500                               read_length = MAX_TRACE_UPLOAD;
3501                             else
3502                               read_length = mlen - j;
3503
3504                             t = target_get_raw_trace_data (buf,
3505                                                            offset + j,
3506                                                            read_length);
3507                             if (t < read_length)
3508                               error (_("Failure to get requested"
3509                                        " trace buffer data"));
3510
3511                             TRACE_WRITE_M_BLOCK_MEMORY (writer, buf,
3512                                                         read_length);
3513
3514                             j += read_length;
3515                             gotten += read_length;
3516                           }
3517
3518                         break;
3519                       }
3520                     case 'V':
3521                       {
3522                         int vnum;
3523                         LONGEST val;
3524
3525                         gotten
3526                           = target_get_raw_trace_data (buf, offset,
3527                                                        12);
3528                         if (gotten < 12)
3529                           error (_("Failure to get requested"
3530                                    " trace buffer data"));
3531
3532                         vnum  = (int) extract_signed_integer (buf,
3533                                                               4,
3534                                                               byte_order);
3535                         val
3536                           = extract_signed_integer (&buf[4], 8,
3537                                                     byte_order);
3538
3539                         TRACE_WRITE_V_BLOCK (writer, vnum, val);
3540                       }
3541                       break;
3542                     default:
3543                       error (_("Unknown block type '%c' (0x%x) in"
3544                                " trace frame"),
3545                              block_type, block_type);
3546                     }
3547
3548                   block += gotten;
3549                   offset += gotten;
3550                 }
3551             }
3552           else
3553             offset += gotten;
3554
3555           writer->ops->frame_ops->end (writer);
3556         }
3557     }
3558
3559   writer->ops->end (writer);
3560 }
3561
3562 /* Return a trace writer for TFILE format.  */
3563
3564 static struct trace_file_writer *
3565 tfile_trace_file_writer_new (void)
3566 {
3567   struct tfile_trace_file_writer *writer
3568     = xmalloc (sizeof (struct tfile_trace_file_writer));
3569
3570   writer->base.ops = &tfile_write_ops;
3571   writer->fp = NULL;
3572   writer->pathname = NULL;
3573
3574   return (struct trace_file_writer *) writer;
3575 }
3576
3577 static void
3578 trace_save_command (char *args, int from_tty)
3579 {
3580   int target_does_save = 0;
3581   char **argv;
3582   char *filename = NULL;
3583   struct cleanup *back_to;
3584   int generate_ctf = 0;
3585   struct trace_file_writer *writer = NULL;
3586
3587   if (args == NULL)
3588     error_no_arg (_("file in which to save trace data"));
3589
3590   argv = gdb_buildargv (args);
3591   back_to = make_cleanup_freeargv (argv);
3592
3593   for (; *argv; ++argv)
3594     {
3595       if (strcmp (*argv, "-r") == 0)
3596         target_does_save = 1;
3597       if (strcmp (*argv, "-ctf") == 0)
3598         generate_ctf = 1;
3599       else if (**argv == '-')
3600         error (_("unknown option `%s'"), *argv);
3601       else
3602         filename = *argv;
3603     }
3604
3605   if (!filename)
3606     error_no_arg (_("file in which to save trace data"));
3607
3608   if (generate_ctf)
3609     writer = ctf_trace_file_writer_new ();
3610   else
3611     writer = tfile_trace_file_writer_new ();
3612
3613   make_cleanup (trace_file_writer_xfree, writer);
3614
3615   trace_save (filename, writer, target_does_save);
3616
3617   if (from_tty)
3618     printf_filtered (_("Trace data saved to %s '%s'.\n"),
3619                      generate_ctf ? "directory" : "file", filename);
3620
3621   do_cleanups (back_to);
3622 }
3623
3624 /* Save the trace data to file FILENAME of tfile format.  */
3625
3626 void
3627 trace_save_tfile (const char *filename, int target_does_save)
3628 {
3629   struct trace_file_writer *writer;
3630   struct cleanup *back_to;
3631
3632   writer = tfile_trace_file_writer_new ();
3633   back_to = make_cleanup (trace_file_writer_xfree, writer);
3634   trace_save (filename, writer, target_does_save);
3635   do_cleanups (back_to);
3636 }
3637
3638 /* Save the trace data to dir DIRNAME of ctf format.  */
3639
3640 void
3641 trace_save_ctf (const char *dirname, int target_does_save)
3642 {
3643   struct trace_file_writer *writer;
3644   struct cleanup *back_to;
3645
3646   writer = ctf_trace_file_writer_new ();
3647   back_to = make_cleanup (trace_file_writer_xfree, writer);
3648
3649   trace_save (dirname, writer, target_does_save);
3650   do_cleanups (back_to);
3651 }
3652
3653 /* Tell the target what to do with an ongoing tracing run if GDB
3654    disconnects for some reason.  */
3655
3656 static void
3657 set_disconnected_tracing (char *args, int from_tty,
3658                           struct cmd_list_element *c)
3659 {
3660   target_set_disconnected_tracing (disconnected_tracing);
3661 }
3662
3663 static void
3664 set_circular_trace_buffer (char *args, int from_tty,
3665                            struct cmd_list_element *c)
3666 {
3667   target_set_circular_trace_buffer (circular_trace_buffer);
3668 }
3669
3670 static void
3671 set_trace_buffer_size (char *args, int from_tty,
3672                            struct cmd_list_element *c)
3673 {
3674   target_set_trace_buffer_size (trace_buffer_size);
3675 }
3676
3677 static void
3678 set_trace_user (char *args, int from_tty,
3679                 struct cmd_list_element *c)
3680 {
3681   int ret;
3682
3683   ret = target_set_trace_notes (trace_user, NULL, NULL);
3684
3685   if (!ret)
3686     warning (_("Target does not support trace notes, user ignored"));
3687 }
3688
3689 static void
3690 set_trace_notes (char *args, int from_tty,
3691                  struct cmd_list_element *c)
3692 {
3693   int ret;
3694
3695   ret = target_set_trace_notes (NULL, trace_notes, NULL);
3696
3697   if (!ret)
3698     warning (_("Target does not support trace notes, note ignored"));
3699 }
3700
3701 static void
3702 set_trace_stop_notes (char *args, int from_tty,
3703                       struct cmd_list_element *c)
3704 {
3705   int ret;
3706
3707   ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
3708
3709   if (!ret)
3710     warning (_("Target does not support trace notes, stop note ignored"));
3711 }
3712
3713 /* Convert the memory pointed to by mem into hex, placing result in buf.
3714  * Return a pointer to the last char put in buf (null)
3715  * "stolen" from sparc-stub.c
3716  */
3717
3718 static const char hexchars[] = "0123456789abcdef";
3719
3720 static char *
3721 mem2hex (gdb_byte *mem, char *buf, int count)
3722 {
3723   gdb_byte ch;
3724
3725   while (count-- > 0)
3726     {
3727       ch = *mem++;
3728
3729       *buf++ = hexchars[ch >> 4];
3730       *buf++ = hexchars[ch & 0xf];
3731     }
3732
3733   *buf = 0;
3734
3735   return buf;
3736 }
3737
3738 int
3739 get_traceframe_number (void)
3740 {
3741   return traceframe_number;
3742 }
3743
3744 int
3745 get_tracepoint_number (void)
3746 {
3747   return tracepoint_number;
3748 }
3749
3750 /* Make the traceframe NUM be the current trace frame.  Does nothing
3751    if NUM is already current.  */
3752
3753 void
3754 set_current_traceframe (int num)
3755 {
3756   int newnum;
3757
3758   if (traceframe_number == num)
3759     {
3760       /* Nothing to do.  */
3761       return;
3762     }
3763
3764   newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3765
3766   if (newnum != num)
3767     warning (_("could not change traceframe"));
3768
3769   set_traceframe_num (newnum);
3770
3771   /* Changing the traceframe changes our view of registers and of the
3772      frame chain.  */
3773   registers_changed ();
3774
3775   clear_traceframe_info ();
3776 }
3777
3778 /* Make the traceframe NUM be the current trace frame, and do nothing
3779    more.  */
3780
3781 void
3782 set_traceframe_number (int num)
3783 {
3784   traceframe_number = num;
3785 }
3786
3787 /* A cleanup used when switching away and back from tfind mode.  */
3788
3789 struct current_traceframe_cleanup
3790 {
3791   /* The traceframe we were inspecting.  */
3792   int traceframe_number;
3793 };
3794
3795 static void
3796 do_restore_current_traceframe_cleanup (void *arg)
3797 {
3798   struct current_traceframe_cleanup *old = arg;
3799
3800   set_current_traceframe (old->traceframe_number);
3801 }
3802
3803 static void
3804 restore_current_traceframe_cleanup_dtor (void *arg)
3805 {
3806   struct current_traceframe_cleanup *old = arg;
3807
3808   xfree (old);
3809 }
3810
3811 struct cleanup *
3812 make_cleanup_restore_current_traceframe (void)
3813 {
3814   struct current_traceframe_cleanup *old;
3815
3816   old = xmalloc (sizeof (struct current_traceframe_cleanup));
3817   old->traceframe_number = traceframe_number;
3818
3819   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3820                             restore_current_traceframe_cleanup_dtor);
3821 }
3822
3823 struct cleanup *
3824 make_cleanup_restore_traceframe_number (void)
3825 {
3826   return make_cleanup_restore_integer (&traceframe_number);
3827 }
3828
3829 /* Given a number and address, return an uploaded tracepoint with that
3830    number, creating if necessary.  */
3831
3832 struct uploaded_tp *
3833 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3834 {
3835   struct uploaded_tp *utp;
3836
3837   for (utp = *utpp; utp; utp = utp->next)
3838     if (utp->number == num && utp->addr == addr)
3839       return utp;
3840   utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3841   memset (utp, 0, sizeof (struct uploaded_tp));
3842   utp->number = num;
3843   utp->addr = addr;
3844   utp->actions = NULL;
3845   utp->step_actions = NULL;
3846   utp->cmd_strings = NULL;
3847   utp->next = *utpp;
3848   *utpp = utp;
3849   return utp;
3850 }
3851
3852 static void
3853 free_uploaded_tps (struct uploaded_tp **utpp)
3854 {
3855   struct uploaded_tp *next_one;
3856
3857   while (*utpp)
3858     {
3859       next_one = (*utpp)->next;
3860       xfree (*utpp);
3861       *utpp = next_one;
3862     }
3863 }
3864
3865 /* Given a number and address, return an uploaded tracepoint with that
3866    number, creating if necessary.  */
3867
3868 struct uploaded_tsv *
3869 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3870 {
3871   struct uploaded_tsv *utsv;
3872
3873   for (utsv = *utsvp; utsv; utsv = utsv->next)
3874     if (utsv->number == num)
3875       return utsv;
3876   utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3877   memset (utsv, 0, sizeof (struct uploaded_tsv));
3878   utsv->number = num;
3879   utsv->next = *utsvp;
3880   *utsvp = utsv;
3881   return utsv;
3882 }
3883
3884 static void
3885 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3886 {
3887   struct uploaded_tsv *next_one;
3888
3889   while (*utsvp)
3890     {
3891       next_one = (*utsvp)->next;
3892       xfree (*utsvp);
3893       *utsvp = next_one;
3894     }
3895 }
3896
3897 /* FIXME this function is heuristic and will miss the cases where the
3898    conditional is semantically identical but differs in whitespace,
3899    such as "x == 0" vs "x==0".  */
3900
3901 static int
3902 cond_string_is_same (char *str1, char *str2)
3903 {
3904   if (str1 == NULL || str2 == NULL)
3905     return (str1 == str2);
3906
3907   return (strcmp (str1, str2) == 0);
3908 }
3909
3910 /* Look for an existing tracepoint that seems similar enough to the
3911    uploaded one.  Enablement isn't compared, because the user can
3912    toggle that freely, and may have done so in anticipation of the
3913    next trace run.  Return the location of matched tracepoint.  */
3914
3915 static struct bp_location *
3916 find_matching_tracepoint_location (struct uploaded_tp *utp)
3917 {
3918   VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3919   int ix;
3920   struct breakpoint *b;
3921   struct bp_location *loc;
3922
3923   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3924     {
3925       struct tracepoint *t = (struct tracepoint *) b;
3926
3927       if (b->type == utp->type
3928           && t->step_count == utp->step
3929           && t->pass_count == utp->pass
3930           && cond_string_is_same (t->base.cond_string, utp->cond_string)
3931           /* FIXME also test actions.  */
3932           )
3933         {
3934           /* Scan the locations for an address match.  */
3935           for (loc = b->loc; loc; loc = loc->next)
3936             {
3937               if (loc->address == utp->addr)
3938                 return loc;
3939             }
3940         }
3941     }
3942   return NULL;
3943 }
3944
3945 /* Given a list of tracepoints uploaded from a target, attempt to
3946    match them up with existing tracepoints, and create new ones if not
3947    found.  */
3948
3949 void
3950 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3951 {
3952   struct uploaded_tp *utp;
3953   /* A set of tracepoints which are modified.  */
3954   VEC(breakpoint_p) *modified_tp = NULL;
3955   int ix;
3956   struct breakpoint *b;
3957
3958   /* Look for GDB tracepoints that match up with our uploaded versions.  */
3959   for (utp = *uploaded_tps; utp; utp = utp->next)
3960     {
3961       struct bp_location *loc;
3962       struct tracepoint *t;
3963
3964       loc = find_matching_tracepoint_location (utp);
3965       if (loc)
3966         {
3967           int found = 0;
3968
3969           /* Mark this location as already inserted.  */
3970           loc->inserted = 1;
3971           t = (struct tracepoint *) loc->owner;
3972           printf_filtered (_("Assuming tracepoint %d is same "
3973                              "as target's tracepoint %d at %s.\n"),
3974                            loc->owner->number, utp->number,
3975                            paddress (loc->gdbarch, utp->addr));
3976
3977           /* The tracepoint LOC->owner was modified (the location LOC
3978              was marked as inserted in the target).  Save it in
3979              MODIFIED_TP if not there yet.  The 'breakpoint-modified'
3980              observers will be notified later once for each tracepoint
3981              saved in MODIFIED_TP.  */
3982           for (ix = 0;
3983                VEC_iterate (breakpoint_p, modified_tp, ix, b);
3984                ix++)
3985             if (b == loc->owner)
3986               {
3987                 found = 1;
3988                 break;
3989               }
3990           if (!found)
3991             VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3992         }
3993       else
3994         {
3995           t = create_tracepoint_from_upload (utp);
3996           if (t)
3997             printf_filtered (_("Created tracepoint %d for "
3998                                "target's tracepoint %d at %s.\n"),
3999                              t->base.number, utp->number,
4000                              paddress (get_current_arch (), utp->addr));
4001           else
4002             printf_filtered (_("Failed to create tracepoint for target's "
4003                                "tracepoint %d at %s, skipping it.\n"),
4004                              utp->number,
4005                              paddress (get_current_arch (), utp->addr));
4006         }
4007       /* Whether found or created, record the number used by the
4008          target, to help with mapping target tracepoints back to their
4009          counterparts here.  */
4010       if (t)
4011         t->number_on_target = utp->number;
4012     }
4013
4014   /* Notify 'breakpoint-modified' observer that at least one of B's
4015      locations was changed.  */
4016   for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
4017     observer_notify_breakpoint_modified (b);
4018
4019   VEC_free (breakpoint_p, modified_tp);
4020   free_uploaded_tps (uploaded_tps);
4021 }
4022
4023 /* Trace state variables don't have much to identify them beyond their
4024    name, so just use that to detect matches.  */
4025
4026 static struct trace_state_variable *
4027 find_matching_tsv (struct uploaded_tsv *utsv)
4028 {
4029   if (!utsv->name)
4030     return NULL;
4031
4032   return find_trace_state_variable (utsv->name);
4033 }
4034
4035 static struct trace_state_variable *
4036 create_tsv_from_upload (struct uploaded_tsv *utsv)
4037 {
4038   const char *namebase;
4039   char *buf;
4040   int try_num = 0;
4041   struct trace_state_variable *tsv;
4042   struct cleanup *old_chain;
4043
4044   if (utsv->name)
4045     {
4046       namebase = utsv->name;
4047       buf = xstrprintf ("%s", namebase);
4048     }
4049   else
4050     {
4051       namebase = "__tsv";
4052       buf = xstrprintf ("%s_%d", namebase, try_num++);
4053     }
4054
4055   /* Fish for a name that is not in use.  */
4056   /* (should check against all internal vars?)  */
4057   while (find_trace_state_variable (buf))
4058     {
4059       xfree (buf);
4060       buf = xstrprintf ("%s_%d", namebase, try_num++);
4061     }
4062
4063   old_chain = make_cleanup (xfree, buf);
4064
4065   /* We have an available name, create the variable.  */
4066   tsv = create_trace_state_variable (buf);
4067   tsv->initial_value = utsv->initial_value;
4068   tsv->builtin = utsv->builtin;
4069
4070   observer_notify_tsv_created (tsv);
4071
4072   do_cleanups (old_chain);
4073
4074   return tsv;
4075 }
4076
4077 /* Given a list of uploaded trace state variables, try to match them
4078    up with existing variables, or create additional ones.  */
4079
4080 void
4081 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
4082 {
4083   int ix;
4084   struct uploaded_tsv *utsv;
4085   struct trace_state_variable *tsv;
4086   int highest;
4087
4088   /* Most likely some numbers will have to be reassigned as part of
4089      the merge, so clear them all in anticipation.  */
4090   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4091     tsv->number = 0;
4092
4093   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
4094     {
4095       tsv = find_matching_tsv (utsv);
4096       if (tsv)
4097         {
4098           if (info_verbose)
4099             printf_filtered (_("Assuming trace state variable $%s "
4100                                "is same as target's variable %d.\n"),
4101                              tsv->name, utsv->number);
4102         }
4103       else
4104         {
4105           tsv = create_tsv_from_upload (utsv);
4106           if (info_verbose)
4107             printf_filtered (_("Created trace state variable "
4108                                "$%s for target's variable %d.\n"),
4109                              tsv->name, utsv->number);
4110         }
4111       /* Give precedence to numberings that come from the target.  */
4112       if (tsv)
4113         tsv->number = utsv->number;
4114     }
4115
4116   /* Renumber everything that didn't get a target-assigned number.  */
4117   highest = 0;
4118   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4119     if (tsv->number > highest)
4120       highest = tsv->number;
4121
4122   ++highest;
4123   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4124     if (tsv->number == 0)
4125       tsv->number = highest++;
4126
4127   free_uploaded_tsvs (uploaded_tsvs);
4128 }
4129
4130 /* target tfile command */
4131
4132 static struct target_ops tfile_ops;
4133
4134 /* Fill in tfile_ops with its defined operations and properties.  */
4135
4136 #define TRACE_HEADER_SIZE 8
4137
4138 static char *trace_filename;
4139 static int trace_fd = -1;
4140 static off_t trace_frames_offset;
4141 static off_t cur_offset;
4142 static int cur_data_size;
4143 int trace_regblock_size;
4144
4145 static void tfile_interp_line (char *line,
4146                                struct uploaded_tp **utpp,
4147                                struct uploaded_tsv **utsvp);
4148
4149 /* Read SIZE bytes into READBUF from the trace frame, starting at
4150    TRACE_FD's current position.  Note that this call `read'
4151    underneath, hence it advances the file's seek position.  Throws an
4152    error if the `read' syscall fails, or less than SIZE bytes are
4153    read.  */
4154
4155 static void
4156 tfile_read (gdb_byte *readbuf, int size)
4157 {
4158   int gotten;
4159
4160   gotten = read (trace_fd, readbuf, size);
4161   if (gotten < 0)
4162     perror_with_name (trace_filename);
4163   else if (gotten < size)
4164     error (_("Premature end of file while reading trace file"));
4165 }
4166
4167 static void
4168 tfile_open (char *filename, int from_tty)
4169 {
4170   volatile struct gdb_exception ex;
4171   char *temp;
4172   struct cleanup *old_chain;
4173   int flags;
4174   int scratch_chan;
4175   char header[TRACE_HEADER_SIZE];
4176   char linebuf[1000]; /* Should be max remote packet size or so.  */
4177   gdb_byte byte;
4178   int bytes, i;
4179   struct trace_status *ts;
4180   struct uploaded_tp *uploaded_tps = NULL;
4181   struct uploaded_tsv *uploaded_tsvs = NULL;
4182
4183   target_preopen (from_tty);
4184   if (!filename)
4185     error (_("No trace file specified."));
4186
4187   filename = tilde_expand (filename);
4188   if (!IS_ABSOLUTE_PATH(filename))
4189     {
4190       temp = concat (current_directory, "/", filename, (char *) NULL);
4191       xfree (filename);
4192       filename = temp;
4193     }
4194
4195   old_chain = make_cleanup (xfree, filename);
4196
4197   flags = O_BINARY | O_LARGEFILE;
4198   flags |= O_RDONLY;
4199   scratch_chan = gdb_open_cloexec (filename, flags, 0);
4200   if (scratch_chan < 0)
4201     perror_with_name (filename);
4202
4203   /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
4204
4205   discard_cleanups (old_chain); /* Don't free filename any more.  */
4206   unpush_target (&tfile_ops);
4207
4208   trace_filename = xstrdup (filename);
4209   trace_fd = scratch_chan;
4210
4211   bytes = 0;
4212   /* Read the file header and test for validity.  */
4213   tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
4214
4215   bytes += TRACE_HEADER_SIZE;
4216   if (!(header[0] == 0x7f
4217         && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
4218     error (_("File is not a valid trace file."));
4219
4220   push_target (&tfile_ops);
4221
4222   trace_regblock_size = 0;
4223   ts = current_trace_status ();
4224   /* We know we're working with a file.  Record its name.  */
4225   ts->filename = trace_filename;
4226   /* Set defaults in case there is no status line.  */
4227   ts->running_known = 0;
4228   ts->stop_reason = trace_stop_reason_unknown;
4229   ts->traceframe_count = -1;
4230   ts->buffer_free = 0;
4231   ts->disconnected_tracing = 0;
4232   ts->circular_buffer = 0;
4233
4234   TRY_CATCH (ex, RETURN_MASK_ALL)
4235     {
4236       /* Read through a section of newline-terminated lines that
4237          define things like tracepoints.  */
4238       i = 0;
4239       while (1)
4240         {
4241           tfile_read (&byte, 1);
4242
4243           ++bytes;
4244           if (byte == '\n')
4245             {
4246               /* Empty line marks end of the definition section.  */
4247               if (i == 0)
4248                 break;
4249               linebuf[i] = '\0';
4250               i = 0;
4251               tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
4252             }
4253           else
4254             linebuf[i++] = byte;
4255           if (i >= 1000)
4256             error (_("Excessively long lines in trace file"));
4257         }
4258
4259       /* Record the starting offset of the binary trace data.  */
4260       trace_frames_offset = bytes;
4261
4262       /* If we don't have a blocksize, we can't interpret the
4263          traceframes.  */
4264       if (trace_regblock_size == 0)
4265         error (_("No register block size recorded in trace file"));
4266     }
4267   if (ex.reason < 0)
4268     {
4269       /* Pop the partially set up target.  */
4270       pop_target ();
4271       throw_exception (ex);
4272     }
4273
4274   if (ts->traceframe_count <= 0)
4275     warning (_("No traceframes present in this file."));
4276
4277   /* Add the file's tracepoints and variables into the current mix.  */
4278
4279   /* Get trace state variables first, they may be checked when parsing
4280      uploaded commands.  */
4281   merge_uploaded_trace_state_variables (&uploaded_tsvs);
4282
4283   merge_uploaded_tracepoints (&uploaded_tps);
4284 }
4285
4286 /* Interpret the given line from the definitions part of the trace
4287    file.  */
4288
4289 static void
4290 tfile_interp_line (char *line, struct uploaded_tp **utpp,
4291                    struct uploaded_tsv **utsvp)
4292 {
4293   char *p = line;
4294
4295   if (strncmp (p, "R ", strlen ("R ")) == 0)
4296     {
4297       p += strlen ("R ");
4298       trace_regblock_size = strtol (p, &p, 16);
4299     }
4300   else if (strncmp (p, "status ", strlen ("status ")) == 0)
4301     {
4302       p += strlen ("status ");
4303       parse_trace_status (p, current_trace_status ());
4304     }
4305   else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
4306     {
4307       p += strlen ("tp ");
4308       parse_tracepoint_definition (p, utpp);
4309     }
4310   else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
4311     {
4312       p += strlen ("tsv ");
4313       parse_tsv_definition (p, utsvp);
4314     }
4315   else
4316     warning (_("Ignoring trace file definition \"%s\""), line);
4317 }
4318
4319 /* Parse the part of trace status syntax that is shared between
4320    the remote protocol and the trace file reader.  */
4321
4322 void
4323 parse_trace_status (char *line, struct trace_status *ts)
4324 {
4325   char *p = line, *p1, *p2, *p3, *p_temp;
4326   int end;
4327   ULONGEST val;
4328
4329   ts->running_known = 1;
4330   ts->running = (*p++ == '1');
4331   ts->stop_reason = trace_stop_reason_unknown;
4332   xfree (ts->stop_desc);
4333   ts->stop_desc = NULL;
4334   ts->traceframe_count = -1;
4335   ts->traceframes_created = -1;
4336   ts->buffer_free = -1;
4337   ts->buffer_size = -1;
4338   ts->disconnected_tracing = 0;
4339   ts->circular_buffer = 0;
4340   xfree (ts->user_name);
4341   ts->user_name = NULL;
4342   xfree (ts->notes);
4343   ts->notes = NULL;
4344   ts->start_time = ts->stop_time = 0;
4345
4346   while (*p++)
4347     {
4348       p1 = strchr (p, ':');
4349       if (p1 == NULL)
4350         error (_("Malformed trace status, at %s\n\
4351 Status line: '%s'\n"), p, line);
4352       p3 = strchr (p, ';');
4353       if (p3 == NULL)
4354         p3 = p + strlen (p);
4355       if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
4356         {
4357           p = unpack_varlen_hex (++p1, &val);
4358           ts->stop_reason = trace_buffer_full;
4359         }
4360       else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
4361         {
4362           p = unpack_varlen_hex (++p1, &val);
4363           ts->stop_reason = trace_never_run;
4364         }
4365       else if (strncmp (p, stop_reason_names[tracepoint_passcount],
4366                         p1 - p) == 0)
4367         {
4368           p = unpack_varlen_hex (++p1, &val);
4369           ts->stop_reason = tracepoint_passcount;
4370           ts->stopping_tracepoint = val;
4371         }
4372       else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
4373         {
4374           p2 = strchr (++p1, ':');
4375           if (!p2 || p2 > p3)
4376             {
4377               /*older style*/
4378               p2 = p1;
4379             }
4380           else if (p2 != p1)
4381             {
4382               ts->stop_desc = xmalloc (strlen (line));
4383               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
4384               ts->stop_desc[end] = '\0';
4385             }
4386           else
4387             ts->stop_desc = xstrdup ("");
4388
4389           p = unpack_varlen_hex (++p2, &val);
4390           ts->stop_reason = tstop_command;
4391         }
4392       else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
4393         {
4394           p = unpack_varlen_hex (++p1, &val);
4395           ts->stop_reason = trace_disconnected;
4396         }
4397       else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
4398         {
4399           p2 = strchr (++p1, ':');
4400           if (p2 != p1)
4401             {
4402               ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
4403               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
4404               ts->stop_desc[end] = '\0';
4405             }
4406           else
4407             ts->stop_desc = xstrdup ("");
4408
4409           p = unpack_varlen_hex (++p2, &val);
4410           ts->stopping_tracepoint = val;
4411           ts->stop_reason = tracepoint_error;
4412         }
4413       else if (strncmp (p, "tframes", p1 - p) == 0)
4414         {
4415           p = unpack_varlen_hex (++p1, &val);
4416           ts->traceframe_count = val;
4417         }
4418       else if (strncmp (p, "tcreated", p1 - p) == 0)
4419         {
4420           p = unpack_varlen_hex (++p1, &val);
4421           ts->traceframes_created = val;
4422         }
4423       else if (strncmp (p, "tfree", p1 - p) == 0)
4424         {
4425           p = unpack_varlen_hex (++p1, &val);
4426           ts->buffer_free = val;
4427         }
4428       else if (strncmp (p, "tsize", p1 - p) == 0)
4429         {
4430           p = unpack_varlen_hex (++p1, &val);
4431           ts->buffer_size = val;
4432         }
4433       else if (strncmp (p, "disconn", p1 - p) == 0)
4434         {
4435           p = unpack_varlen_hex (++p1, &val);
4436           ts->disconnected_tracing = val;
4437         }
4438       else if (strncmp (p, "circular", p1 - p) == 0)
4439         {
4440           p = unpack_varlen_hex (++p1, &val);
4441           ts->circular_buffer = val;
4442         }
4443       else if (strncmp (p, "starttime", p1 - p) == 0)
4444         {
4445           p = unpack_varlen_hex (++p1, &val);
4446           ts->start_time = val;
4447         }
4448       else if (strncmp (p, "stoptime", p1 - p) == 0)
4449         {
4450           p = unpack_varlen_hex (++p1, &val);
4451           ts->stop_time = val;
4452         }
4453       else if (strncmp (p, "username", p1 - p) == 0)
4454         {
4455           ++p1;
4456           ts->user_name = xmalloc (strlen (p) / 2);
4457           end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1)  / 2);
4458           ts->user_name[end] = '\0';
4459           p = p3;
4460         }
4461       else if (strncmp (p, "notes", p1 - p) == 0)
4462         {
4463           ++p1;
4464           ts->notes = xmalloc (strlen (p) / 2);
4465           end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
4466           ts->notes[end] = '\0';
4467           p = p3;
4468         }
4469       else
4470         {
4471           /* Silently skip unknown optional info.  */
4472           p_temp = strchr (p1 + 1, ';');
4473           if (p_temp)
4474             p = p_temp;
4475           else
4476             /* Must be at the end.  */
4477             break;
4478         }
4479     }
4480 }
4481
4482 void
4483 parse_tracepoint_status (char *p, struct breakpoint *bp,
4484                          struct uploaded_tp *utp)
4485 {
4486   ULONGEST uval;
4487   struct tracepoint *tp = (struct tracepoint *) bp;
4488
4489   p = unpack_varlen_hex (p, &uval);
4490   if (tp)
4491     tp->base.hit_count += uval;
4492   else
4493     utp->hit_count += uval;
4494   p = unpack_varlen_hex (p + 1, &uval);
4495   if (tp)
4496     tp->traceframe_usage += uval;
4497   else
4498     utp->traceframe_usage += uval;
4499   /* Ignore any extra, allowing for future extensions.  */
4500 }
4501
4502 /* Given a line of text defining a part of a tracepoint, parse it into
4503    an "uploaded tracepoint".  */
4504
4505 void
4506 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
4507 {
4508   char *p;
4509   char piece;
4510   ULONGEST num, addr, step, pass, orig_size, xlen, start;
4511   int enabled, end;
4512   enum bptype type;
4513   char *cond, *srctype, *buf;
4514   struct uploaded_tp *utp = NULL;
4515
4516   p = line;
4517   /* Both tracepoint and action definitions start with the same number
4518      and address sequence.  */
4519   piece = *p++;
4520   p = unpack_varlen_hex (p, &num);
4521   p++;  /* skip a colon */
4522   p = unpack_varlen_hex (p, &addr);
4523   p++;  /* skip a colon */
4524   if (piece == 'T')
4525     {
4526       enabled = (*p++ == 'E');
4527       p++;  /* skip a colon */
4528       p = unpack_varlen_hex (p, &step);
4529       p++;  /* skip a colon */
4530       p = unpack_varlen_hex (p, &pass);
4531       type = bp_tracepoint;
4532       cond = NULL;
4533       /* Thumb through optional fields.  */
4534       while (*p == ':')
4535         {
4536           p++;  /* skip a colon */
4537           if (*p == 'F')
4538             {
4539               type = bp_fast_tracepoint;
4540               p++;
4541               p = unpack_varlen_hex (p, &orig_size);
4542             }
4543           else if (*p == 'S')
4544             {
4545               type = bp_static_tracepoint;
4546               p++;
4547             }
4548           else if (*p == 'X')
4549             {
4550               p++;
4551               p = unpack_varlen_hex (p, &xlen);
4552               p++;  /* skip a comma */
4553               cond = (char *) xmalloc (2 * xlen + 1);
4554               strncpy (cond, p, 2 * xlen);
4555               cond[2 * xlen] = '\0';
4556               p += 2 * xlen;
4557             }
4558           else
4559             warning (_("Unrecognized char '%c' in tracepoint "
4560                        "definition, skipping rest"), *p);
4561         }
4562       utp = get_uploaded_tp (num, addr, utpp);
4563       utp->type = type;
4564       utp->enabled = enabled;
4565       utp->step = step;
4566       utp->pass = pass;
4567       utp->cond = cond;
4568     }
4569   else if (piece == 'A')
4570     {
4571       utp = get_uploaded_tp (num, addr, utpp);
4572       VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
4573     }
4574   else if (piece == 'S')
4575     {
4576       utp = get_uploaded_tp (num, addr, utpp);
4577       VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
4578     }
4579   else if (piece == 'Z')
4580     {
4581       /* Parse a chunk of source form definition.  */
4582       utp = get_uploaded_tp (num, addr, utpp);
4583       srctype = p;
4584       p = strchr (p, ':');
4585       p++;  /* skip a colon */
4586       p = unpack_varlen_hex (p, &start);
4587       p++;  /* skip a colon */
4588       p = unpack_varlen_hex (p, &xlen);
4589       p++;  /* skip a colon */
4590
4591       buf = alloca (strlen (line));
4592
4593       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4594       buf[end] = '\0';
4595
4596       if (strncmp (srctype, "at:", strlen ("at:")) == 0)
4597         utp->at_string = xstrdup (buf);
4598       else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
4599         utp->cond_string = xstrdup (buf);
4600       else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
4601         VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
4602     }
4603   else if (piece == 'V')
4604     {
4605       utp = get_uploaded_tp (num, addr, utpp);
4606
4607       parse_tracepoint_status (p, NULL, utp);
4608     }
4609   else
4610     {
4611       /* Don't error out, the target might be sending us optional
4612          info that we don't care about.  */
4613       warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
4614     }
4615 }
4616
4617 /* Convert a textual description of a trace state variable into an
4618    uploaded object.  */
4619
4620 void
4621 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
4622 {
4623   char *p, *buf;
4624   ULONGEST num, initval, builtin;
4625   int end;
4626   struct uploaded_tsv *utsv = NULL;
4627
4628   buf = alloca (strlen (line));
4629
4630   p = line;
4631   p = unpack_varlen_hex (p, &num);
4632   p++; /* skip a colon */
4633   p = unpack_varlen_hex (p, &initval);
4634   p++; /* skip a colon */
4635   p = unpack_varlen_hex (p, &builtin);
4636   p++; /* skip a colon */
4637   end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4638   buf[end] = '\0';
4639
4640   utsv = get_uploaded_tsv (num, utsvp);
4641   utsv->initial_value = initval;
4642   utsv->builtin = builtin;
4643   utsv->name = xstrdup (buf);
4644 }
4645
4646 /* Close the trace file and generally clean up.  */
4647
4648 static void
4649 tfile_close (void)
4650 {
4651   int pid;
4652
4653   if (trace_fd < 0)
4654     return;
4655
4656   close (trace_fd);
4657   trace_fd = -1;
4658   xfree (trace_filename);
4659   trace_filename = NULL;
4660 }
4661
4662 static void
4663 tfile_files_info (struct target_ops *t)
4664 {
4665   printf_filtered ("\t`%s'\n", trace_filename);
4666 }
4667
4668 /* The trace status for a file is that tracing can never be run.  */
4669
4670 static int
4671 tfile_get_trace_status (struct trace_status *ts)
4672 {
4673   /* Other bits of trace status were collected as part of opening the
4674      trace files, so nothing to do here.  */
4675
4676   return -1;
4677 }
4678
4679 static void
4680 tfile_get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp)
4681 {
4682   /* Other bits of trace status were collected as part of opening the
4683      trace files, so nothing to do here.  */
4684 }
4685
4686 /* Given the position of a traceframe in the file, figure out what
4687    address the frame was collected at.  This would normally be the
4688    value of a collected PC register, but if not available, we
4689    improvise.  */
4690
4691 static CORE_ADDR
4692 tfile_get_traceframe_address (off_t tframe_offset)
4693 {
4694   CORE_ADDR addr = 0;
4695   short tpnum;
4696   struct tracepoint *tp;
4697   off_t saved_offset = cur_offset;
4698
4699   /* FIXME dig pc out of collected registers.  */
4700
4701   /* Fall back to using tracepoint address.  */
4702   lseek (trace_fd, tframe_offset, SEEK_SET);
4703   tfile_read ((gdb_byte *) &tpnum, 2);
4704   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4705                                           gdbarch_byte_order
4706                                               (target_gdbarch ()));
4707
4708   tp = get_tracepoint_by_number_on_target (tpnum);
4709   /* FIXME this is a poor heuristic if multiple locations.  */
4710   if (tp && tp->base.loc)
4711     addr = tp->base.loc->address;
4712
4713   /* Restore our seek position.  */
4714   cur_offset = saved_offset;
4715   lseek (trace_fd, cur_offset, SEEK_SET);
4716   return addr;
4717 }
4718
4719 /* Given a type of search and some parameters, scan the collection of
4720    traceframes in the file looking for a match.  When found, return
4721    both the traceframe and tracepoint number, otherwise -1 for
4722    each.  */
4723
4724 static int
4725 tfile_trace_find (enum trace_find_type type, int num,
4726                   CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
4727 {
4728   short tpnum;
4729   int tfnum = 0, found = 0;
4730   unsigned int data_size;
4731   struct tracepoint *tp;
4732   off_t offset, tframe_offset;
4733   CORE_ADDR tfaddr;
4734
4735   if (num == -1)
4736     {
4737       if (tpp)
4738         *tpp = -1;
4739       return -1;
4740     }
4741
4742   lseek (trace_fd, trace_frames_offset, SEEK_SET);
4743   offset = trace_frames_offset;
4744   while (1)
4745     {
4746       tframe_offset = offset;
4747       tfile_read ((gdb_byte *) &tpnum, 2);
4748       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4749                                               gdbarch_byte_order
4750                                                   (target_gdbarch ()));
4751       offset += 2;
4752       if (tpnum == 0)
4753         break;
4754       tfile_read ((gdb_byte *) &data_size, 4);
4755       data_size = (unsigned int) extract_unsigned_integer
4756                                      ((gdb_byte *) &data_size, 4,
4757                                       gdbarch_byte_order (target_gdbarch ()));
4758       offset += 4;
4759
4760       if (type == tfind_number)
4761         {
4762           /* Looking for a specific trace frame.  */
4763           if (tfnum == num)
4764             found = 1;
4765         }
4766       else
4767         {
4768           /* Start from the _next_ trace frame.  */
4769           if (tfnum > traceframe_number)
4770             {
4771               switch (type)
4772                 {
4773                 case tfind_pc:
4774                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4775                   if (tfaddr == addr1)
4776                     found = 1;
4777                   break;
4778                 case tfind_tp:
4779                   tp = get_tracepoint (num);
4780                   if (tp && tpnum == tp->number_on_target)
4781                     found = 1;
4782                   break;
4783                 case tfind_range:
4784                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4785                   if (addr1 <= tfaddr && tfaddr <= addr2)
4786                     found = 1;
4787                   break;
4788                 case tfind_outside:
4789                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4790                   if (!(addr1 <= tfaddr && tfaddr <= addr2))
4791                     found = 1;
4792                   break;
4793                 default:
4794                   internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4795                 }
4796             }
4797         }
4798
4799       if (found)
4800         {
4801           if (tpp)
4802             *tpp = tpnum;
4803           cur_offset = offset;
4804           cur_data_size = data_size;
4805
4806           return tfnum;
4807         }
4808       /* Skip past the traceframe's data.  */
4809       lseek (trace_fd, data_size, SEEK_CUR);
4810       offset += data_size;
4811       /* Update our own count of traceframes.  */
4812       ++tfnum;
4813     }
4814   /* Did not find what we were looking for.  */
4815   if (tpp)
4816     *tpp = -1;
4817   return -1;
4818 }
4819
4820 /* Prototype of the callback passed to tframe_walk_blocks.  */
4821 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4822
4823 /* Callback for traceframe_walk_blocks, used to find a given block
4824    type in a traceframe.  */
4825
4826 static int
4827 match_blocktype (char blocktype, void *data)
4828 {
4829   char *wantedp = data;
4830
4831   if (*wantedp == blocktype)
4832     return 1;
4833
4834   return 0;
4835 }
4836
4837 /* Walk over all traceframe block starting at POS offset from
4838    CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4839    unmodified.  If CALLBACK returns true, this returns the position in
4840    the traceframe where the block is found, relative to the start of
4841    the traceframe (cur_offset).  Returns -1 if no callback call
4842    returned true, indicating that all blocks have been walked.  */
4843
4844 static int
4845 traceframe_walk_blocks (walk_blocks_callback_func callback,
4846                         int pos, void *data)
4847 {
4848   /* Iterate through a traceframe's blocks, looking for a block of the
4849      requested type.  */
4850
4851   lseek (trace_fd, cur_offset + pos, SEEK_SET);
4852   while (pos < cur_data_size)
4853     {
4854       unsigned short mlen;
4855       char block_type;
4856
4857       tfile_read ((gdb_byte *) &block_type, 1);
4858
4859       ++pos;
4860
4861       if ((*callback) (block_type, data))
4862         return pos;
4863
4864       switch (block_type)
4865         {
4866         case 'R':
4867           lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4868           pos += trace_regblock_size;
4869           break;
4870         case 'M':
4871           lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4872           tfile_read ((gdb_byte *) &mlen, 2);
4873           mlen = (unsigned short)
4874                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4875                                           gdbarch_byte_order
4876                                               (target_gdbarch ()));
4877           lseek (trace_fd, mlen, SEEK_CUR);
4878           pos += (8 + 2 + mlen);
4879           break;
4880         case 'V':
4881           lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4882           pos += (4 + 8);
4883           break;
4884         default:
4885           error (_("Unknown block type '%c' (0x%x) in trace frame"),
4886                  block_type, block_type);
4887           break;
4888         }
4889     }
4890
4891   return -1;
4892 }
4893
4894 /* Convenience wrapper around traceframe_walk_blocks.  Looks for the
4895    position offset of a block of type TYPE_WANTED in the current trace
4896    frame, starting at POS.  Returns -1 if no such block was found.  */
4897
4898 static int
4899 traceframe_find_block_type (char type_wanted, int pos)
4900 {
4901   return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4902 }
4903
4904 /* Look for a block of saved registers in the traceframe, and get the
4905    requested register from it.  */
4906
4907 static void
4908 tfile_fetch_registers (struct target_ops *ops,
4909                        struct regcache *regcache, int regno)
4910 {
4911   struct gdbarch *gdbarch = get_regcache_arch (regcache);
4912   int offset, regn, regsize, pc_regno;
4913   gdb_byte *regs;
4914
4915   /* An uninitialized reg size says we're not going to be
4916      successful at getting register blocks.  */
4917   if (!trace_regblock_size)
4918     return;
4919
4920   regs = alloca (trace_regblock_size);
4921
4922   if (traceframe_find_block_type ('R', 0) >= 0)
4923     {
4924       tfile_read (regs, trace_regblock_size);
4925
4926       /* Assume the block is laid out in GDB register number order,
4927          each register with the size that it has in GDB.  */
4928       offset = 0;
4929       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4930         {
4931           regsize = register_size (gdbarch, regn);
4932           /* Make sure we stay within block bounds.  */
4933           if (offset + regsize >= trace_regblock_size)
4934             break;
4935           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4936             {
4937               if (regno == regn)
4938                 {
4939                   regcache_raw_supply (regcache, regno, regs + offset);
4940                   break;
4941                 }
4942               else if (regno == -1)
4943                 {
4944                   regcache_raw_supply (regcache, regn, regs + offset);
4945                 }
4946             }
4947           offset += regsize;
4948         }
4949       return;
4950     }
4951
4952   /* We get here if no register data has been found.  Mark registers
4953      as unavailable.  */
4954   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4955     regcache_raw_supply (regcache, regn, NULL);
4956
4957   /* We can often usefully guess that the PC is going to be the same
4958      as the address of the tracepoint.  */
4959   pc_regno = gdbarch_pc_regnum (gdbarch);
4960   if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4961     {
4962       struct tracepoint *tp = get_tracepoint (tracepoint_number);
4963
4964       if (tp && tp->base.loc)
4965         {
4966           /* But don't try to guess if tracepoint is multi-location...  */
4967           if (tp->base.loc->next)
4968             {
4969               warning (_("Tracepoint %d has multiple "
4970                          "locations, cannot infer $pc"),
4971                        tp->base.number);
4972               return;
4973             }
4974           /* ... or does while-stepping.  */
4975           if (tp->step_count > 0)
4976             {
4977               warning (_("Tracepoint %d does while-stepping, "
4978                          "cannot infer $pc"),
4979                        tp->base.number);
4980               return;
4981             }
4982
4983           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4984                                   gdbarch_byte_order (gdbarch),
4985                                   tp->base.loc->address);
4986           regcache_raw_supply (regcache, pc_regno, regs);
4987         }
4988     }
4989 }
4990
4991 static LONGEST
4992 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4993                     const char *annex, gdb_byte *readbuf,
4994                     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4995 {
4996   /* We're only doing regular memory for now.  */
4997   if (object != TARGET_OBJECT_MEMORY)
4998     return -1;
4999
5000   if (readbuf == NULL)
5001     error (_("tfile_xfer_partial: trace file is read-only"));
5002
5003  if (traceframe_number != -1)
5004     {
5005       int pos = 0;
5006
5007       /* Iterate through the traceframe's blocks, looking for
5008          memory.  */
5009       while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
5010         {
5011           ULONGEST maddr, amt;
5012           unsigned short mlen;
5013           enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
5014
5015           tfile_read ((gdb_byte *) &maddr, 8);
5016           maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5017                                             byte_order);
5018           tfile_read ((gdb_byte *) &mlen, 2);
5019           mlen = (unsigned short)
5020             extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
5021
5022           /* If the block includes the first part of the desired
5023              range, return as much it has; GDB will re-request the
5024              remainder, which might be in a different block of this
5025              trace frame.  */
5026           if (maddr <= offset && offset < (maddr + mlen))
5027             {
5028               amt = (maddr + mlen) - offset;
5029               if (amt > len)
5030                 amt = len;
5031
5032               if (maddr != offset)
5033                 lseek (trace_fd, offset - maddr, SEEK_CUR);
5034               tfile_read (readbuf, amt);
5035               return amt;
5036             }
5037
5038           /* Skip over this block.  */
5039           pos += (8 + 2 + mlen);
5040         }
5041     }
5042
5043   /* It's unduly pedantic to refuse to look at the executable for
5044      read-only pieces; so do the equivalent of readonly regions aka
5045      QTro packet.  */
5046   /* FIXME account for relocation at some point.  */
5047   if (exec_bfd)
5048     {
5049       asection *s;
5050       bfd_size_type size;
5051       bfd_vma vma;
5052
5053       for (s = exec_bfd->sections; s; s = s->next)
5054         {
5055           if ((s->flags & SEC_LOAD) == 0
5056               || (s->flags & SEC_READONLY) == 0)
5057             continue;
5058
5059           vma = s->vma;
5060           size = bfd_get_section_size (s);
5061           if (vma <= offset && offset < (vma + size))
5062             {
5063               ULONGEST amt;
5064
5065               amt = (vma + size) - offset;
5066               if (amt > len)
5067                 amt = len;
5068
5069               amt = bfd_get_section_contents (exec_bfd, s,
5070                                               readbuf, offset - vma, amt);
5071               return amt;
5072             }
5073         }
5074     }
5075
5076   /* Indicate failure to find the requested memory block.  */
5077   return -1;
5078 }
5079
5080 /* Iterate through the blocks of a trace frame, looking for a 'V'
5081    block with a matching tsv number.  */
5082
5083 static int
5084 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
5085 {
5086   int pos;
5087   int found = 0;
5088
5089   /* Iterate over blocks in current frame and find the last 'V'
5090      block in which tsv number is TSVNUM.  In one trace frame, there
5091      may be multiple 'V' blocks created for a given trace variable,
5092      and the last matched 'V' block contains the updated value.  */
5093   pos = 0;
5094   while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
5095     {
5096       int vnum;
5097
5098       tfile_read ((gdb_byte *) &vnum, 4);
5099       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
5100                                            gdbarch_byte_order
5101                                            (target_gdbarch ()));
5102       if (tsvnum == vnum)
5103         {
5104           tfile_read ((gdb_byte *) val, 8);
5105           *val = extract_signed_integer ((gdb_byte *) val, 8,
5106                                          gdbarch_byte_order
5107                                          (target_gdbarch ()));
5108           found = 1;
5109         }
5110       pos += (4 + 8);
5111     }
5112
5113   return found;
5114 }
5115
5116 static int
5117 tfile_has_all_memory (struct target_ops *ops)
5118 {
5119   return 1;
5120 }
5121
5122 static int
5123 tfile_has_memory (struct target_ops *ops)
5124 {
5125   return 1;
5126 }
5127
5128 static int
5129 tfile_has_stack (struct target_ops *ops)
5130 {
5131   return traceframe_number != -1;
5132 }
5133
5134 static int
5135 tfile_has_registers (struct target_ops *ops)
5136 {
5137   return traceframe_number != -1;
5138 }
5139
5140 /* Callback for traceframe_walk_blocks.  Builds a traceframe_info
5141    object for the tfile target's current traceframe.  */
5142
5143 static int
5144 build_traceframe_info (char blocktype, void *data)
5145 {
5146   struct traceframe_info *info = data;
5147
5148   switch (blocktype)
5149     {
5150     case 'M':
5151       {
5152         struct mem_range *r;
5153         ULONGEST maddr;
5154         unsigned short mlen;
5155
5156         tfile_read ((gdb_byte *) &maddr, 8);
5157         maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5158                                           gdbarch_byte_order
5159                                           (target_gdbarch ()));
5160         tfile_read ((gdb_byte *) &mlen, 2);
5161         mlen = (unsigned short)
5162                 extract_unsigned_integer ((gdb_byte *) &mlen,
5163                                           2, gdbarch_byte_order
5164                                           (target_gdbarch ()));
5165
5166         r = VEC_safe_push (mem_range_s, info->memory, NULL);
5167
5168         r->start = maddr;
5169         r->length = mlen;
5170         break;
5171       }
5172     case 'V':
5173     case 'R':
5174     case 'S':
5175       {
5176         break;
5177       }
5178     default:
5179       warning (_("Unhandled trace block type (%d) '%c ' "
5180                  "while building trace frame info."),
5181                blocktype, blocktype);
5182       break;
5183     }
5184
5185   return 0;
5186 }
5187
5188 static struct traceframe_info *
5189 tfile_traceframe_info (void)
5190 {
5191   struct traceframe_info *info = XCNEW (struct traceframe_info);
5192
5193   traceframe_walk_blocks (build_traceframe_info, 0, info);
5194   return info;
5195 }
5196
5197 static void
5198 init_tfile_ops (void)
5199 {
5200   tfile_ops.to_shortname = "tfile";
5201   tfile_ops.to_longname = "Local trace dump file";
5202   tfile_ops.to_doc
5203     = "Use a trace file as a target.  Specify the filename of the trace file.";
5204   tfile_ops.to_open = tfile_open;
5205   tfile_ops.to_close = tfile_close;
5206   tfile_ops.to_fetch_registers = tfile_fetch_registers;
5207   tfile_ops.to_xfer_partial = tfile_xfer_partial;
5208   tfile_ops.to_files_info = tfile_files_info;
5209   tfile_ops.to_get_trace_status = tfile_get_trace_status;
5210   tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
5211   tfile_ops.to_trace_find = tfile_trace_find;
5212   tfile_ops.to_get_trace_state_variable_value
5213     = tfile_get_trace_state_variable_value;
5214   tfile_ops.to_stratum = process_stratum;
5215   tfile_ops.to_has_all_memory = tfile_has_all_memory;
5216   tfile_ops.to_has_memory = tfile_has_memory;
5217   tfile_ops.to_has_stack = tfile_has_stack;
5218   tfile_ops.to_has_registers = tfile_has_registers;
5219   tfile_ops.to_traceframe_info = tfile_traceframe_info;
5220   tfile_ops.to_magic = OPS_MAGIC;
5221 }
5222
5223 void
5224 free_current_marker (void *arg)
5225 {
5226   struct static_tracepoint_marker **marker_p = arg;
5227
5228   if (*marker_p != NULL)
5229     {
5230       release_static_tracepoint_marker (*marker_p);
5231       xfree (*marker_p);
5232     }
5233   else
5234     *marker_p = NULL;
5235 }
5236
5237 /* Given a line of text defining a static tracepoint marker, parse it
5238    into a "static tracepoint marker" object.  Throws an error is
5239    parsing fails.  If PP is non-null, it points to one past the end of
5240    the parsed marker definition.  */
5241
5242 void
5243 parse_static_tracepoint_marker_definition (char *line, char **pp,
5244                                            struct static_tracepoint_marker *marker)
5245 {
5246   char *p, *endp;
5247   ULONGEST addr;
5248   int end;
5249
5250   p = line;
5251   p = unpack_varlen_hex (p, &addr);
5252   p++;  /* skip a colon */
5253
5254   marker->gdbarch = target_gdbarch ();
5255   marker->address = (CORE_ADDR) addr;
5256
5257   endp = strchr (p, ':');
5258   if (endp == NULL)
5259     error (_("bad marker definition: %s"), line);
5260
5261   marker->str_id = xmalloc (endp - p + 1);
5262   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
5263   marker->str_id[end] = '\0';
5264
5265   p += 2 * end;
5266   p++;  /* skip a colon */
5267
5268   marker->extra = xmalloc (strlen (p) + 1);
5269   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
5270   marker->extra[end] = '\0';
5271
5272   if (pp)
5273     *pp = p;
5274 }
5275
5276 /* Release a static tracepoint marker's contents.  Note that the
5277    object itself isn't released here.  There objects are usually on
5278    the stack.  */
5279
5280 void
5281 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
5282 {
5283   xfree (marker->str_id);
5284   marker->str_id = NULL;
5285 }
5286
5287 /* Print MARKER to gdb_stdout.  */
5288
5289 static void
5290 print_one_static_tracepoint_marker (int count,
5291                                     struct static_tracepoint_marker *marker)
5292 {
5293   struct command_line *l;
5294   struct symbol *sym;
5295
5296   char wrap_indent[80];
5297   char extra_field_indent[80];
5298   struct ui_out *uiout = current_uiout;
5299   struct cleanup *bkpt_chain;
5300   VEC(breakpoint_p) *tracepoints;
5301
5302   struct symtab_and_line sal;
5303
5304   init_sal (&sal);
5305
5306   sal.pc = marker->address;
5307
5308   tracepoints = static_tracepoints_here (marker->address);
5309
5310   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
5311
5312   /* A counter field to help readability.  This is not a stable
5313      identifier!  */
5314   ui_out_field_int (uiout, "count", count);
5315
5316   ui_out_field_string (uiout, "marker-id", marker->str_id);
5317
5318   ui_out_field_fmt (uiout, "enabled", "%c",
5319                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
5320   ui_out_spaces (uiout, 2);
5321
5322   strcpy (wrap_indent, "                                   ");
5323
5324   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
5325     strcat (wrap_indent, "           ");
5326   else
5327     strcat (wrap_indent, "                   ");
5328
5329   strcpy (extra_field_indent, "         ");
5330
5331   ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
5332
5333   sal = find_pc_line (marker->address, 0);
5334   sym = find_pc_sect_function (marker->address, NULL);
5335   if (sym)
5336     {
5337       ui_out_text (uiout, "in ");
5338       ui_out_field_string (uiout, "func",
5339                            SYMBOL_PRINT_NAME (sym));
5340       ui_out_wrap_hint (uiout, wrap_indent);
5341       ui_out_text (uiout, " at ");
5342     }
5343   else
5344     ui_out_field_skip (uiout, "func");
5345
5346   if (sal.symtab != NULL)
5347     {
5348       ui_out_field_string (uiout, "file",
5349                            symtab_to_filename_for_display (sal.symtab));
5350       ui_out_text (uiout, ":");
5351
5352       if (ui_out_is_mi_like_p (uiout))
5353         {
5354           const char *fullname = symtab_to_fullname (sal.symtab);
5355
5356           ui_out_field_string (uiout, "fullname", fullname);
5357         }
5358       else
5359         ui_out_field_skip (uiout, "fullname");
5360
5361       ui_out_field_int (uiout, "line", sal.line);
5362     }
5363   else
5364     {
5365       ui_out_field_skip (uiout, "fullname");
5366       ui_out_field_skip (uiout, "line");
5367     }
5368
5369   ui_out_text (uiout, "\n");
5370   ui_out_text (uiout, extra_field_indent);
5371   ui_out_text (uiout, _("Data: \""));
5372   ui_out_field_string (uiout, "extra-data", marker->extra);
5373   ui_out_text (uiout, "\"\n");
5374
5375   if (!VEC_empty (breakpoint_p, tracepoints))
5376     {
5377       struct cleanup *cleanup_chain;
5378       int ix;
5379       struct breakpoint *b;
5380
5381       cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
5382                                                            "tracepoints-at");
5383
5384       ui_out_text (uiout, extra_field_indent);
5385       ui_out_text (uiout, _("Probed by static tracepoints: "));
5386       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
5387         {
5388           if (ix > 0)
5389             ui_out_text (uiout, ", ");
5390           ui_out_text (uiout, "#");
5391           ui_out_field_int (uiout, "tracepoint-id", b->number);
5392         }
5393
5394       do_cleanups (cleanup_chain);
5395
5396       if (ui_out_is_mi_like_p (uiout))
5397         ui_out_field_int (uiout, "number-of-tracepoints",
5398                           VEC_length(breakpoint_p, tracepoints));
5399       else
5400         ui_out_text (uiout, "\n");
5401     }
5402   VEC_free (breakpoint_p, tracepoints);
5403
5404   do_cleanups (bkpt_chain);
5405 }
5406
5407 static void
5408 info_static_tracepoint_markers_command (char *arg, int from_tty)
5409 {
5410   VEC(static_tracepoint_marker_p) *markers;
5411   struct cleanup *old_chain;
5412   struct static_tracepoint_marker *marker;
5413   struct ui_out *uiout = current_uiout;
5414   int i;
5415
5416   /* We don't have to check target_can_use_agent and agent's capability on
5417      static tracepoint here, in order to be compatible with older GDBserver.
5418      We don't check USE_AGENT is true or not, because static tracepoints
5419      don't work without in-process agent, so we don't bother users to type
5420      `set agent on' when to use static tracepoint.  */
5421
5422   old_chain
5423     = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
5424                                            "StaticTracepointMarkersTable");
5425
5426   ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
5427
5428   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
5429
5430   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
5431   if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
5432     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
5433   else
5434     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
5435   ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
5436
5437   ui_out_table_body (uiout);
5438
5439   markers = target_static_tracepoint_markers_by_strid (NULL);
5440   make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
5441
5442   for (i = 0;
5443        VEC_iterate (static_tracepoint_marker_p,
5444                     markers, i, marker);
5445        i++)
5446     {
5447       print_one_static_tracepoint_marker (i + 1, marker);
5448       release_static_tracepoint_marker (marker);
5449     }
5450
5451   do_cleanups (old_chain);
5452 }
5453
5454 /* The $_sdata convenience variable is a bit special.  We don't know
5455    for sure type of the value until we actually have a chance to fetch
5456    the data --- the size of the object depends on what has been
5457    collected.  We solve this by making $_sdata be an internalvar that
5458    creates a new value on access.  */
5459
5460 /* Return a new value with the correct type for the sdata object of
5461    the current trace frame.  Return a void value if there's no object
5462    available.  */
5463
5464 static struct value *
5465 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
5466                   void *ignore)
5467 {
5468   LONGEST size;
5469   gdb_byte *buf;
5470
5471   /* We need to read the whole object before we know its size.  */
5472   size = target_read_alloc (&current_target,
5473                             TARGET_OBJECT_STATIC_TRACE_DATA,
5474                             NULL, &buf);
5475   if (size >= 0)
5476     {
5477       struct value *v;
5478       struct type *type;
5479
5480       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
5481                                size);
5482       v = allocate_value (type);
5483       memcpy (value_contents_raw (v), buf, size);
5484       xfree (buf);
5485       return v;
5486     }
5487   else
5488     return allocate_value (builtin_type (gdbarch)->builtin_void);
5489 }
5490
5491 #if !defined(HAVE_LIBEXPAT)
5492
5493 struct traceframe_info *
5494 parse_traceframe_info (const char *tframe_info)
5495 {
5496   static int have_warned;
5497
5498   if (!have_warned)
5499     {
5500       have_warned = 1;
5501       warning (_("Can not parse XML trace frame info; XML support "
5502                  "was disabled at compile time"));
5503     }
5504
5505   return NULL;
5506 }
5507
5508 #else /* HAVE_LIBEXPAT */
5509
5510 #include "xml-support.h"
5511
5512 /* Handle the start of a <memory> element.  */
5513
5514 static void
5515 traceframe_info_start_memory (struct gdb_xml_parser *parser,
5516                               const struct gdb_xml_element *element,
5517                               void *user_data, VEC(gdb_xml_value_s) *attributes)
5518 {
5519   struct traceframe_info *info = user_data;
5520   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
5521   ULONGEST *start_p, *length_p;
5522
5523   start_p = xml_find_attribute (attributes, "start")->value;
5524   length_p = xml_find_attribute (attributes, "length")->value;
5525
5526   r->start = *start_p;
5527   r->length = *length_p;
5528 }
5529
5530 /* Discard the constructed trace frame info (if an error occurs).  */
5531
5532 static void
5533 free_result (void *p)
5534 {
5535   struct traceframe_info *result = p;
5536
5537   free_traceframe_info (result);
5538 }
5539
5540 /* The allowed elements and attributes for an XML memory map.  */
5541
5542 static const struct gdb_xml_attribute memory_attributes[] = {
5543   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5544   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5545   { NULL, GDB_XML_AF_NONE, NULL, NULL }
5546 };
5547
5548 static const struct gdb_xml_element traceframe_info_children[] = {
5549   { "memory", memory_attributes, NULL,
5550     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5551     traceframe_info_start_memory, NULL },
5552   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5553 };
5554
5555 static const struct gdb_xml_element traceframe_info_elements[] = {
5556   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5557     NULL, NULL },
5558   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5559 };
5560
5561 /* Parse a traceframe-info XML document.  */
5562
5563 struct traceframe_info *
5564 parse_traceframe_info (const char *tframe_info)
5565 {
5566   struct traceframe_info *result;
5567   struct cleanup *back_to;
5568
5569   result = XCNEW (struct traceframe_info);
5570   back_to = make_cleanup (free_result, result);
5571
5572   if (gdb_xml_parse_quick (_("trace frame info"),
5573                            "traceframe-info.dtd", traceframe_info_elements,
5574                            tframe_info, result) == 0)
5575     {
5576       /* Parsed successfully, keep the result.  */
5577       discard_cleanups (back_to);
5578
5579       return result;
5580     }
5581
5582   do_cleanups (back_to);
5583   return NULL;
5584 }
5585
5586 #endif /* HAVE_LIBEXPAT */
5587
5588 /* Returns the traceframe_info object for the current traceframe.
5589    This is where we avoid re-fetching the object from the target if we
5590    already have it cached.  */
5591
5592 static struct traceframe_info *
5593 get_traceframe_info (void)
5594 {
5595   if (traceframe_info == NULL)
5596     traceframe_info = target_traceframe_info ();
5597
5598   return traceframe_info;
5599 }
5600
5601 /* If the target supports the query, return in RESULT the set of
5602    collected memory in the current traceframe, found within the LEN
5603    bytes range starting at MEMADDR.  Returns true if the target
5604    supports the query, otherwise returns false, and RESULT is left
5605    undefined.  */
5606
5607 int
5608 traceframe_available_memory (VEC(mem_range_s) **result,
5609                              CORE_ADDR memaddr, ULONGEST len)
5610 {
5611   struct traceframe_info *info = get_traceframe_info ();
5612
5613   if (info != NULL)
5614     {
5615       struct mem_range *r;
5616       int i;
5617
5618       *result = NULL;
5619
5620       for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5621         if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5622           {
5623             ULONGEST lo1, hi1, lo2, hi2;
5624             struct mem_range *nr;
5625
5626             lo1 = memaddr;
5627             hi1 = memaddr + len;
5628
5629             lo2 = r->start;
5630             hi2 = r->start + r->length;
5631
5632             nr = VEC_safe_push (mem_range_s, *result, NULL);
5633
5634             nr->start = max (lo1, lo2);
5635             nr->length = min (hi1, hi2) - nr->start;
5636           }
5637
5638       normalize_mem_ranges (*result);
5639       return 1;
5640     }
5641
5642   return 0;
5643 }
5644
5645 /* Implementation of `sdata' variable.  */
5646
5647 static const struct internalvar_funcs sdata_funcs =
5648 {
5649   sdata_make_value,
5650   NULL,
5651   NULL
5652 };
5653
5654 /* module initialization */
5655 void
5656 _initialize_tracepoint (void)
5657 {
5658   struct cmd_list_element *c;
5659
5660   /* Explicitly create without lookup, since that tries to create a
5661      value with a void typed value, and when we get here, gdbarch
5662      isn't initialized yet.  At this point, we're quite sure there
5663      isn't another convenience variable of the same name.  */
5664   create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
5665
5666   traceframe_number = -1;
5667   tracepoint_number = -1;
5668
5669   if (tracepoint_list.list == NULL)
5670     {
5671       tracepoint_list.listsize = 128;
5672       tracepoint_list.list = xmalloc
5673         (tracepoint_list.listsize * sizeof (struct memrange));
5674     }
5675   if (tracepoint_list.aexpr_list == NULL)
5676     {
5677       tracepoint_list.aexpr_listsize = 128;
5678       tracepoint_list.aexpr_list = xmalloc
5679         (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
5680     }
5681
5682   if (stepping_list.list == NULL)
5683     {
5684       stepping_list.listsize = 128;
5685       stepping_list.list = xmalloc
5686         (stepping_list.listsize * sizeof (struct memrange));
5687     }
5688
5689   if (stepping_list.aexpr_list == NULL)
5690     {
5691       stepping_list.aexpr_listsize = 128;
5692       stepping_list.aexpr_list = xmalloc
5693         (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
5694     }
5695
5696   add_info ("scope", scope_info,
5697             _("List the variables local to a scope"));
5698
5699   add_cmd ("tracepoints", class_trace, NULL,
5700            _("Tracing of program execution without stopping the program."),
5701            &cmdlist);
5702
5703   add_com ("tdump", class_trace, trace_dump_command,
5704            _("Print everything collected at the current tracepoint."));
5705
5706   add_com ("tsave", class_trace, trace_save_command, _("\
5707 Save the trace data to a file.\n\
5708 Use the '-ctf' option to save the data to CTF format.\n\
5709 Use the '-r' option to direct the target to save directly to the file,\n\
5710 using its own filesystem."));
5711
5712   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5713 Define a trace state variable.\n\
5714 Argument is a $-prefixed name, optionally followed\n\
5715 by '=' and an expression that sets the initial value\n\
5716 at the start of tracing."));
5717   set_cmd_completer (c, expression_completer);
5718
5719   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5720 Delete one or more trace state variables.\n\
5721 Arguments are the names of the variables to delete.\n\
5722 If no arguments are supplied, delete all variables."), &deletelist);
5723   /* FIXME add a trace variable completer.  */
5724
5725   add_info ("tvariables", tvariables_info, _("\
5726 Status of trace state variables and their values.\n\
5727 "));
5728
5729   add_info ("static-tracepoint-markers",
5730             info_static_tracepoint_markers_command, _("\
5731 List target static tracepoints markers.\n\
5732 "));
5733
5734   add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5735 Select a trace frame;\n\
5736 No argument means forward by one frame; '-' means backward by one frame."),
5737                   &tfindlist, "tfind ", 1, &cmdlist);
5738
5739   add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5740 Select a trace frame whose PC is outside the given range (exclusive).\n\
5741 Usage: tfind outside addr1, addr2"),
5742            &tfindlist);
5743
5744   add_cmd ("range", class_trace, trace_find_range_command, _("\
5745 Select a trace frame whose PC is in the given range (inclusive).\n\
5746 Usage: tfind range addr1,addr2"),
5747            &tfindlist);
5748
5749   add_cmd ("line", class_trace, trace_find_line_command, _("\
5750 Select a trace frame by source line.\n\
5751 Argument can be a line number (with optional source file),\n\
5752 a function name, or '*' followed by an address.\n\
5753 Default argument is 'the next source line that was traced'."),
5754            &tfindlist);
5755
5756   add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5757 Select a trace frame by tracepoint number.\n\
5758 Default is the tracepoint for the current trace frame."),
5759            &tfindlist);
5760
5761   add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5762 Select a trace frame by PC.\n\
5763 Default is the current PC, or the PC of the current trace frame."),
5764            &tfindlist);
5765
5766   add_cmd ("end", class_trace, trace_find_end_command, _("\
5767 De-select any trace frame and resume 'live' debugging."),
5768            &tfindlist);
5769
5770   add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
5771
5772   add_cmd ("start", class_trace, trace_find_start_command,
5773            _("Select the first trace frame in the trace buffer."),
5774            &tfindlist);
5775
5776   add_com ("tstatus", class_trace, trace_status_command,
5777            _("Display the status of the current trace data collection."));
5778
5779   add_com ("tstop", class_trace, trace_stop_command, _("\
5780 Stop trace data collection.\n\
5781 Usage: tstop [ <notes> ... ]\n\
5782 Any arguments supplied are recorded with the trace as a stop reason and\n\
5783 reported by tstatus (if the target supports trace notes)."));
5784
5785   add_com ("tstart", class_trace, trace_start_command, _("\
5786 Start trace data collection.\n\
5787 Usage: tstart [ <notes> ... ]\n\
5788 Any arguments supplied are recorded with the trace as a note and\n\
5789 reported by tstatus (if the target supports trace notes)."));
5790
5791   add_com ("end", class_trace, end_actions_pseudocommand, _("\
5792 Ends a list of commands or actions.\n\
5793 Several GDB commands allow you to enter a list of commands or actions.\n\
5794 Entering \"end\" on a line by itself is the normal way to terminate\n\
5795 such a list.\n\n\
5796 Note: the \"end\" command cannot be used at the gdb prompt."));
5797
5798   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5799 Specify single-stepping behavior at a tracepoint.\n\
5800 Argument is number of instructions to trace in single-step mode\n\
5801 following the tracepoint.  This command is normally followed by\n\
5802 one or more \"collect\" commands, to specify what to collect\n\
5803 while single-stepping.\n\n\
5804 Note: this command can only be used in a tracepoint \"actions\" list."));
5805
5806   add_com_alias ("ws", "while-stepping", class_alias, 0);
5807   add_com_alias ("stepping", "while-stepping", class_alias, 0);
5808
5809   add_com ("collect", class_trace, collect_pseudocommand, _("\
5810 Specify one or more data items to be collected at a tracepoint.\n\
5811 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
5812 collect all data (variables, registers) referenced by that expression.\n\
5813 Also accepts the following special arguments:\n\
5814     $regs   -- all registers.\n\
5815     $args   -- all function arguments.\n\
5816     $locals -- all variables local to the block/function scope.\n\
5817     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5818 Note: this command can only be used in a tracepoint \"actions\" list."));
5819
5820   add_com ("teval", class_trace, teval_pseudocommand, _("\
5821 Specify one or more expressions to be evaluated at a tracepoint.\n\
5822 Accepts a comma-separated list of (one or more) expressions.\n\
5823 The result of each evaluation will be discarded.\n\
5824 Note: this command can only be used in a tracepoint \"actions\" list."));
5825
5826   add_com ("actions", class_trace, trace_actions_command, _("\
5827 Specify the actions to be taken at a tracepoint.\n\
5828 Tracepoint actions may include collecting of specified data,\n\
5829 single-stepping, or enabling/disabling other tracepoints,\n\
5830 depending on target's capabilities."));
5831
5832   default_collect = xstrdup ("");
5833   add_setshow_string_cmd ("default-collect", class_trace,
5834                           &default_collect, _("\
5835 Set the list of expressions to collect by default"), _("\
5836 Show the list of expressions to collect by default"), NULL,
5837                           NULL, NULL,
5838                           &setlist, &showlist);
5839
5840   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5841                            &disconnected_tracing, _("\
5842 Set whether tracing continues after GDB disconnects."), _("\
5843 Show whether tracing continues after GDB disconnects."), _("\
5844 Use this to continue a tracing run even if GDB disconnects\n\
5845 or detaches from the target.  You can reconnect later and look at\n\
5846 trace data collected in the meantime."),
5847                            set_disconnected_tracing,
5848                            NULL,
5849                            &setlist,
5850                            &showlist);
5851
5852   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5853                            &circular_trace_buffer, _("\
5854 Set target's use of circular trace buffer."), _("\
5855 Show target's use of circular trace buffer."), _("\
5856 Use this to make the trace buffer into a circular buffer,\n\
5857 which will discard traceframes (oldest first) instead of filling\n\
5858 up and stopping the trace run."),
5859                            set_circular_trace_buffer,
5860                            NULL,
5861                            &setlist,
5862                            &showlist);
5863
5864   add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
5865                                        &trace_buffer_size, _("\
5866 Set requested size of trace buffer."), _("\
5867 Show requested size of trace buffer."), _("\
5868 Use this to choose a size for the trace buffer.  Some targets\n\
5869 may have fixed or limited buffer sizes.  Specifying \"unlimited\" or -1\n\
5870 disables any attempt to set the buffer size and lets the target choose."),
5871                                        set_trace_buffer_size, NULL,
5872                                        &setlist, &showlist);
5873
5874   add_setshow_string_cmd ("trace-user", class_trace,
5875                           &trace_user, _("\
5876 Set the user name to use for current and future trace runs"), _("\
5877 Show the user name to use for current and future trace runs"), NULL,
5878                           set_trace_user, NULL,
5879                           &setlist, &showlist);
5880
5881   add_setshow_string_cmd ("trace-notes", class_trace,
5882                           &trace_notes, _("\
5883 Set notes string to use for current and future trace runs"), _("\
5884 Show the notes string to use for current and future trace runs"), NULL,
5885                           set_trace_notes, NULL,
5886                           &setlist, &showlist);
5887
5888   add_setshow_string_cmd ("trace-stop-notes", class_trace,
5889                           &trace_stop_notes, _("\
5890 Set notes string to use for future tstop commands"), _("\
5891 Show the notes string to use for future tstop commands"), NULL,
5892                           set_trace_stop_notes, NULL,
5893                           &setlist, &showlist);
5894
5895   init_tfile_ops ();
5896
5897   add_target_with_completer (&tfile_ops, filename_completer);
5898 }