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