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