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