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