* remote.c (unpack_varlen_hex): Remove forward declaration.
[external/binutils.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3    Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
4    2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
6    This file is part of GDB.
7
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 3 of the License, or
11    (at your option) any later version.
12
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17
18    You should have received a copy of the GNU General Public License
19    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
20
21 #include "defs.h"
22 #include "arch-utils.h"
23 #include "symtab.h"
24 #include "frame.h"
25 #include "gdbtypes.h"
26 #include "expression.h"
27 #include "gdbcmd.h"
28 #include "value.h"
29 #include "target.h"
30 #include "language.h"
31 #include "gdb_string.h"
32 #include "inferior.h"
33 #include "breakpoint.h"
34 #include "tracepoint.h"
35 #include "linespec.h"
36 #include "regcache.h"
37 #include "completer.h"
38 #include "block.h"
39 #include "dictionary.h"
40 #include "observer.h"
41 #include "user-regs.h"
42 #include "valprint.h"
43 #include "gdbcore.h"
44 #include "objfiles.h"
45 #include "filenames.h"
46 #include "gdbthread.h"
47 #include "stack.h"
48 #include "gdbcore.h"
49 #include "remote.h"
50
51 #include "ax.h"
52 #include "ax-gdb.h"
53
54 /* readline include files */
55 #include "readline/readline.h"
56 #include "readline/history.h"
57
58 /* readline defines this.  */
59 #undef savestring
60
61 #ifdef HAVE_UNISTD_H
62 #include <unistd.h>
63 #endif
64
65 #ifndef O_LARGEFILE
66 #define O_LARGEFILE 0
67 #endif
68
69 extern int hex2bin (const char *hex, gdb_byte *bin, int count);
70 extern int bin2hex (const gdb_byte *bin, char *hex, int count);
71
72 extern void stop_tracing ();
73
74 /* Maximum length of an agent aexpression.
75    This accounts for the fact that packets are limited to 400 bytes
76    (which includes everything -- including the checksum), and assumes
77    the worst case of maximum length for each of the pieces of a
78    continuation packet.
79
80    NOTE: expressions get mem2hex'ed otherwise this would be twice as
81    large.  (400 - 31)/2 == 184 */
82 #define MAX_AGENT_EXPR_LEN      184
83
84 /* A hook used to notify the UI of tracepoint operations.  */
85
86 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
87 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
88
89 extern void (*deprecated_readline_begin_hook) (char *, ...);
90 extern char *(*deprecated_readline_hook) (char *);
91 extern void (*deprecated_readline_end_hook) (void);
92
93 /* GDB commands implemented in other modules:
94  */  
95
96 extern void output_command (char *, int);
97
98 /* 
99    Tracepoint.c:
100
101    This module defines the following debugger commands:
102    trace            : set a tracepoint on a function, line, or address.
103    info trace       : list all debugger-defined tracepoints.
104    delete trace     : delete one or more tracepoints.
105    enable trace     : enable one or more tracepoints.
106    disable trace    : disable one or more tracepoints.
107    actions          : specify actions to be taken at a tracepoint.
108    passcount        : specify a pass count for a tracepoint.
109    tstart           : start a trace experiment.
110    tstop            : stop a trace experiment.
111    tstatus          : query the status of a trace experiment.
112    tfind            : find a trace frame in the trace buffer.
113    tdump            : print everything collected at the current tracepoint.
114    save-tracepoints : write tracepoint setup into a file.
115
116    This module defines the following user-visible debugger variables:
117    $trace_frame : sequence number of trace frame currently being debugged.
118    $trace_line  : source line of trace frame currently being debugged.
119    $trace_file  : source file of trace frame currently being debugged.
120    $tracepoint  : tracepoint number of trace frame currently being debugged.
121  */
122
123
124 /* ======= Important global variables: ======= */
125
126 /* The list of all trace state variables.  We don't retain pointers to
127    any of these for any reason - API is by name or number only - so it
128    works to have a vector of objects.  */
129
130 typedef struct trace_state_variable tsv_s;
131 DEF_VEC_O(tsv_s);
132
133 static VEC(tsv_s) *tvariables;
134
135 /* The next integer to assign to a variable.  */
136
137 static int next_tsv_number = 1;
138
139 /* Number of last traceframe collected.  */
140 static int traceframe_number;
141
142 /* Tracepoint for last traceframe collected.  */
143 static int tracepoint_number;
144
145 /* Symbol for function for last traceframe collected */
146 static struct symbol *traceframe_fun;
147
148 /* Symtab and line for last traceframe collected */
149 static struct symtab_and_line traceframe_sal;
150
151 /* Tracing command lists */
152 static struct cmd_list_element *tfindlist;
153
154 /* List of expressions to collect by default at each tracepoint hit.  */
155 char *default_collect = "";
156
157 static int disconnected_tracing;
158
159 /* This variable controls whether we ask the target for a linear or
160    circular trace buffer.  */
161
162 static int circular_trace_buffer;
163
164 /* ======= Important command functions: ======= */
165 static void trace_actions_command (char *, int);
166 static void trace_start_command (char *, int);
167 static void trace_stop_command (char *, int);
168 static void trace_status_command (char *, int);
169 static void trace_find_command (char *, int);
170 static void trace_find_pc_command (char *, int);
171 static void trace_find_tracepoint_command (char *, int);
172 static void trace_find_line_command (char *, int);
173 static void trace_find_range_command (char *, int);
174 static void trace_find_outside_command (char *, int);
175 static void trace_dump_command (char *, int);
176
177 /* support routines */
178
179 struct collection_list;
180 static void add_aexpr (struct collection_list *, struct agent_expr *);
181 static char *mem2hex (gdb_byte *, char *, int);
182 static void add_register (struct collection_list *collection,
183                           unsigned int regno);
184
185 extern void send_disconnected_tracing_value (int value);
186
187 static void free_uploaded_tps (struct uploaded_tp **utpp);
188 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
189
190
191 extern void _initialize_tracepoint (void);
192
193 static struct trace_status trace_status;
194
195 char *stop_reason_names[] = {
196   "tunknown",
197   "tnotrun",
198   "tstop",
199   "tfull",
200   "tdisconnected",
201   "tpasscount",
202   "terror"
203 };
204
205 struct trace_status *
206 current_trace_status ()
207 {
208   return &trace_status;
209 }
210
211 /* Set traceframe number to NUM.  */
212 static void
213 set_traceframe_num (int num)
214 {
215   traceframe_number = num;
216   set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
217 }
218
219 /* Set tracepoint number to NUM.  */
220 static void
221 set_tracepoint_num (int num)
222 {
223   tracepoint_number = num;
224   set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
225 }
226
227 /* Set externally visible debug variables for querying/printing
228    the traceframe context (line, function, file) */
229
230 static void
231 set_traceframe_context (struct frame_info *trace_frame)
232 {
233   CORE_ADDR trace_pc;
234
235   if (trace_frame == NULL)              /* Cease debugging any trace buffers.  */
236     {
237       traceframe_fun = 0;
238       traceframe_sal.pc = traceframe_sal.line = 0;
239       traceframe_sal.symtab = NULL;
240       clear_internalvar (lookup_internalvar ("trace_func"));
241       clear_internalvar (lookup_internalvar ("trace_file"));
242       set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
243       return;
244     }
245
246   /* Save as globals for internal use.  */
247   trace_pc = get_frame_pc (trace_frame);
248   traceframe_sal = find_pc_line (trace_pc, 0);
249   traceframe_fun = find_pc_function (trace_pc);
250
251   /* Save linenumber as "$trace_line", a debugger variable visible to
252      users.  */
253   set_internalvar_integer (lookup_internalvar ("trace_line"),
254                            traceframe_sal.line);
255
256   /* Save func name as "$trace_func", a debugger variable visible to
257      users.  */
258   if (traceframe_fun == NULL
259       || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
260     clear_internalvar (lookup_internalvar ("trace_func"));
261   else
262     set_internalvar_string (lookup_internalvar ("trace_func"),
263                             SYMBOL_LINKAGE_NAME (traceframe_fun));
264
265   /* Save file name as "$trace_file", a debugger variable visible to
266      users.  */
267   if (traceframe_sal.symtab == NULL
268       || traceframe_sal.symtab->filename == NULL)
269     clear_internalvar (lookup_internalvar ("trace_file"));
270   else
271     set_internalvar_string (lookup_internalvar ("trace_file"),
272                             traceframe_sal.symtab->filename);
273 }
274
275 /* Create a new trace state variable with the given name.  */
276
277 struct trace_state_variable *
278 create_trace_state_variable (const char *name)
279 {
280   struct trace_state_variable tsv;
281
282   memset (&tsv, 0, sizeof (tsv));
283   tsv.name = xstrdup (name);
284   tsv.number = next_tsv_number++;
285   return VEC_safe_push (tsv_s, tvariables, &tsv);
286 }
287
288 /* Look for a trace state variable of the given name.  */
289
290 struct trace_state_variable *
291 find_trace_state_variable (const char *name)
292 {
293   struct trace_state_variable *tsv;
294   int ix;
295
296   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
297     if (strcmp (name, tsv->name) == 0)
298       return tsv;
299
300   return NULL;
301 }
302
303 void
304 delete_trace_state_variable (const char *name)
305 {
306   struct trace_state_variable *tsv;
307   int ix;
308
309   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
310     if (strcmp (name, tsv->name) == 0)
311       {
312         xfree ((void *)tsv->name);
313         VEC_unordered_remove (tsv_s, tvariables, ix);
314         return;
315       }
316
317   warning (_("No trace variable named \"$%s\", not deleting"), name);
318 }
319
320 /* The 'tvariable' command collects a name and optional expression to
321    evaluate into an initial value.  */
322
323 void
324 trace_variable_command (char *args, int from_tty)
325 {
326   struct expression *expr;
327   struct cleanup *old_chain;
328   struct internalvar *intvar = NULL;
329   LONGEST initval = 0;
330   struct trace_state_variable *tsv;
331
332   if (!args || !*args)
333     error_no_arg (_("trace state variable name"));
334
335   /* All the possible valid arguments are expressions.  */
336   expr = parse_expression (args);
337   old_chain = make_cleanup (free_current_contents, &expr);
338
339   if (expr->nelts == 0)
340     error (_("No expression?"));
341
342   /* Only allow two syntaxes; "$name" and "$name=value".  */
343   if (expr->elts[0].opcode == OP_INTERNALVAR)
344     {
345       intvar = expr->elts[1].internalvar;
346     }
347   else if (expr->elts[0].opcode == BINOP_ASSIGN
348            && expr->elts[1].opcode == OP_INTERNALVAR)
349     {
350       intvar = expr->elts[2].internalvar;
351       initval = value_as_long (evaluate_subexpression_type (expr, 4));
352     }
353   else
354     error (_("Syntax must be $NAME [ = EXPR ]"));
355
356   if (!intvar)
357     error (_("No name given"));
358
359   if (strlen (internalvar_name (intvar)) <= 0)
360     error (_("Must supply a non-empty variable name"));
361
362   /* If the variable already exists, just change its initial value.  */
363   tsv = find_trace_state_variable (internalvar_name (intvar));
364   if (tsv)
365     {
366       tsv->initial_value = initval;
367       printf_filtered (_("Trace state variable $%s now has initial value %s.\n"),
368                        tsv->name, plongest (tsv->initial_value));
369       do_cleanups (old_chain);
370       return;
371     }
372
373   /* Create a new variable.  */
374   tsv = create_trace_state_variable (internalvar_name (intvar));
375   tsv->initial_value = initval;
376
377   printf_filtered (_("Trace state variable $%s created, with initial value %s.\n"),
378                    tsv->name, plongest (tsv->initial_value));
379
380   do_cleanups (old_chain);
381 }
382
383 void
384 delete_trace_variable_command (char *args, int from_tty)
385 {
386   int ix;
387   char **argv;
388   struct cleanup *back_to;
389
390   if (args == NULL)
391     {
392       if (query (_("Delete all trace state variables? ")))
393         VEC_free (tsv_s, tvariables);
394       dont_repeat ();
395       return;
396     }
397
398   argv = gdb_buildargv (args);
399   back_to = make_cleanup_freeargv (argv);
400
401   for (ix = 0; argv[ix] != NULL; ix++)
402     {
403       if (*argv[ix] == '$')
404         delete_trace_state_variable (argv[ix] + 1);
405       else
406         warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
407     }
408
409   do_cleanups (back_to);
410
411   dont_repeat ();
412 }
413
414 void
415 tvariables_info_1 (void)
416 {
417   struct trace_state_variable *tsv;
418   int ix;
419   int count = 0;
420   struct cleanup *back_to;
421
422   if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
423     {
424       printf_filtered (_("No trace state variables.\n"));
425       return;
426     }
427
428   /* Try to acquire values from the target.  */
429   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
430     tsv->value_known = target_get_trace_state_variable_value (tsv->number,
431                                                               &(tsv->value));
432
433   back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
434                                                  count, "trace-variables");
435   ui_out_table_header (uiout, 15, ui_left, "name", "Name");
436   ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
437   ui_out_table_header (uiout, 11, ui_left, "current", "Current");
438
439   ui_out_table_body (uiout);
440
441   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
442     {
443       struct cleanup *back_to2;
444       char *c;
445       char *name;
446
447       back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
448
449       name = concat ("$", tsv->name, (char *) NULL);
450       make_cleanup (xfree, name);
451       ui_out_field_string (uiout, "name", name);
452       ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
453
454       if (tsv->value_known)
455         c = plongest (tsv->value);
456       else if (ui_out_is_mi_like_p (uiout))
457         /* For MI, we prefer not to use magic string constants, but rather
458            omit the field completely.  The difference between unknown and
459            undefined does not seem important enough to represent.  */
460         c = NULL;
461       else if (current_trace_status ()->running || traceframe_number >= 0)
462         /* The value is/was defined, but we don't have it.  */
463         c = "<unknown>";
464       else
465         /* It is not meaningful to ask about the value.  */
466         c = "<undefined>";
467       if (c)
468         ui_out_field_string (uiout, "current", c);
469       ui_out_text (uiout, "\n");
470
471       do_cleanups (back_to2);
472     }
473
474   do_cleanups (back_to);
475 }
476
477 /* List all the trace state variables.  */
478
479 static void
480 tvariables_info (char *args, int from_tty)
481 {
482   tvariables_info_1 ();
483 }
484
485 /* Stash definitions of tsvs into the given file.  */
486
487 void
488 save_trace_state_variables (struct ui_file *fp)
489 {
490   struct trace_state_variable *tsv;
491   int ix;
492
493   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
494     {
495       fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
496       if (tsv->initial_value)
497         fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
498       fprintf_unfiltered (fp, "\n");
499     }
500 }
501
502 /* ACTIONS functions: */
503
504 /* The three functions:
505    collect_pseudocommand, 
506    while_stepping_pseudocommand, and 
507    end_actions_pseudocommand
508    are placeholders for "commands" that are actually ONLY to be used
509    within a tracepoint action list.  If the actual function is ever called,
510    it means that somebody issued the "command" at the top level,
511    which is always an error.  */
512
513 void
514 end_actions_pseudocommand (char *args, int from_tty)
515 {
516   error (_("This command cannot be used at the top level."));
517 }
518
519 void
520 while_stepping_pseudocommand (char *args, int from_tty)
521 {
522   error (_("This command can only be used in a tracepoint actions list."));
523 }
524
525 static void
526 collect_pseudocommand (char *args, int from_tty)
527 {
528   error (_("This command can only be used in a tracepoint actions list."));
529 }
530
531 static void
532 teval_pseudocommand (char *args, int from_tty)
533 {
534   error (_("This command can only be used in a tracepoint actions list."));
535 }
536
537 /* Enter a list of actions for a tracepoint.  */
538 static void
539 trace_actions_command (char *args, int from_tty)
540 {
541   struct breakpoint *t;
542   struct command_line *l;
543
544   t = get_tracepoint_by_number (&args, 0, 1);
545   if (t)
546     {
547       char *tmpbuf =
548         xstrprintf ("Enter actions for tracepoint %d, one per line.",
549                     t->number);
550       struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
551
552       l = read_command_lines (tmpbuf, from_tty, 1, check_tracepoint_command, t);
553       do_cleanups (cleanups);
554       breakpoint_set_commands (t, l);
555     }
556   /* else just return */
557 }
558
559 /* Report the results of checking the agent expression, as errors or
560    internal errors.  */
561
562 static void
563 report_agent_reqs_errors (struct agent_expr *aexpr)
564 {
565   /* All of the "flaws" are serious bytecode generation issues that
566      should never occur.  */
567   if (aexpr->flaw != agent_flaw_none)
568     internal_error (__FILE__, __LINE__, _("expression is malformed"));
569
570   /* If analysis shows a stack underflow, GDB must have done something
571      badly wrong in its bytecode generation.  */
572   if (aexpr->min_height < 0)
573     internal_error (__FILE__, __LINE__,
574                     _("expression has min height < 0"));
575
576   /* Issue this error if the stack is predicted to get too deep.  The
577      limit is rather arbitrary; a better scheme might be for the
578      target to report how much stack it will have available.  The
579      depth roughly corresponds to parenthesization, so a limit of 20
580      amounts to 20 levels of expression nesting, which is actually
581      a pretty big hairy expression.  */
582   if (aexpr->max_height > 20)
583     error (_("Expression is too complicated."));
584 }
585
586 /* worker function */
587 void
588 validate_actionline (char **line, struct breakpoint *t)
589 {
590   struct cmd_list_element *c;
591   struct expression *exp = NULL;
592   struct cleanup *old_chain = NULL;
593   char *p, *tmp_p;
594   struct bp_location *loc;
595   struct agent_expr *aexpr;
596
597   /* if EOF is typed, *line is NULL */
598   if (*line == NULL)
599     return;
600
601   for (p = *line; isspace ((int) *p);)
602     p++;
603
604   /* Symbol lookup etc.  */
605   if (*p == '\0')       /* empty line: just prompt for another line.  */
606     return;
607
608   if (*p == '#')                /* comment line */
609     return;
610
611   c = lookup_cmd (&p, cmdlist, "", -1, 1);
612   if (c == 0)
613     error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
614
615   if (cmd_cfunc_eq (c, collect_pseudocommand))
616     {
617       do
618         {                       /* repeat over a comma-separated list */
619           QUIT;                 /* allow user to bail out with ^C */
620           while (isspace ((int) *p))
621             p++;
622
623           if (*p == '$')        /* look for special pseudo-symbols */
624             {
625               if ((0 == strncasecmp ("reg", p + 1, 3)) ||
626                   (0 == strncasecmp ("arg", p + 1, 3)) ||
627                   (0 == strncasecmp ("loc", p + 1, 3)))
628                 {
629                   p = strchr (p, ',');
630                   continue;
631                 }
632               /* else fall thru, treat p as an expression and parse it!  */
633             }
634           tmp_p = p;
635           for (loc = t->loc; loc; loc = loc->next)
636             {
637               p = tmp_p;
638               exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
639               old_chain = make_cleanup (free_current_contents, &exp);
640
641               if (exp->elts[0].opcode == OP_VAR_VALUE)
642                 {
643                   if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
644                     {
645                       error (_("constant `%s' (value %ld) will not be collected."),
646                              SYMBOL_PRINT_NAME (exp->elts[2].symbol),
647                              SYMBOL_VALUE (exp->elts[2].symbol));
648                     }
649                   else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
650                     {
651                       error (_("`%s' is optimized away and cannot be collected."),
652                              SYMBOL_PRINT_NAME (exp->elts[2].symbol));
653                     }
654                 }
655
656               /* We have something to collect, make sure that the expr to
657                  bytecode translator can handle it and that it's not too
658                  long.  */
659               aexpr = gen_trace_for_expr (loc->address, exp);
660               make_cleanup_free_agent_expr (aexpr);
661
662               if (aexpr->len > MAX_AGENT_EXPR_LEN)
663                 error (_("Expression is too complicated."));
664
665               ax_reqs (aexpr);
666
667               report_agent_reqs_errors (aexpr);
668
669               do_cleanups (old_chain);
670             }
671         }
672       while (p && *p++ == ',');
673     }
674
675   else if (cmd_cfunc_eq (c, teval_pseudocommand))
676     {
677       do
678         {                       /* repeat over a comma-separated list */
679           QUIT;                 /* allow user to bail out with ^C */
680           while (isspace ((int) *p))
681             p++;
682
683           tmp_p = p;
684           for (loc = t->loc; loc; loc = loc->next)
685             {
686               p = tmp_p;
687               /* Only expressions are allowed for this action.  */
688               exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
689               old_chain = make_cleanup (free_current_contents, &exp);
690
691               /* We have something to evaluate, make sure that the expr to
692                  bytecode translator can handle it and that it's not too
693                  long.  */
694               aexpr = gen_eval_for_expr (loc->address, exp);
695               make_cleanup_free_agent_expr (aexpr);
696
697               if (aexpr->len > MAX_AGENT_EXPR_LEN)
698                 error (_("Expression is too complicated."));
699
700               ax_reqs (aexpr);
701               report_agent_reqs_errors (aexpr);
702
703               do_cleanups (old_chain);
704             }
705         }
706       while (p && *p++ == ',');
707     }
708
709   else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
710     {
711       char *steparg;            /* in case warning is necessary */
712
713       while (isspace ((int) *p))
714         p++;
715       steparg = p;
716
717       if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
718         error (_("while-stepping step count `%s' is malformed."), *line);
719     }
720
721   else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
722     ;
723
724   else
725     error (_("`%s' is not a supported tracepoint action."), *line);
726 }
727
728 enum {
729   memrange_absolute = -1
730 };
731
732 struct memrange
733 {
734   int type;             /* memrange_absolute for absolute memory range,
735                            else basereg number */
736   bfd_signed_vma start;
737   bfd_signed_vma end;
738 };
739
740 struct collection_list
741   {
742     unsigned char regs_mask[32];        /* room for up to 256 regs */
743     long listsize;
744     long next_memrange;
745     struct memrange *list;
746     long aexpr_listsize;        /* size of array pointed to by expr_list elt */
747     long next_aexpr_elt;
748     struct agent_expr **aexpr_list;
749
750   }
751 tracepoint_list, stepping_list;
752
753 /* MEMRANGE functions: */
754
755 static int memrange_cmp (const void *, const void *);
756
757 /* compare memranges for qsort */
758 static int
759 memrange_cmp (const void *va, const void *vb)
760 {
761   const struct memrange *a = va, *b = vb;
762
763   if (a->type < b->type)
764     return -1;
765   if (a->type > b->type)
766     return 1;
767   if (a->type == memrange_absolute)
768     {
769       if ((bfd_vma) a->start < (bfd_vma) b->start)
770         return -1;
771       if ((bfd_vma) a->start > (bfd_vma) b->start)
772         return 1;
773     }
774   else
775     {
776       if (a->start < b->start)
777         return -1;
778       if (a->start > b->start)
779         return 1;
780     }
781   return 0;
782 }
783
784 /* Sort the memrange list using qsort, and merge adjacent memranges.  */
785 static void
786 memrange_sortmerge (struct collection_list *memranges)
787 {
788   int a, b;
789
790   qsort (memranges->list, memranges->next_memrange,
791          sizeof (struct memrange), memrange_cmp);
792   if (memranges->next_memrange > 0)
793     {
794       for (a = 0, b = 1; b < memranges->next_memrange; b++)
795         {
796           if (memranges->list[a].type == memranges->list[b].type &&
797               memranges->list[b].start - memranges->list[a].end <=
798               MAX_REGISTER_SIZE)
799             {
800               /* memrange b starts before memrange a ends; merge them.  */
801               if (memranges->list[b].end > memranges->list[a].end)
802                 memranges->list[a].end = memranges->list[b].end;
803               continue;         /* next b, same a */
804             }
805           a++;                  /* next a */
806           if (a != b)
807             memcpy (&memranges->list[a], &memranges->list[b],
808                     sizeof (struct memrange));
809         }
810       memranges->next_memrange = a + 1;
811     }
812 }
813
814 /* Add a register to a collection list.  */
815 static void
816 add_register (struct collection_list *collection, unsigned int regno)
817 {
818   if (info_verbose)
819     printf_filtered ("collect register %d\n", regno);
820   if (regno >= (8 * sizeof (collection->regs_mask)))
821     error (_("Internal: register number %d too large for tracepoint"),
822            regno);
823   collection->regs_mask[regno / 8] |= 1 << (regno % 8);
824 }
825
826 /* Add a memrange to a collection list */
827 static void
828 add_memrange (struct collection_list *memranges, 
829               int type, bfd_signed_vma base,
830               unsigned long len)
831 {
832   if (info_verbose)
833     {
834       printf_filtered ("(%d,", type);
835       printf_vma (base);
836       printf_filtered (",%ld)\n", len);
837     }
838
839   /* type: memrange_absolute == memory, other n == basereg */
840   memranges->list[memranges->next_memrange].type = type;
841   /* base: addr if memory, offset if reg relative.  */
842   memranges->list[memranges->next_memrange].start = base;
843   /* len: we actually save end (base + len) for convenience */
844   memranges->list[memranges->next_memrange].end = base + len;
845   memranges->next_memrange++;
846   if (memranges->next_memrange >= memranges->listsize)
847     {
848       memranges->listsize *= 2;
849       memranges->list = xrealloc (memranges->list,
850                                   memranges->listsize);
851     }
852
853   if (type != memrange_absolute)                /* Better collect the base register!  */
854     add_register (memranges, type);
855 }
856
857 /* Add a symbol to a collection list.  */
858 static void
859 collect_symbol (struct collection_list *collect, 
860                 struct symbol *sym,
861                 struct gdbarch *gdbarch,
862                 long frame_regno, long frame_offset,
863                 CORE_ADDR scope)
864 {
865   unsigned long len;
866   unsigned int reg;
867   bfd_signed_vma offset;
868   int treat_as_expr = 0;
869
870   len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
871   switch (SYMBOL_CLASS (sym))
872     {
873     default:
874       printf_filtered ("%s: don't know symbol class %d\n",
875                        SYMBOL_PRINT_NAME (sym),
876                        SYMBOL_CLASS (sym));
877       break;
878     case LOC_CONST:
879       printf_filtered ("constant %s (value %ld) will not be collected.\n",
880                        SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
881       break;
882     case LOC_STATIC:
883       offset = SYMBOL_VALUE_ADDRESS (sym);
884       if (info_verbose)
885         {
886           char tmp[40];
887
888           sprintf_vma (tmp, offset);
889           printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
890                            SYMBOL_PRINT_NAME (sym), len,
891                            tmp /* address */);
892         }
893       /* A struct may be a C++ class with static fields, go to general
894          expression handling.  */
895       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
896         treat_as_expr = 1;
897       else
898         add_memrange (collect, memrange_absolute, offset, len);
899       break;
900     case LOC_REGISTER:
901       reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
902       if (info_verbose)
903         printf_filtered ("LOC_REG[parm] %s: ", 
904                          SYMBOL_PRINT_NAME (sym));
905       add_register (collect, reg);
906       /* Check for doubles stored in two registers.  */
907       /* FIXME: how about larger types stored in 3 or more regs?  */
908       if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
909           len > register_size (gdbarch, reg))
910         add_register (collect, reg + 1);
911       break;
912     case LOC_REF_ARG:
913       printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
914       printf_filtered ("       (will not collect %s)\n",
915                        SYMBOL_PRINT_NAME (sym));
916       break;
917     case LOC_ARG:
918       reg = frame_regno;
919       offset = frame_offset + SYMBOL_VALUE (sym);
920       if (info_verbose)
921         {
922           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
923                            SYMBOL_PRINT_NAME (sym), len);
924           printf_vma (offset);
925           printf_filtered (" from frame ptr reg %d\n", reg);
926         }
927       add_memrange (collect, reg, offset, len);
928       break;
929     case LOC_REGPARM_ADDR:
930       reg = SYMBOL_VALUE (sym);
931       offset = 0;
932       if (info_verbose)
933         {
934           printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
935                            SYMBOL_PRINT_NAME (sym), len);
936           printf_vma (offset);
937           printf_filtered (" from reg %d\n", reg);
938         }
939       add_memrange (collect, reg, offset, len);
940       break;
941     case LOC_LOCAL:
942       reg = frame_regno;
943       offset = frame_offset + SYMBOL_VALUE (sym);
944       if (info_verbose)
945         {
946           printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
947                            SYMBOL_PRINT_NAME (sym), len);
948           printf_vma (offset);
949           printf_filtered (" from frame ptr reg %d\n", reg);
950         }
951       add_memrange (collect, reg, offset, len);
952       break;
953
954     case LOC_UNRESOLVED:
955       treat_as_expr = 1;
956       break;
957
958     case LOC_OPTIMIZED_OUT:
959       printf_filtered ("%s has been optimized out of existence.\n",
960                        SYMBOL_PRINT_NAME (sym));
961       break;
962
963     case LOC_COMPUTED:
964       treat_as_expr = 1;
965       break;
966     }
967
968   /* Expressions are the most general case.  */
969   if (treat_as_expr)
970     {
971       struct agent_expr *aexpr;
972       struct cleanup *old_chain1 = NULL;
973
974       aexpr = gen_trace_for_var (scope, gdbarch, sym);
975
976       /* It can happen that the symbol is recorded as a computed
977          location, but it's been optimized away and doesn't actually
978          have a location expression.  */
979       if (!aexpr)
980         {
981           printf_filtered ("%s has been optimized out of existence.\n",
982                            SYMBOL_PRINT_NAME (sym));
983           return;
984         }
985
986       old_chain1 = make_cleanup_free_agent_expr (aexpr);
987
988       ax_reqs (aexpr);
989
990       report_agent_reqs_errors (aexpr);
991
992       discard_cleanups (old_chain1);
993       add_aexpr (collect, aexpr);
994
995       /* take care of the registers */
996       if (aexpr->reg_mask_len > 0)
997         {
998           int ndx1, ndx2;
999
1000           for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1001             {
1002               QUIT;     /* allow user to bail out with ^C */
1003               if (aexpr->reg_mask[ndx1] != 0)
1004                 {
1005                   /* assume chars have 8 bits */
1006                   for (ndx2 = 0; ndx2 < 8; ndx2++)
1007                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1008                       /* it's used -- record it */
1009                       add_register (collect, ndx1 * 8 + ndx2);
1010                 }
1011             }
1012         }
1013     }
1014 }
1015
1016 /* Data to be passed around in the calls to the locals and args
1017    iterators.  */
1018
1019 struct add_local_symbols_data
1020 {
1021   struct collection_list *collect;
1022   struct gdbarch *gdbarch;
1023   CORE_ADDR pc;
1024   long frame_regno;
1025   long frame_offset;
1026   int count;
1027 };
1028
1029 /* The callback for the locals and args iterators  */
1030
1031 static void
1032 do_collect_symbol (const char *print_name,
1033                    struct symbol *sym,
1034                    void *cb_data)
1035 {
1036   struct add_local_symbols_data *p = cb_data;
1037
1038   collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1039                   p->frame_offset, p->pc);
1040   p->count++;
1041 }
1042
1043 /* Add all locals (or args) symbols to collection list */
1044 static void
1045 add_local_symbols (struct collection_list *collect,
1046                    struct gdbarch *gdbarch, CORE_ADDR pc,
1047                    long frame_regno, long frame_offset, int type)
1048 {
1049   struct block *block;
1050   struct add_local_symbols_data cb_data;
1051
1052   cb_data.collect = collect;
1053   cb_data.gdbarch = gdbarch;
1054   cb_data.pc = pc;
1055   cb_data.frame_regno = frame_regno;
1056   cb_data.frame_offset = frame_offset;
1057   cb_data.count = 0;
1058
1059   if (type == 'L')
1060     {
1061       block = block_for_pc (pc);
1062       if (block == NULL)
1063         {
1064           warning (_("Can't collect locals; "
1065                      "no symbol table info available.\n"));
1066           return;
1067         }
1068
1069       iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1070       if (cb_data.count == 0)
1071         warning (_("No locals found in scope."));
1072     }
1073   else
1074     {
1075       pc = get_pc_function_start (pc);
1076       block = block_for_pc (pc);
1077       if (block == NULL)
1078         {
1079           warning (_("Can't collect args; no symbol table info available.\n"));
1080           return;
1081         }
1082
1083       iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1084       if (cb_data.count == 0)
1085         warning (_("No args found in scope."));
1086     }
1087 }
1088
1089 /* worker function */
1090 static void
1091 clear_collection_list (struct collection_list *list)
1092 {
1093   int ndx;
1094
1095   list->next_memrange = 0;
1096   for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1097     {
1098       free_agent_expr (list->aexpr_list[ndx]);
1099       list->aexpr_list[ndx] = NULL;
1100     }
1101   list->next_aexpr_elt = 0;
1102   memset (list->regs_mask, 0, sizeof (list->regs_mask));
1103 }
1104
1105 /* reduce a collection list to string form (for gdb protocol) */
1106 static char **
1107 stringify_collection_list (struct collection_list *list, char *string)
1108 {
1109   char temp_buf[2048];
1110   char tmp2[40];
1111   int count;
1112   int ndx = 0;
1113   char *(*str_list)[];
1114   char *end;
1115   long i;
1116
1117   count = 1 + list->next_memrange + list->next_aexpr_elt + 1;
1118   str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1119
1120   for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1121     if (list->regs_mask[i] != 0)        /* skip leading zeroes in regs_mask */
1122       break;
1123   if (list->regs_mask[i] != 0)  /* prepare to send regs_mask to the stub */
1124     {
1125       if (info_verbose)
1126         printf_filtered ("\nCollecting registers (mask): 0x");
1127       end = temp_buf;
1128       *end++ = 'R';
1129       for (; i >= 0; i--)
1130         {
1131           QUIT;                 /* allow user to bail out with ^C */
1132           if (info_verbose)
1133             printf_filtered ("%02X", list->regs_mask[i]);
1134           sprintf (end, "%02X", list->regs_mask[i]);
1135           end += 2;
1136         }
1137       (*str_list)[ndx] = xstrdup (temp_buf);
1138       ndx++;
1139     }
1140   if (info_verbose)
1141     printf_filtered ("\n");
1142   if (list->next_memrange > 0 && info_verbose)
1143     printf_filtered ("Collecting memranges: \n");
1144   for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1145     {
1146       QUIT;                     /* allow user to bail out with ^C */
1147       sprintf_vma (tmp2, list->list[i].start);
1148       if (info_verbose)
1149         {
1150           printf_filtered ("(%d, %s, %ld)\n", 
1151                            list->list[i].type, 
1152                            tmp2, 
1153                            (long) (list->list[i].end - list->list[i].start));
1154         }
1155       if (count + 27 > MAX_AGENT_EXPR_LEN)
1156         {
1157           (*str_list)[ndx] = savestring (temp_buf, count);
1158           ndx++;
1159           count = 0;
1160           end = temp_buf;
1161         }
1162
1163       {
1164         bfd_signed_vma length = list->list[i].end - list->list[i].start;
1165
1166         /* The "%X" conversion specifier expects an unsigned argument,
1167            so passing -1 (memrange_absolute) to it directly gives you
1168            "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1169            Special-case it.  */
1170         if (list->list[i].type == memrange_absolute)
1171           sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1172         else
1173           sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1174       }
1175
1176       count += strlen (end);
1177       end = temp_buf + count;
1178     }
1179
1180   for (i = 0; i < list->next_aexpr_elt; i++)
1181     {
1182       QUIT;                     /* allow user to bail out with ^C */
1183       if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1184         {
1185           (*str_list)[ndx] = savestring (temp_buf, count);
1186           ndx++;
1187           count = 0;
1188           end = temp_buf;
1189         }
1190       sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1191       end += 10;                /* 'X' + 8 hex digits + ',' */
1192       count += 10;
1193
1194       end = mem2hex (list->aexpr_list[i]->buf, 
1195                      end, list->aexpr_list[i]->len);
1196       count += 2 * list->aexpr_list[i]->len;
1197     }
1198
1199   if (count != 0)
1200     {
1201       (*str_list)[ndx] = savestring (temp_buf, count);
1202       ndx++;
1203       count = 0;
1204       end = temp_buf;
1205     }
1206   (*str_list)[ndx] = NULL;
1207
1208   if (ndx == 0)
1209     {
1210       xfree (str_list);
1211       return NULL;
1212     }
1213   else
1214     return *str_list;
1215 }
1216
1217
1218 static void
1219 encode_actions_1 (struct command_line *action,
1220                   struct breakpoint *t,
1221                   struct bp_location *tloc,
1222                   int frame_reg,
1223                   LONGEST frame_offset,
1224                   struct collection_list *collect,
1225                   struct collection_list *stepping_list)
1226 {
1227   char *action_exp;
1228   struct expression *exp = NULL;
1229   int i;
1230   struct value *tempval;
1231   struct cmd_list_element *cmd;
1232   struct agent_expr *aexpr;
1233
1234   for (; action; action = action->next)
1235     {
1236       QUIT;                     /* allow user to bail out with ^C */
1237       action_exp = action->line;
1238       while (isspace ((int) *action_exp))
1239         action_exp++;
1240
1241       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1242       if (cmd == 0)
1243         error (_("Bad action list item: %s"), action_exp);
1244
1245       if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1246         {
1247           do
1248             {                   /* repeat over a comma-separated list */
1249               QUIT;             /* allow user to bail out with ^C */
1250               while (isspace ((int) *action_exp))
1251                 action_exp++;
1252
1253               if (0 == strncasecmp ("$reg", action_exp, 4))
1254                 {
1255                   for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
1256                     add_register (collect, i);
1257                   action_exp = strchr (action_exp, ',');        /* more? */
1258                 }
1259               else if (0 == strncasecmp ("$arg", action_exp, 4))
1260                 {
1261                   add_local_symbols (collect,
1262                                      t->gdbarch,
1263                                      tloc->address,
1264                                      frame_reg,
1265                                      frame_offset,
1266                                      'A');
1267                   action_exp = strchr (action_exp, ',');        /* more? */
1268                 }
1269               else if (0 == strncasecmp ("$loc", action_exp, 4))
1270                 {
1271                   add_local_symbols (collect,
1272                                      t->gdbarch,
1273                                      tloc->address,
1274                                      frame_reg,
1275                                      frame_offset,
1276                                      'L');
1277                   action_exp = strchr (action_exp, ',');        /* more? */
1278                 }
1279               else
1280                 {
1281                   unsigned long addr, len;
1282                   struct cleanup *old_chain = NULL;
1283                   struct cleanup *old_chain1 = NULL;
1284
1285                   exp = parse_exp_1 (&action_exp, 
1286                                      block_for_pc (tloc->address), 1);
1287                   old_chain = make_cleanup (free_current_contents, &exp);
1288
1289                   switch (exp->elts[0].opcode)
1290                     {
1291                     case OP_REGISTER:
1292                       {
1293                         const char *name = &exp->elts[2].string;
1294
1295                         i = user_reg_map_name_to_regnum (t->gdbarch,
1296                                                          name, strlen (name));
1297                         if (i == -1)
1298                           internal_error (__FILE__, __LINE__,
1299                                           _("Register $%s not available"),
1300                                           name);
1301                         if (info_verbose)
1302                           printf_filtered ("OP_REGISTER: ");
1303                         add_register (collect, i);
1304                         break;
1305                       }
1306
1307                     case UNOP_MEMVAL:
1308                       /* safe because we know it's a simple expression */
1309                       tempval = evaluate_expression (exp);
1310                       addr = value_address (tempval);
1311                       len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1312                       add_memrange (collect, memrange_absolute, addr, len);
1313                       break;
1314
1315                     case OP_VAR_VALUE:
1316                       collect_symbol (collect,
1317                                       exp->elts[2].symbol,
1318                                       t->gdbarch,
1319                                       frame_reg,
1320                                       frame_offset,
1321                                       tloc->address);
1322                       break;
1323
1324                     default:    /* full-fledged expression */
1325                       aexpr = gen_trace_for_expr (tloc->address, exp);
1326
1327                       old_chain1 = make_cleanup_free_agent_expr (aexpr);
1328
1329                       ax_reqs (aexpr);
1330
1331                       report_agent_reqs_errors (aexpr);
1332
1333                       discard_cleanups (old_chain1);
1334                       add_aexpr (collect, aexpr);
1335
1336                       /* take care of the registers */
1337                       if (aexpr->reg_mask_len > 0)
1338                         {
1339                           int ndx1;
1340                           int ndx2;
1341
1342                           for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1343                             {
1344                               QUIT;     /* allow user to bail out with ^C */
1345                               if (aexpr->reg_mask[ndx1] != 0)
1346                                 {
1347                                   /* assume chars have 8 bits */
1348                                   for (ndx2 = 0; ndx2 < 8; ndx2++)
1349                                     if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1350                                       /* it's used -- record it */
1351                                       add_register (collect, 
1352                                                     ndx1 * 8 + ndx2);
1353                                 }
1354                             }
1355                         }
1356                       break;
1357                     }           /* switch */
1358                   do_cleanups (old_chain);
1359                 }               /* do */
1360             }
1361           while (action_exp && *action_exp++ == ',');
1362         }                       /* if */
1363       else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1364         {
1365           do
1366             {                   /* repeat over a comma-separated list */
1367               QUIT;             /* allow user to bail out with ^C */
1368               while (isspace ((int) *action_exp))
1369                 action_exp++;
1370
1371                 {
1372                   struct cleanup *old_chain = NULL;
1373                   struct cleanup *old_chain1 = NULL;
1374
1375                   exp = parse_exp_1 (&action_exp, 
1376                                      block_for_pc (tloc->address), 1);
1377                   old_chain = make_cleanup (free_current_contents, &exp);
1378
1379                   aexpr = gen_eval_for_expr (tloc->address, exp);
1380                   old_chain1 = make_cleanup_free_agent_expr (aexpr);
1381
1382                   ax_reqs (aexpr);
1383                   report_agent_reqs_errors (aexpr);
1384
1385                   discard_cleanups (old_chain1);
1386                   /* Even though we're not officially collecting, add
1387                      to the collect list anyway.  */
1388                   add_aexpr (collect, aexpr);
1389
1390                   do_cleanups (old_chain);
1391                 }               /* do */
1392             }
1393           while (action_exp && *action_exp++ == ',');
1394         }                       /* if */
1395       else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1396         {
1397           /* We check against nested while-stepping when setting
1398              breakpoint action, so no way to run into nested
1399              here.  */
1400           gdb_assert (stepping_list);
1401
1402           encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1403                             frame_offset, stepping_list, NULL);
1404         }
1405       else
1406         error (_("Invalid tracepoint command '%s'"), action->line);
1407     }                           /* for */
1408 }
1409
1410 /* Render all actions into gdb protocol.  */
1411 /*static*/ void
1412 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1413                 char ***tdp_actions, char ***stepping_actions)
1414 {
1415   static char tdp_buff[2048], step_buff[2048];
1416   char *default_collect_line = NULL;
1417   struct command_line *actions;
1418   struct command_line *default_collect_action = NULL;
1419   int frame_reg;
1420   LONGEST frame_offset;
1421   struct cleanup *back_to;
1422
1423   back_to = make_cleanup (null_cleanup, NULL);
1424
1425   clear_collection_list (&tracepoint_list);
1426   clear_collection_list (&stepping_list);
1427
1428   *tdp_actions = NULL;
1429   *stepping_actions = NULL;
1430
1431   gdbarch_virtual_frame_pointer (t->gdbarch,
1432                                  t->loc->address, &frame_reg, &frame_offset);
1433
1434   actions = breakpoint_commands (t);
1435
1436   /* If there are default expressions to collect, make up a collect
1437      action and prepend to the action list to encode.  Note that since
1438      validation is per-tracepoint (local var "xyz" might be valid for
1439      one tracepoint and not another, etc), we make up the action on
1440      the fly, and don't cache it.  */
1441   if (*default_collect)
1442     {
1443       char *line;
1444
1445       default_collect_line =  xstrprintf ("collect %s", default_collect);
1446       make_cleanup (xfree, default_collect_line);
1447
1448       line = default_collect_line;
1449       validate_actionline (&line, t);
1450
1451       default_collect_action = xmalloc (sizeof (struct command_line));
1452       make_cleanup (xfree, default_collect_action);
1453       default_collect_action->next = actions;
1454       default_collect_action->line = line;
1455       actions = default_collect_action;
1456     }
1457   encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1458                     &tracepoint_list, &stepping_list);
1459
1460   memrange_sortmerge (&tracepoint_list);
1461   memrange_sortmerge (&stepping_list);
1462
1463   *tdp_actions = stringify_collection_list (&tracepoint_list,
1464                                             tdp_buff);
1465   *stepping_actions = stringify_collection_list (&stepping_list,
1466                                                  step_buff);
1467
1468   do_cleanups (back_to);
1469 }
1470
1471 static void
1472 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1473 {
1474   if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1475     {
1476       collect->aexpr_list =
1477         xrealloc (collect->aexpr_list,
1478                   2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1479       collect->aexpr_listsize *= 2;
1480     }
1481   collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1482   collect->next_aexpr_elt++;
1483 }
1484
1485
1486 void
1487 start_tracing (void)
1488 {
1489   VEC(breakpoint_p) *tp_vec = NULL;
1490   int ix;
1491   struct breakpoint *t;
1492   struct trace_state_variable *tsv;
1493   int any_enabled = 0;
1494   
1495   tp_vec = all_tracepoints ();
1496
1497   /* No point in tracing without any tracepoints... */
1498   if (VEC_length (breakpoint_p, tp_vec) == 0)
1499     {
1500       VEC_free (breakpoint_p, tp_vec);
1501       error (_("No tracepoints defined, not starting trace"));
1502     }
1503
1504   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1505     {
1506       if (t->enable_state == bp_enabled)
1507         {
1508           any_enabled = 1;
1509           break;
1510         }
1511     }
1512
1513   /* No point in tracing with only disabled tracepoints.  */
1514   if (!any_enabled)
1515     {
1516       VEC_free (breakpoint_p, tp_vec);
1517       error (_("No tracepoints enabled, not starting trace"));
1518     }
1519
1520   target_trace_init ();
1521
1522   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1523     {
1524       t->number_on_target = 0;
1525       target_download_tracepoint (t);
1526       t->number_on_target = t->number;
1527     }
1528   VEC_free (breakpoint_p, tp_vec);
1529
1530   /* Send down all the trace state variables too.  */
1531   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1532     {
1533       target_download_trace_state_variable (tsv);
1534     }
1535   
1536   /* Tell target to treat text-like sections as transparent.  */
1537   target_trace_set_readonly_regions ();
1538   /* Set some mode flags.  */
1539   target_set_disconnected_tracing (disconnected_tracing);
1540   target_set_circular_trace_buffer (circular_trace_buffer);
1541
1542   /* Now insert traps and begin collecting data.  */
1543   target_trace_start ();
1544
1545   /* Reset our local state.  */
1546   set_traceframe_num (-1);
1547   set_tracepoint_num (-1);
1548   set_traceframe_context (NULL);
1549   current_trace_status()->running = 1;
1550 }
1551
1552 /* tstart command:
1553
1554    Tell target to clear any previous trace experiment.
1555    Walk the list of tracepoints, and send them (and their actions)
1556    to the target.  If no errors,
1557    Tell target to start a new trace experiment.  */
1558
1559 static void
1560 trace_start_command (char *args, int from_tty)
1561 {
1562   dont_repeat ();       /* Like "run", dangerous to repeat accidentally.  */
1563
1564   if (current_trace_status ()->running)
1565     {
1566       if (from_tty
1567           && !query (_("A trace is running already.  Start a new run? ")))
1568         error (_("New trace run not started."));
1569     }
1570
1571   start_tracing ();
1572 }
1573
1574 /* tstop command */
1575 static void
1576 trace_stop_command (char *args, int from_tty)
1577 {
1578   if (!current_trace_status ()->running)
1579     error (_("Trace is not running."));
1580
1581   stop_tracing ();
1582 }
1583
1584 void
1585 stop_tracing (void)
1586 {
1587   target_trace_stop ();
1588   /* should change in response to reply? */
1589   current_trace_status ()->running = 0;
1590 }
1591
1592 /* tstatus command */
1593 static void
1594 trace_status_command (char *args, int from_tty)
1595 {
1596   struct trace_status *ts = current_trace_status ();
1597   int status;
1598   
1599   status = target_get_trace_status (ts);
1600
1601   if (status == -1)
1602     {
1603       if (ts->from_file)
1604         printf_filtered (_("Using a trace file.\n"));
1605       else
1606         {
1607           printf_filtered (_("Trace can not be run on this target.\n"));
1608           return;
1609         }
1610     }
1611
1612   if (!ts->running_known)
1613     {
1614       printf_filtered (_("Run/stop status is unknown.\n"));
1615     }
1616   else if (ts->running)
1617     {
1618       printf_filtered (_("Trace is running on the target.\n"));
1619     }
1620   else
1621     {
1622       switch (ts->stop_reason)
1623         {
1624         case trace_never_run:
1625           printf_filtered (_("No trace has been run on the target.\n"));
1626           break;
1627         case tstop_command:
1628           printf_filtered (_("Trace stopped by a tstop command.\n"));
1629           break;
1630         case trace_buffer_full:
1631           printf_filtered (_("Trace stopped because the buffer was full.\n"));
1632           break;
1633         case trace_disconnected:
1634           printf_filtered (_("Trace stopped because of disconnection.\n"));
1635           break;
1636         case tracepoint_passcount:
1637           printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1638                            ts->stopping_tracepoint);
1639           break;
1640         case tracepoint_error:
1641           if (ts->stopping_tracepoint)
1642             printf_filtered (_("Trace stopped by an error (%s, tracepoint %d).\n"),
1643                              ts->error_desc, ts->stopping_tracepoint);
1644           else
1645             printf_filtered (_("Trace stopped by an error (%s).\n"),
1646                              ts->error_desc);
1647           break;
1648         case trace_stop_reason_unknown:
1649           printf_filtered (_("Trace stopped for an unknown reason.\n"));
1650           break;
1651         default:
1652           printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1653                            ts->stop_reason);
1654           break;
1655         }
1656     }
1657
1658   if (ts->traceframes_created >= 0
1659       && ts->traceframe_count != ts->traceframes_created)
1660     {
1661       printf_filtered (_("Buffer contains %d trace frames (of %d created total).\n"),
1662                        ts->traceframe_count, ts->traceframes_created);
1663     }
1664   else if (ts->traceframe_count >= 0)
1665     {
1666       printf_filtered (_("Collected %d trace frames.\n"),
1667                        ts->traceframe_count);
1668     }
1669
1670   if (ts->buffer_free >= 0)
1671     {
1672       if (ts->buffer_size >= 0)
1673         {
1674           printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1675                            ts->buffer_free, ts->buffer_size);
1676           if (ts->buffer_size > 0)
1677             printf_filtered (_(" (%d%% full)"),
1678                              ((int) ((((long long) (ts->buffer_size
1679                                                     - ts->buffer_free)) * 100)
1680                                      / ts->buffer_size)));
1681           printf_filtered (_(".\n"));
1682         }
1683       else
1684         printf_filtered (_("Trace buffer has %d bytes free.\n"),
1685                          ts->buffer_free);
1686     }
1687
1688   if (ts->disconnected_tracing)
1689     printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1690   else
1691     printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1692
1693   if (ts->circular_buffer)
1694     printf_filtered (_("Trace buffer is circular.\n"));
1695
1696   /* Now report on what we're doing with tfind.  */
1697   if (traceframe_number >= 0)
1698     printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1699                      traceframe_number, tracepoint_number);
1700   else
1701     printf_filtered (_("Not looking at any trace frame.\n"));
1702 }
1703
1704 /* Report the trace status to uiout, in a way suitable for MI, and not
1705    suitable for CLI.  If ON_STOP is true, suppress a few fields that
1706    are not meaningful in the -trace-stop response.
1707
1708    The implementation is essentially parallel to trace_status_command, but
1709    merging them will result in unreadable code.  */
1710 void
1711 trace_status_mi (int on_stop)
1712 {
1713   struct trace_status *ts = current_trace_status ();
1714   int status;
1715
1716   status = target_get_trace_status (ts);
1717
1718   if (status == -1 && !ts->from_file)
1719     {
1720       ui_out_field_string (uiout, "supported", "0");
1721       return;
1722     }
1723
1724   if (ts->from_file)
1725     ui_out_field_string (uiout, "supported", "file");
1726   else if (!on_stop)
1727     ui_out_field_string (uiout, "supported", "1");
1728
1729   gdb_assert (ts->running_known);
1730
1731   if (ts->running)
1732     {
1733       ui_out_field_string (uiout, "running", "1");
1734
1735       /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1736          Given that the frontend gets the status either on -trace-stop, or from
1737          -trace-status after re-connection, it does not seem like this
1738          information is necessary for anything.  It is not necessary for either
1739          figuring the vital state of the target nor for navigation of trace
1740          frames.  If the frontend wants to show the current state is some
1741          configure dialog, it can request the value when such dialog is
1742          invoked by the user.  */
1743     }
1744   else
1745     {
1746       char *stop_reason = NULL;
1747       int stopping_tracepoint = -1;
1748
1749       if (!on_stop)
1750         ui_out_field_string (uiout, "running", "0");
1751
1752       if (ts->stop_reason != trace_stop_reason_unknown)
1753         {
1754           switch (ts->stop_reason)
1755             {
1756             case tstop_command:
1757               stop_reason = "request";
1758               break;
1759             case trace_buffer_full:
1760               stop_reason = "overflow";
1761               break;
1762             case trace_disconnected:
1763               stop_reason = "disconnection";
1764               break;
1765             case tracepoint_passcount:
1766               stop_reason = "passcount";
1767               stopping_tracepoint = ts->stopping_tracepoint;
1768               break;
1769             case tracepoint_error:
1770               stop_reason = "error";
1771               stopping_tracepoint = ts->stopping_tracepoint;
1772               break;
1773             }
1774           
1775           if (stop_reason)
1776             {
1777               ui_out_field_string (uiout, "stop-reason", stop_reason);
1778               if (stopping_tracepoint != -1)
1779                 ui_out_field_int (uiout, "stopping-tracepoint",
1780                                   stopping_tracepoint);
1781               if (ts->stop_reason == tracepoint_error)
1782                 ui_out_field_string (uiout, "error-description",
1783                                      ts->error_desc);
1784             }
1785         }
1786     }
1787
1788   if (ts->traceframe_count != -1)
1789     ui_out_field_int (uiout, "frames", ts->traceframe_count);
1790   if (ts->traceframes_created != -1)
1791     ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
1792   if (ts->buffer_size != -1)
1793     ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1794   if (ts->buffer_free != -1)
1795     ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1796
1797   ui_out_field_int (uiout, "disconnected",  ts->disconnected_tracing);
1798   ui_out_field_int (uiout, "circular",  ts->circular_buffer);
1799 }
1800
1801 /* This function handles the details of what to do about an ongoing
1802    tracing run if the user has asked to detach or otherwise disconnect
1803    from the target.  */
1804 void
1805 disconnect_tracing (int from_tty)
1806 {
1807   /* It can happen that the target that was tracing went away on its
1808      own, and we didn't notice.  Get a status update, and if the
1809      current target doesn't even do tracing, then assume it's not
1810      running anymore.  */
1811   if (target_get_trace_status (current_trace_status ()) < 0)
1812     current_trace_status ()->running = 0;
1813
1814   /* If running interactively, give the user the option to cancel and
1815      then decide what to do differently with the run.  Scripts are
1816      just going to disconnect and let the target deal with it,
1817      according to how it's been instructed previously via
1818      disconnected-tracing.  */
1819   if (current_trace_status ()->running && from_tty)
1820     {
1821       if (current_trace_status ()->disconnected_tracing)
1822         {
1823           if (!query (_("Trace is running and will continue after detach; detach anyway? ")))
1824             error (_("Not confirmed."));
1825         }
1826       else
1827         {
1828           if (!query (_("Trace is running but will stop on detach; detach anyway? ")))
1829             error (_("Not confirmed."));
1830         }
1831     }
1832
1833   /* Also we want to be out of tfind mode, otherwise things can get
1834      confusing upon reconnection.  Just use these calls instead of
1835      full tfind_1 behavior because we're in the middle of detaching,
1836      and there's no point to updating current stack frame etc.  */
1837   set_traceframe_number (-1);
1838   set_traceframe_context (NULL);
1839 }
1840
1841 /* Worker function for the various flavors of the tfind command.  */
1842 void
1843 tfind_1 (enum trace_find_type type, int num,
1844          ULONGEST addr1, ULONGEST addr2,
1845          int from_tty)
1846 {
1847   int target_frameno = -1, target_tracept = -1;
1848   struct frame_id old_frame_id = null_frame_id;
1849   struct breakpoint *tp;
1850
1851   /* Only try to get the current stack frame if we have a chance of
1852      succeeding.  In particular, if we're trying to get a first trace
1853      frame while all threads are running, it's not going to succeed,
1854      so leave it with a default value and let the frame comparison
1855      below (correctly) decide to print out the source location of the
1856      trace frame.  */
1857   if (!(type == tfind_number && num == -1)
1858       && (has_stack_frames () || traceframe_number >= 0))
1859     old_frame_id = get_frame_id (get_current_frame ());
1860
1861   target_frameno = target_trace_find (type, num, addr1, addr2,
1862                                       &target_tracept);
1863   
1864   if (type == tfind_number
1865       && num == -1
1866       && target_frameno == -1)
1867     {
1868       /* We told the target to get out of tfind mode, and it did.  */
1869     }
1870   else if (target_frameno == -1)
1871     {
1872       /* A request for a non-existent trace frame has failed.
1873          Our response will be different, depending on FROM_TTY:
1874
1875          If FROM_TTY is true, meaning that this command was 
1876          typed interactively by the user, then give an error
1877          and DO NOT change the state of traceframe_number etc.
1878
1879          However if FROM_TTY is false, meaning that we're either
1880          in a script, a loop, or a user-defined command, then 
1881          DON'T give an error, but DO change the state of
1882          traceframe_number etc. to invalid.
1883
1884          The rationalle is that if you typed the command, you
1885          might just have committed a typo or something, and you'd
1886          like to NOT lose your current debugging state.  However
1887          if you're in a user-defined command or especially in a
1888          loop, then you need a way to detect that the command
1889          failed WITHOUT aborting.  This allows you to write
1890          scripts that search thru the trace buffer until the end,
1891          and then continue on to do something else.  */
1892   
1893       if (from_tty)
1894         error (_("Target failed to find requested trace frame."));
1895       else
1896         {
1897           if (info_verbose)
1898             printf_filtered ("End of trace buffer.\n");
1899 #if 0 /* dubious now? */
1900           /* The following will not recurse, since it's
1901              special-cased.  */
1902           trace_find_command ("-1", from_tty);
1903 #endif
1904         }
1905     }
1906   
1907   tp = get_tracepoint_by_number_on_target (target_tracept);
1908
1909   reinit_frame_cache ();
1910   registers_changed ();
1911   target_dcache_invalidate ();
1912   set_traceframe_num (target_frameno);
1913   set_tracepoint_num (tp ? tp->number : target_tracept);
1914   if (target_frameno == -1)
1915     set_traceframe_context (NULL);
1916   else
1917     set_traceframe_context (get_current_frame ());
1918
1919   if (traceframe_number >= 0)
1920     {
1921       /* Use different branches for MI and CLI to make CLI messages
1922          i18n-eable.  */
1923       if (ui_out_is_mi_like_p (uiout))
1924         {
1925           ui_out_field_string (uiout, "found", "1");
1926           ui_out_field_int (uiout, "tracepoint", tracepoint_number);
1927           ui_out_field_int (uiout, "traceframe", traceframe_number);
1928         }
1929       else
1930         {
1931           printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
1932                              traceframe_number, tracepoint_number);
1933         }
1934     }
1935   else
1936     {
1937       if (ui_out_is_mi_like_p (uiout))
1938         ui_out_field_string (uiout, "found", "0");
1939       else if (type == tfind_number && num == -1)
1940         printf_unfiltered (_("No longer looking at any trace frame\n"));
1941       else /* this case may never occur, check */
1942         printf_unfiltered (_("No trace frame found\n"));
1943     }
1944
1945   /* If we're in nonstop mode and getting out of looking at trace
1946      frames, there won't be any current frame to go back to and
1947      display.  */
1948   if (from_tty
1949       && (has_stack_frames () || traceframe_number >= 0))
1950     {
1951       enum print_what print_what;
1952
1953       /* NOTE: in imitation of the step command, try to determine
1954          whether we have made a transition from one function to
1955          another.  If so, we'll print the "stack frame" (ie. the new
1956          function and it's arguments) -- otherwise we'll just show the
1957          new source line.  */
1958
1959       if (frame_id_eq (old_frame_id,
1960                        get_frame_id (get_current_frame ())))
1961         print_what = SRC_LINE;
1962       else
1963         print_what = SRC_AND_LOC;
1964
1965       print_stack_frame (get_selected_frame (NULL), 1, print_what);
1966       do_displays ();
1967     }
1968 }
1969
1970 /* trace_find_command takes a trace frame number n, 
1971    sends "QTFrame:<n>" to the target, 
1972    and accepts a reply that may contain several optional pieces
1973    of information: a frame number, a tracepoint number, and an
1974    indication of whether this is a trap frame or a stepping frame.
1975
1976    The minimal response is just "OK" (which indicates that the 
1977    target does not give us a frame number or a tracepoint number).
1978    Instead of that, the target may send us a string containing
1979    any combination of:
1980    F<hexnum>    (gives the selected frame number)
1981    T<hexnum>    (gives the selected tracepoint number)
1982  */
1983
1984 /* tfind command */
1985 static void
1986 trace_find_command (char *args, int from_tty)
1987 { /* this should only be called with a numeric argument */
1988   int frameno = -1;
1989
1990   if (current_trace_status ()->running && !current_trace_status ()->from_file)
1991     error ("May not look at trace frames while trace is running.");
1992   
1993   if (args == 0 || *args == 0)
1994     { /* TFIND with no args means find NEXT trace frame.  */
1995       if (traceframe_number == -1)
1996         frameno = 0;    /* "next" is first one */
1997         else
1998         frameno = traceframe_number + 1;
1999     }
2000   else if (0 == strcmp (args, "-"))
2001     {
2002       if (traceframe_number == -1)
2003         error (_("not debugging trace buffer"));
2004       else if (from_tty && traceframe_number == 0)
2005         error (_("already at start of trace buffer"));
2006       
2007       frameno = traceframe_number - 1;
2008       }
2009   /* A hack to work around eval's need for fp to have been collected.  */
2010   else if (0 == strcmp (args, "-1"))
2011     frameno = -1;
2012   else
2013     frameno = parse_and_eval_long (args);
2014
2015   if (frameno < -1)
2016     error (_("invalid input (%d is less than zero)"), frameno);
2017
2018   tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2019 }
2020
2021 /* tfind end */
2022 static void
2023 trace_find_end_command (char *args, int from_tty)
2024 {
2025   trace_find_command ("-1", from_tty);
2026 }
2027
2028 /* tfind none */
2029 static void
2030 trace_find_none_command (char *args, int from_tty)
2031 {
2032   trace_find_command ("-1", from_tty);
2033 }
2034
2035 /* tfind start */
2036 static void
2037 trace_find_start_command (char *args, int from_tty)
2038 {
2039   trace_find_command ("0", from_tty);
2040 }
2041
2042 /* tfind pc command */
2043 static void
2044 trace_find_pc_command (char *args, int from_tty)
2045 {
2046   CORE_ADDR pc;
2047
2048   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2049     error ("May not look at trace frames while trace is running.");
2050
2051   if (args == 0 || *args == 0)
2052     pc = regcache_read_pc (get_current_regcache ());
2053   else
2054     pc = parse_and_eval_address (args);
2055
2056   tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2057 }
2058
2059 /* tfind tracepoint command */
2060 static void
2061 trace_find_tracepoint_command (char *args, int from_tty)
2062 {
2063   int tdp;
2064   struct breakpoint *tp;
2065
2066   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2067     error ("May not look at trace frames while trace is running.");
2068
2069   if (args == 0 || *args == 0)
2070     {
2071       if (tracepoint_number == -1)
2072         error (_("No current tracepoint -- please supply an argument."));
2073       else
2074         tdp = tracepoint_number;        /* default is current TDP */
2075     }
2076   else
2077     tdp = parse_and_eval_long (args);
2078
2079   /* If we have the tracepoint on hand, use the number that the
2080      target knows about (which may be different if we disconnected
2081      and reconnected).  */
2082   tp = get_tracepoint (tdp);
2083   if (tp)
2084     tdp = tp->number_on_target;
2085
2086   tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2087 }
2088
2089 /* TFIND LINE command:
2090
2091    This command will take a sourceline for argument, just like BREAK
2092    or TRACE (ie. anything that "decode_line_1" can handle).
2093
2094    With no argument, this command will find the next trace frame 
2095    corresponding to a source line OTHER THAN THE CURRENT ONE.  */
2096
2097 static void
2098 trace_find_line_command (char *args, int from_tty)
2099 {
2100   static CORE_ADDR start_pc, end_pc;
2101   struct symtabs_and_lines sals;
2102   struct symtab_and_line sal;
2103   struct cleanup *old_chain;
2104
2105   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2106     error ("May not look at trace frames while trace is running.");
2107
2108   if (args == 0 || *args == 0)
2109     {
2110       sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2111       sals.nelts = 1;
2112       sals.sals = (struct symtab_and_line *)
2113         xmalloc (sizeof (struct symtab_and_line));
2114       sals.sals[0] = sal;
2115     }
2116   else
2117     {
2118       sals = decode_line_spec (args, 1);
2119       sal = sals.sals[0];
2120     }
2121   
2122   old_chain = make_cleanup (xfree, sals.sals);
2123   if (sal.symtab == 0)
2124     error (_("No line number information available."));
2125
2126   if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2127     {
2128       if (start_pc == end_pc)
2129         {
2130           printf_filtered ("Line %d of \"%s\"",
2131                            sal.line, sal.symtab->filename);
2132           wrap_here ("  ");
2133           printf_filtered (" is at address ");
2134           print_address (get_current_arch (), start_pc, gdb_stdout);
2135           wrap_here ("  ");
2136           printf_filtered (" but contains no code.\n");
2137           sal = find_pc_line (start_pc, 0);
2138           if (sal.line > 0
2139               && find_line_pc_range (sal, &start_pc, &end_pc)
2140               && start_pc != end_pc)
2141             printf_filtered ("Attempting to find line %d instead.\n",
2142                              sal.line);
2143           else
2144             error (_("Cannot find a good line."));
2145         }
2146       }
2147     else
2148     /* Is there any case in which we get here, and have an address
2149        which the user would want to see?  If we have debugging
2150        symbols and no line numbers?  */
2151     error (_("Line number %d is out of range for \"%s\"."),
2152            sal.line, sal.symtab->filename);
2153
2154   /* Find within range of stated line.  */
2155   if (args && *args)
2156     tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2157   else
2158     tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2159   do_cleanups (old_chain);
2160 }
2161
2162 /* tfind range command */
2163 static void
2164 trace_find_range_command (char *args, int from_tty)
2165 {
2166   static CORE_ADDR start, stop;
2167   char *tmp;
2168
2169   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2170     error ("May not look at trace frames while trace is running.");
2171
2172   if (args == 0 || *args == 0)
2173     { /* XXX FIXME: what should default behavior be?  */
2174       printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2175       return;
2176     }
2177
2178   if (0 != (tmp = strchr (args, ',')))
2179     {
2180       *tmp++ = '\0';    /* terminate start address */
2181       while (isspace ((int) *tmp))
2182         tmp++;
2183       start = parse_and_eval_address (args);
2184       stop = parse_and_eval_address (tmp);
2185     }
2186   else
2187     {                   /* no explicit end address? */
2188       start = parse_and_eval_address (args);
2189       stop = start + 1; /* ??? */
2190     }
2191
2192   tfind_1 (tfind_range, 0, start, stop, from_tty);
2193 }
2194
2195 /* tfind outside command */
2196 static void
2197 trace_find_outside_command (char *args, int from_tty)
2198 {
2199   CORE_ADDR start, stop;
2200   char *tmp;
2201
2202   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2203     error ("May not look at trace frames while trace is running.");
2204
2205   if (args == 0 || *args == 0)
2206     { /* XXX FIXME: what should default behavior be? */
2207       printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2208       return;
2209     }
2210
2211   if (0 != (tmp = strchr (args, ',')))
2212     {
2213       *tmp++ = '\0';    /* terminate start address */
2214       while (isspace ((int) *tmp))
2215         tmp++;
2216       start = parse_and_eval_address (args);
2217       stop = parse_and_eval_address (tmp);
2218     }
2219   else
2220     {                   /* no explicit end address? */
2221       start = parse_and_eval_address (args);
2222       stop = start + 1; /* ??? */
2223     }
2224
2225   tfind_1 (tfind_outside, 0, start, stop, from_tty);
2226 }
2227
2228 /* info scope command: list the locals for a scope.  */
2229 static void
2230 scope_info (char *args, int from_tty)
2231 {
2232   struct symtabs_and_lines sals;
2233   struct symbol *sym;
2234   struct minimal_symbol *msym;
2235   struct block *block;
2236   char **canonical, *symname, *save_args = args;
2237   struct dict_iterator iter;
2238   int j, count = 0;
2239   struct gdbarch *gdbarch;
2240   int regno;
2241
2242   if (args == 0 || *args == 0)
2243     error (_("requires an argument (function, line or *addr) to define a scope"));
2244
2245   sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
2246   if (sals.nelts == 0)
2247     return;             /* presumably decode_line_1 has already warned */
2248
2249   /* Resolve line numbers to PC */
2250   resolve_sal_pc (&sals.sals[0]);
2251   block = block_for_pc (sals.sals[0].pc);
2252
2253   while (block != 0)
2254     {
2255       QUIT;                     /* allow user to bail out with ^C */
2256       ALL_BLOCK_SYMBOLS (block, iter, sym)
2257         {
2258           QUIT;                 /* allow user to bail out with ^C */
2259           if (count == 0)
2260             printf_filtered ("Scope for %s:\n", save_args);
2261           count++;
2262
2263           symname = SYMBOL_PRINT_NAME (sym);
2264           if (symname == NULL || *symname == '\0')
2265             continue;           /* probably botched, certainly useless */
2266
2267           gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2268
2269           printf_filtered ("Symbol %s is ", symname);
2270           switch (SYMBOL_CLASS (sym))
2271             {
2272             default:
2273             case LOC_UNDEF:     /* messed up symbol? */
2274               printf_filtered ("a bogus symbol, class %d.\n",
2275                                SYMBOL_CLASS (sym));
2276               count--;          /* don't count this one */
2277               continue;
2278             case LOC_CONST:
2279               printf_filtered ("a constant with value %ld (0x%lx)",
2280                                SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2281               break;
2282             case LOC_CONST_BYTES:
2283               printf_filtered ("constant bytes: ");
2284               if (SYMBOL_TYPE (sym))
2285                 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2286                   fprintf_filtered (gdb_stdout, " %02x",
2287                                     (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2288               break;
2289             case LOC_STATIC:
2290               printf_filtered ("in static storage at address ");
2291               printf_filtered ("%s", paddress (gdbarch,
2292                                                SYMBOL_VALUE_ADDRESS (sym)));
2293               break;
2294             case LOC_REGISTER:
2295               /* GDBARCH is the architecture associated with the objfile
2296                  the symbol is defined in; the target architecture may be
2297                  different, and may provide additional registers.  However,
2298                  we do not know the target architecture at this point.
2299                  We assume the objfile architecture will contain all the
2300                  standard registers that occur in debug info in that
2301                  objfile.  */
2302               regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
2303
2304               if (SYMBOL_IS_ARGUMENT (sym))
2305                 printf_filtered ("an argument in register $%s",
2306                                  gdbarch_register_name (gdbarch, regno));
2307               else
2308                 printf_filtered ("a local variable in register $%s",
2309                                  gdbarch_register_name (gdbarch, regno));
2310               break;
2311             case LOC_ARG:
2312               printf_filtered ("an argument at stack/frame offset %ld",
2313                                SYMBOL_VALUE (sym));
2314               break;
2315             case LOC_LOCAL:
2316               printf_filtered ("a local variable at frame offset %ld",
2317                                SYMBOL_VALUE (sym));
2318               break;
2319             case LOC_REF_ARG:
2320               printf_filtered ("a reference argument at offset %ld",
2321                                SYMBOL_VALUE (sym));
2322               break;
2323             case LOC_REGPARM_ADDR:
2324               /* Note comment at LOC_REGISTER.  */
2325               regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
2326               printf_filtered ("the address of an argument, in register $%s",
2327                                gdbarch_register_name (gdbarch, regno));
2328               break;
2329             case LOC_TYPEDEF:
2330               printf_filtered ("a typedef.\n");
2331               continue;
2332             case LOC_LABEL:
2333               printf_filtered ("a label at address ");
2334               printf_filtered ("%s", paddress (gdbarch,
2335                                                SYMBOL_VALUE_ADDRESS (sym)));
2336               break;
2337             case LOC_BLOCK:
2338               printf_filtered ("a function at address ");
2339               printf_filtered ("%s",
2340                 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2341               break;
2342             case LOC_UNRESOLVED:
2343               msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2344                                             NULL, NULL);
2345               if (msym == NULL)
2346                 printf_filtered ("Unresolved Static");
2347               else
2348                 {
2349                   printf_filtered ("static storage at address ");
2350                   printf_filtered ("%s",
2351                     paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2352                 }
2353               break;
2354             case LOC_OPTIMIZED_OUT:
2355               printf_filtered ("optimized out.\n");
2356               continue;
2357             case LOC_COMPUTED:
2358               SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2359                                                             BLOCK_START (block),
2360                                                             gdb_stdout);
2361               break;
2362             }
2363           if (SYMBOL_TYPE (sym))
2364             printf_filtered (", length %d.\n",
2365                              TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2366         }
2367       if (BLOCK_FUNCTION (block))
2368         break;
2369       else
2370         block = BLOCK_SUPERBLOCK (block);
2371     }
2372   if (count <= 0)
2373     printf_filtered ("Scope for %s contains no locals or arguments.\n",
2374                      save_args);
2375 }
2376
2377 /* worker function (cleanup) */
2378 static void
2379 replace_comma (void *data)
2380 {
2381   char *comma = data;
2382   *comma = ',';
2383 }
2384
2385
2386 /* Helper for trace_dump_command.  Dump the action list starting at
2387    ACTION.  STEPPING_ACTIONS is true if we're iterating over the
2388    actions of the body of a while-stepping action.  STEPPING_FRAME is
2389    set if the current traceframe was determined to be a while-stepping
2390    traceframe.  */
2391
2392 static void
2393 trace_dump_actions (struct command_line *action,
2394                     int stepping_actions, int stepping_frame,
2395                     int from_tty)
2396 {
2397   char *action_exp, *next_comma;
2398
2399   for (; action != NULL; action = action->next)
2400     {
2401       struct cmd_list_element *cmd;
2402
2403       QUIT;                     /* allow user to bail out with ^C */
2404       action_exp = action->line;
2405       while (isspace ((int) *action_exp))
2406         action_exp++;
2407
2408       /* The collection actions to be done while stepping are
2409          bracketed by the commands "while-stepping" and "end".  */
2410
2411       if (*action_exp == '#')   /* comment line */
2412         continue;
2413
2414       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2415       if (cmd == 0)
2416         error (_("Bad action list item: %s"), action_exp);
2417
2418       if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2419         {
2420           int i;
2421
2422           for (i = 0; i < action->body_count; ++i)
2423             trace_dump_actions (action->body_list[i],
2424                                 1, stepping_frame, from_tty);
2425         }
2426       else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2427         {
2428           /* Display the collected data.
2429              For the trap frame, display only what was collected at
2430              the trap.  Likewise for stepping frames, display only
2431              what was collected while stepping.  This means that the
2432              two boolean variables, STEPPING_FRAME and
2433              STEPPING_ACTIONS should be equal.  */
2434           if (stepping_frame == stepping_actions)
2435             {
2436               do
2437                 {               /* repeat over a comma-separated list */
2438                   QUIT;         /* allow user to bail out with ^C */
2439                   if (*action_exp == ',')
2440                     action_exp++;
2441                   while (isspace ((int) *action_exp))
2442                     action_exp++;
2443
2444                   next_comma = strchr (action_exp, ',');
2445
2446                   if (0 == strncasecmp (action_exp, "$reg", 4))
2447                     registers_info (NULL, from_tty);
2448                   else if (0 == strncasecmp (action_exp, "$loc", 4))
2449                     locals_info (NULL, from_tty);
2450                   else if (0 == strncasecmp (action_exp, "$arg", 4))
2451                     args_info (NULL, from_tty);
2452                   else
2453                     {           /* variable */
2454                       if (next_comma)
2455                         {
2456                           make_cleanup (replace_comma, next_comma);
2457                           *next_comma = '\0';
2458                         }
2459                       printf_filtered ("%s = ", action_exp);
2460                       output_command (action_exp, from_tty);
2461                       printf_filtered ("\n");
2462                     }
2463                   if (next_comma)
2464                     *next_comma = ',';
2465                   action_exp = next_comma;
2466                 }
2467               while (action_exp && *action_exp == ',');
2468             }
2469         }
2470     }
2471 }
2472
2473 /* The tdump command.  */
2474
2475 static void
2476 trace_dump_command (char *args, int from_tty)
2477 {
2478   struct regcache *regcache;
2479   struct breakpoint *t;
2480   int stepping_frame = 0;
2481   struct bp_location *loc;
2482   char *line, *default_collect_line = NULL;
2483   struct command_line *actions, *default_collect_action = NULL;
2484   struct cleanup *old_chain = NULL;
2485
2486   if (tracepoint_number == -1)
2487     {
2488       warning (_("No current trace frame."));
2489       return;
2490     }
2491
2492   t = get_tracepoint (tracepoint_number);
2493
2494   if (t == NULL)
2495     error (_("No known tracepoint matches 'current' tracepoint #%d."),
2496            tracepoint_number);
2497
2498   printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2499                    tracepoint_number, traceframe_number);
2500
2501   /* The current frame is a trap frame if the frame PC is equal
2502      to the tracepoint PC.  If not, then the current frame was
2503      collected during single-stepping.  */
2504
2505   regcache = get_current_regcache ();
2506
2507   /* If the traceframe's address matches any of the tracepoint's
2508      locations, assume it is a direct hit rather than a while-stepping
2509      frame.  (FIXME this is not reliable, should record each frame's
2510      type.)  */
2511   stepping_frame = 1;
2512   for (loc = t->loc; loc; loc = loc->next)
2513     if (loc->address == regcache_read_pc (regcache))
2514       stepping_frame = 0;
2515
2516   actions = breakpoint_commands (t);
2517
2518   /* If there is a default-collect list, make up a collect command,
2519      prepend to the tracepoint's commands, and pass the whole mess to
2520      the trace dump scanner.  We need to validate because
2521      default-collect might have been junked since the trace run.  */
2522   if (*default_collect)
2523     {
2524       default_collect_line = xstrprintf ("collect %s", default_collect);
2525       old_chain = make_cleanup (xfree, default_collect_line);
2526       line = default_collect_line;
2527       validate_actionline (&line, t);
2528       default_collect_action = xmalloc (sizeof (struct command_line));
2529       make_cleanup (xfree, default_collect_action);
2530       default_collect_action->next = actions;
2531       default_collect_action->line = line;
2532       actions = default_collect_action;
2533     }
2534
2535   trace_dump_actions (actions, 0, stepping_frame, from_tty);
2536
2537   if (*default_collect)
2538     do_cleanups (old_chain);
2539 }
2540
2541 /* Encode a piece of a tracepoint's source-level definition in a form
2542    that is suitable for both protocol and saving in files.  */
2543 /* This version does not do multiple encodes for long strings; it should
2544    return an offset to the next piece to encode.  FIXME  */
2545
2546 extern int
2547 encode_source_string (int tpnum, ULONGEST addr,
2548                       char *srctype, char *src, char *buf, int buf_size)
2549 {
2550   if (80 + strlen (srctype) > buf_size)
2551     error (_("Buffer too small for source encoding"));
2552   sprintf (buf, "%x:%s:%s:%x:%x:",
2553            tpnum, phex_nz (addr, sizeof (addr)), srctype, 0, (int) strlen (src));
2554   if (strlen (buf) + strlen (src) * 2 >= buf_size)
2555     error (_("Source string too long for buffer"));
2556   bin2hex (src, buf + strlen (buf), 0);
2557   return -1;
2558 }
2559
2560 extern int trace_regblock_size;
2561
2562 /* Save tracepoint data to file named FILENAME.  If TARGET_DOES_SAVE is
2563    non-zero, the save is performed on the target, otherwise GDB obtains all
2564    trace data and saves it locally.  */
2565
2566 void
2567 trace_save (const char *filename, int target_does_save)
2568 {
2569   struct cleanup *cleanup;
2570   char *pathname;
2571   struct trace_status *ts = current_trace_status ();
2572   int err, status;
2573   FILE *fp;
2574   struct uploaded_tp *uploaded_tps = NULL, *utp;
2575   struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2576   int a;
2577   char *act;
2578   LONGEST gotten = 0;
2579   ULONGEST offset = 0;
2580 #define MAX_TRACE_UPLOAD 2000
2581   gdb_byte buf[MAX_TRACE_UPLOAD];
2582   int written;
2583
2584   /* If the target is to save the data to a file on its own, then just
2585      send the command and be done with it.  */
2586   if (target_does_save)
2587     {
2588       err = target_save_trace_data (filename);
2589       if (err < 0)
2590         error (_("Target failed to save trace data to '%s'."),
2591                filename);
2592       return;
2593     }
2594
2595   /* Get the trace status first before opening the file, so if the
2596      target is losing, we can get out without touching files.  */
2597   status = target_get_trace_status (ts);
2598
2599   pathname = tilde_expand (filename);
2600   cleanup = make_cleanup (xfree, pathname);
2601
2602   fp = fopen (pathname, "wb");
2603   if (!fp)
2604     error (_("Unable to open file '%s' for saving trace data (%s)"),
2605            filename, safe_strerror (errno));
2606   make_cleanup_fclose (fp);
2607
2608   /* Write a file header, with a high-bit-set char to indicate a
2609      binary file, plus a hint as what this file is, and a version
2610      number in case of future needs.  */
2611   written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
2612   if (written < 1)
2613     perror_with_name (pathname);
2614
2615   /* Write descriptive info.  */
2616
2617   /* Write out the size of a register block.  */
2618   fprintf (fp, "R %x\n", trace_regblock_size);
2619
2620   /* Write out status of the tracing run (aka "tstatus" info).  */
2621   fprintf (fp, "status %c;%s",
2622            (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
2623   if (ts->stop_reason == tracepoint_error)
2624     {
2625       char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
2626
2627       bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
2628       fprintf (fp, ":%s", buf);
2629     }
2630   fprintf (fp, ":%x", ts->stopping_tracepoint);
2631   if (ts->traceframe_count >= 0)
2632     fprintf (fp, ";tframes:%x", ts->traceframe_count);
2633   if (ts->traceframes_created >= 0)
2634     fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2635   if (ts->buffer_free >= 0)
2636     fprintf (fp, ";tfree:%x", ts->buffer_free);
2637   if (ts->buffer_size >= 0)
2638     fprintf (fp, ";tsize:%x", ts->buffer_size);
2639   if (ts->disconnected_tracing)
2640     fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2641   if (ts->circular_buffer)
2642     fprintf (fp, ";circular:%x", ts->circular_buffer);
2643   fprintf (fp, "\n");
2644
2645   /* Note that we want to upload tracepoints and save those, rather
2646      than simply writing out the local ones, because the user may have
2647      changed tracepoints in GDB in preparation for a future tracing
2648      run, or maybe just mass-deleted all types of breakpoints as part
2649      of cleaning up.  So as not to contaminate the session, leave the
2650      data in its uploaded form, don't make into real tracepoints.  */
2651
2652   /* Get trace state variables first, they may be checked when parsing
2653      uploaded commands.  */
2654
2655   target_upload_trace_state_variables (&uploaded_tsvs);
2656
2657   for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2658     {
2659       char *buf = "";
2660
2661       if (utsv->name)
2662         {
2663           buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2664           bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2665         }
2666
2667       fprintf (fp, "tsv %x:%s:%x:%s\n",
2668                utsv->number, phex_nz (utsv->initial_value, 8),
2669                utsv->builtin, buf);
2670
2671       if (utsv->name)
2672         xfree (buf);
2673     }
2674
2675   free_uploaded_tsvs (&uploaded_tsvs);
2676
2677   target_upload_tracepoints (&uploaded_tps);
2678
2679   for (utp = uploaded_tps; utp; utp = utp->next)
2680     {
2681       fprintf (fp, "tp T%x:%s:%c:%x:%x",
2682                utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2683                (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2684       if (utp->type == bp_fast_tracepoint)
2685         fprintf (fp, ":F%x", utp->orig_size);
2686       if (utp->cond)
2687         fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2688                  utp->cond);
2689       fprintf (fp, "\n");
2690       for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
2691         fprintf (fp, "tp A%x:%s:%s\n",
2692                  utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2693       for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
2694         fprintf (fp, "tp S%x:%s:%s\n",
2695                  utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2696       if (utp->at_string)
2697         {
2698           encode_source_string (utp->number, utp->addr,
2699                                 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2700           fprintf (fp, "tp Z%s\n", buf);
2701         }
2702       if (utp->cond_string)
2703         {
2704           encode_source_string (utp->number, utp->addr,
2705                                 "cond", utp->cond_string, buf, MAX_TRACE_UPLOAD);
2706           fprintf (fp, "tp Z%s\n", buf);
2707         }
2708       for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
2709         {
2710           encode_source_string (utp->number, utp->addr, "cmd", act,
2711                                 buf, MAX_TRACE_UPLOAD);
2712           fprintf (fp, "tp Z%s\n", buf);
2713         }
2714     }
2715
2716   free_uploaded_tps (&uploaded_tps);
2717
2718   /* Mark the end of the definition section.  */
2719   fprintf (fp, "\n");
2720
2721   /* Get and write the trace data proper.  We ask for big blocks, in
2722      the hopes of efficiency, but will take less if the target has
2723      packet size limitations or some such.  */
2724   while (1)
2725     {
2726       gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2727       if (gotten < 0)
2728         error (_("Failure to get requested trace buffer data"));
2729       /* No more data is forthcoming, we're done.  */
2730       if (gotten == 0)
2731         break;
2732       written = fwrite (buf, gotten, 1, fp);
2733       if (written < 1)
2734         perror_with_name (pathname);
2735       offset += gotten;
2736     }
2737
2738   /* Mark the end of trace data.  (We know that gotten is 0 at this point.)  */
2739   written = fwrite (&gotten, 4, 1, fp);
2740   if (written < 1)
2741     perror_with_name (pathname);
2742
2743   do_cleanups (cleanup);
2744 }
2745
2746 static void
2747 trace_save_command (char *args, int from_tty)
2748 {
2749   int target_does_save = 0;
2750   char **argv;
2751   char *filename = NULL;
2752   struct cleanup *back_to;
2753
2754   if (args == NULL)
2755     error_no_arg (_("file in which to save trace data"));
2756
2757   argv = gdb_buildargv (args);
2758   back_to = make_cleanup_freeargv (argv);
2759
2760   for (; *argv; ++argv)
2761     {
2762       if (strcmp (*argv, "-r") == 0)
2763         target_does_save = 1;
2764       else if (**argv == '-')
2765         error (_("unknown option `%s'"), *argv);
2766       else
2767         filename = *argv;
2768     }
2769
2770   if (!filename)
2771     error_no_arg (_("file in which to save trace data"));
2772
2773   trace_save (filename, target_does_save);
2774
2775   if (from_tty)
2776     printf_filtered (_("Trace data saved to file '%s'.\n"), args);
2777
2778   do_cleanups (back_to);
2779 }
2780
2781 /* Tell the target what to do with an ongoing tracing run if GDB
2782    disconnects for some reason.  */
2783
2784 void
2785 send_disconnected_tracing_value (int value)
2786 {
2787   target_set_disconnected_tracing (value);
2788 }
2789
2790 static void
2791 set_disconnected_tracing (char *args, int from_tty,
2792                           struct cmd_list_element *c)
2793 {
2794   send_disconnected_tracing_value (disconnected_tracing);
2795 }
2796
2797 static void
2798 set_circular_trace_buffer (char *args, int from_tty,
2799                            struct cmd_list_element *c)
2800 {
2801   target_set_circular_trace_buffer (circular_trace_buffer);
2802 }
2803
2804 /* Convert the memory pointed to by mem into hex, placing result in buf.
2805  * Return a pointer to the last char put in buf (null)
2806  * "stolen" from sparc-stub.c
2807  */
2808
2809 static const char hexchars[] = "0123456789abcdef";
2810
2811 static char *
2812 mem2hex (gdb_byte *mem, char *buf, int count)
2813 {
2814   gdb_byte ch;
2815
2816   while (count-- > 0)
2817     {
2818       ch = *mem++;
2819
2820       *buf++ = hexchars[ch >> 4];
2821       *buf++ = hexchars[ch & 0xf];
2822     }
2823
2824   *buf = 0;
2825
2826   return buf;
2827 }
2828
2829 int
2830 get_traceframe_number (void)
2831 {
2832   return traceframe_number;
2833 }
2834
2835 /* Make the traceframe NUM be the current trace frame.  Does nothing
2836    if NUM is already current.  */
2837
2838 void
2839 set_traceframe_number (int num)
2840 {
2841   int newnum;
2842
2843   if (traceframe_number == num)
2844     {
2845       /* Nothing to do.  */
2846       return;
2847     }
2848
2849   newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
2850
2851   if (newnum != num)
2852     warning (_("could not change traceframe"));
2853
2854   traceframe_number = newnum;
2855
2856   /* Changing the traceframe changes our view of registers and of the
2857      frame chain.  */
2858   registers_changed ();
2859 }
2860
2861 /* A cleanup used when switching away and back from tfind mode.  */
2862
2863 struct current_traceframe_cleanup
2864 {
2865   /* The traceframe we were inspecting.  */
2866   int traceframe_number;
2867 };
2868
2869 static void
2870 do_restore_current_traceframe_cleanup (void *arg)
2871 {
2872   struct current_traceframe_cleanup *old = arg;
2873
2874   set_traceframe_number (old->traceframe_number);
2875 }
2876
2877 static void
2878 restore_current_traceframe_cleanup_dtor (void *arg)
2879 {
2880   struct current_traceframe_cleanup *old = arg;
2881
2882   xfree (old);
2883 }
2884
2885 struct cleanup *
2886 make_cleanup_restore_current_traceframe (void)
2887 {
2888   struct current_traceframe_cleanup *old;
2889
2890   old = xmalloc (sizeof (struct current_traceframe_cleanup));
2891   old->traceframe_number = traceframe_number;
2892
2893   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
2894                             restore_current_traceframe_cleanup_dtor);
2895 }
2896
2897 /* Given a number and address, return an uploaded tracepoint with that
2898    number, creating if necessary.  */
2899
2900 struct uploaded_tp *
2901 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
2902 {
2903   struct uploaded_tp *utp;
2904
2905   for (utp = *utpp; utp; utp = utp->next)
2906     if (utp->number == num && utp->addr == addr)
2907       return utp;
2908   utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
2909   memset (utp, 0, sizeof (struct uploaded_tp));
2910   utp->number = num;
2911   utp->addr = addr;
2912   utp->actions = NULL;
2913   utp->step_actions = NULL;
2914   utp->cmd_strings = NULL;
2915   utp->next = *utpp;
2916   *utpp = utp;
2917   return utp;
2918 }
2919
2920 static void
2921 free_uploaded_tps (struct uploaded_tp **utpp)
2922 {
2923   struct uploaded_tp *next_one;
2924
2925   while (*utpp)
2926     {
2927       next_one = (*utpp)->next;
2928       xfree (*utpp);
2929       *utpp = next_one;
2930     }
2931 }
2932
2933 /* Given a number and address, return an uploaded tracepoint with that
2934    number, creating if necessary.  */
2935
2936 struct uploaded_tsv *
2937 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
2938 {
2939   struct uploaded_tsv *utsv;
2940
2941   for (utsv = *utsvp; utsv; utsv = utsv->next)
2942     if (utsv->number == num)
2943       return utsv;
2944   utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
2945   memset (utsv, 0, sizeof (struct uploaded_tsv));
2946   utsv->number = num;
2947   utsv->next = *utsvp;
2948   *utsvp = utsv;
2949   return utsv;
2950 }
2951
2952 static void
2953 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
2954 {
2955   struct uploaded_tsv *next_one;
2956
2957   while (*utsvp)
2958     {
2959       next_one = (*utsvp)->next;
2960       xfree (*utsvp);
2961       *utsvp = next_one;
2962     }
2963 }
2964
2965 /* Look for an existing tracepoint that seems similar enough to the
2966    uploaded one.  Enablement isn't compared, because the user can
2967    toggle that freely, and may have done so in anticipation of the
2968    next trace run.  */
2969
2970 struct breakpoint *
2971 find_matching_tracepoint (struct uploaded_tp *utp)
2972 {
2973   VEC(breakpoint_p) *tp_vec = all_tracepoints ();
2974   int ix;
2975   struct breakpoint *t;
2976   struct bp_location *loc;
2977
2978   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2979     {
2980       if (t->type == utp->type
2981           && t->step_count == utp->step
2982           && t->pass_count == utp->pass
2983           /* FIXME also test conditionals and actions */
2984           )
2985         {
2986           /* Scan the locations for an address match.  */
2987           for (loc = t->loc; loc; loc = loc->next)
2988             {
2989               if (loc->address == utp->addr)
2990                 return t;
2991             }
2992         }
2993     }
2994   return NULL;
2995 }
2996
2997 /* Given a list of tracepoints uploaded from a target, attempt to
2998    match them up with existing tracepoints, and create new ones if not
2999    found.  */
3000
3001 void
3002 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3003 {
3004   struct uploaded_tp *utp;
3005   struct breakpoint *t;
3006
3007   /* Look for GDB tracepoints that match up with our uploaded versions.  */
3008   for (utp = *uploaded_tps; utp; utp = utp->next)
3009     {
3010       t = find_matching_tracepoint (utp);
3011       if (t)
3012         printf_filtered (_("Assuming tracepoint %d is same as target's tracepoint %d at %s.\n"),
3013                          t->number, utp->number, paddress (get_current_arch (), utp->addr));
3014       else
3015         {
3016           t = create_tracepoint_from_upload (utp);
3017           if (t)
3018             printf_filtered (_("Created tracepoint %d for target's tracepoint %d at %s.\n"),
3019                              t->number, utp->number, paddress (get_current_arch (), utp->addr));
3020           else
3021             printf_filtered (_("Failed to create tracepoint for target's tracepoint %d at %s, skipping it.\n"),
3022                              utp->number, paddress (get_current_arch (), utp->addr));
3023         }
3024       /* Whether found or created, record the number used by the
3025          target, to help with mapping target tracepoints back to their
3026          counterparts here.  */
3027       if (t)
3028         t->number_on_target = utp->number;
3029     }
3030
3031   free_uploaded_tps (uploaded_tps);
3032 }
3033
3034 /* Trace state variables don't have much to identify them beyond their
3035    name, so just use that to detect matches.  */
3036
3037 struct trace_state_variable *
3038 find_matching_tsv (struct uploaded_tsv *utsv)
3039 {
3040   if (!utsv->name)
3041     return NULL;
3042
3043   return find_trace_state_variable (utsv->name);
3044 }
3045
3046 struct trace_state_variable *
3047 create_tsv_from_upload (struct uploaded_tsv *utsv)
3048 {
3049   const char *namebase;
3050   char buf[20];
3051   int try_num = 0;
3052   struct trace_state_variable *tsv;
3053
3054   if (utsv->name)
3055     {
3056       namebase = utsv->name;
3057       sprintf (buf, "%s", namebase);
3058     }
3059   else
3060     {
3061       namebase = "__tsv";
3062       sprintf (buf, "%s_%d", namebase, try_num++);
3063     }
3064
3065   /* Fish for a name that is not in use.  */
3066   /* (should check against all internal vars?) */
3067   while (find_trace_state_variable (buf))
3068     sprintf (buf, "%s_%d", namebase, try_num++);
3069
3070   /* We have an available name, create the variable.  */
3071   tsv = create_trace_state_variable (xstrdup (buf));
3072   tsv->initial_value = utsv->initial_value;
3073   tsv->builtin = utsv->builtin;
3074
3075   return tsv;
3076 }
3077
3078 /* Given a list of uploaded trace state variables, try to match them
3079    up with existing variables, or create additional ones.  */
3080
3081 void
3082 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3083 {
3084   int ix;
3085   struct uploaded_tsv *utsv;
3086   struct trace_state_variable *tsv;
3087   int highest;
3088
3089   /* Most likely some numbers will have to be reassigned as part of
3090      the merge, so clear them all in anticipation.  */
3091   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3092     tsv->number = 0;
3093
3094   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3095     {
3096       tsv = find_matching_tsv (utsv);
3097       if (tsv)
3098         printf_filtered (_("Assuming trace state variable $%s is same as target's variable %d.\n"),
3099                          tsv->name, utsv->number);
3100       else
3101         {
3102           tsv = create_tsv_from_upload (utsv);
3103           printf_filtered (_("Created trace state variable $%s for target's variable %d.\n"),
3104                            tsv->name, utsv->number);
3105         }
3106       /* Give precedence to numberings that come from the target.  */
3107       if (tsv)
3108         tsv->number = utsv->number;
3109     }
3110
3111   /* Renumber everything that didn't get a target-assigned number.  */
3112   highest = 0;
3113   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3114     if (tsv->number > highest)
3115       highest = tsv->number;
3116
3117   ++highest;
3118   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3119     if (tsv->number == 0)
3120       tsv->number = highest++;
3121
3122   free_uploaded_tsvs (uploaded_tsvs);
3123 }
3124
3125 /* target tfile command */
3126
3127 struct target_ops tfile_ops;
3128
3129 /* Fill in tfile_ops with its defined operations and properties.  */
3130
3131 #define TRACE_HEADER_SIZE 8
3132
3133 char *trace_filename;
3134 int trace_fd = -1;
3135 off_t trace_frames_offset;
3136 off_t cur_offset;
3137 int cur_data_size;
3138 int trace_regblock_size;
3139
3140 static void tfile_interp_line (char *line,
3141                                struct uploaded_tp **utpp,
3142                                struct uploaded_tsv **utsvp);
3143
3144 static void
3145 tfile_open (char *filename, int from_tty)
3146 {
3147   char *temp;
3148   struct cleanup *old_chain;
3149   int flags;
3150   int scratch_chan;
3151   char header[TRACE_HEADER_SIZE];
3152   char linebuf[1000]; /* should be max remote packet size or so */
3153   char byte;
3154   int bytes, i, gotten;
3155   struct trace_status *ts;
3156   struct uploaded_tp *uploaded_tps = NULL;
3157   struct uploaded_tsv *uploaded_tsvs = NULL;
3158
3159   target_preopen (from_tty);
3160   if (!filename)
3161     error (_("No trace file specified."));
3162
3163   filename = tilde_expand (filename);
3164   if (!IS_ABSOLUTE_PATH(filename))
3165     {
3166       temp = concat (current_directory, "/", filename, (char *) NULL);
3167       xfree (filename);
3168       filename = temp;
3169     }
3170
3171   old_chain = make_cleanup (xfree, filename);
3172
3173   flags = O_BINARY | O_LARGEFILE;
3174   flags |= O_RDONLY;
3175   scratch_chan = open (filename, flags, 0);
3176   if (scratch_chan < 0)
3177     perror_with_name (filename);
3178
3179   /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
3180
3181   discard_cleanups (old_chain); /* Don't free filename any more */
3182   unpush_target (&tfile_ops);
3183
3184   push_target (&tfile_ops);
3185
3186   trace_filename = xstrdup (filename);
3187   trace_fd = scratch_chan;
3188
3189   bytes = 0;
3190   /* Read the file header and test for validity.  */
3191   gotten = read (trace_fd, &header, TRACE_HEADER_SIZE);
3192   if (gotten < 0)
3193     perror_with_name (trace_filename);
3194   else if (gotten < TRACE_HEADER_SIZE)
3195     error (_("Premature end of file while reading trace file"));
3196
3197   bytes += TRACE_HEADER_SIZE;
3198   if (!(header[0] == 0x7f
3199         && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3200     error (_("File is not a valid trace file."));
3201
3202   trace_regblock_size = 0;
3203   ts = current_trace_status ();
3204   /* We know we're working with a file.  */
3205   ts->from_file = 1;
3206   /* Set defaults in case there is no status line.  */
3207   ts->running_known = 0;
3208   ts->stop_reason = trace_stop_reason_unknown;
3209   ts->traceframe_count = -1;
3210   ts->buffer_free = 0;
3211   ts->disconnected_tracing = 0;
3212   ts->circular_buffer = 0;
3213
3214   /* Read through a section of newline-terminated lines that
3215      define things like tracepoints.  */
3216   i = 0;
3217   while (1)
3218     {
3219       gotten = read (trace_fd, &byte, 1);
3220       if (gotten < 0)
3221         perror_with_name (trace_filename);
3222       else if (gotten < 1)
3223         error (_("Premature end of file while reading trace file"));
3224
3225       ++bytes;
3226       if (byte == '\n')
3227         {
3228           /* Empty line marks end of the definition section.  */
3229           if (i == 0)
3230             break;
3231           linebuf[i] = '\0';
3232           i = 0;
3233           tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3234         }
3235       else
3236         linebuf[i++] = byte;
3237       if (i >= 1000)
3238         error (_("Excessively long lines in trace file"));
3239     }
3240
3241   /* Add the file's tracepoints and variables into the current mix.  */
3242
3243   /* Get trace state variables first, they may be checked when parsing
3244      uploaded commands.  */
3245   merge_uploaded_trace_state_variables (&uploaded_tsvs);
3246
3247   merge_uploaded_tracepoints (&uploaded_tps);
3248
3249   /* Record the starting offset of the binary trace data.  */
3250   trace_frames_offset = bytes;
3251
3252   /* If we don't have a blocksize, we can't interpret the
3253      traceframes.  */
3254   if (trace_regblock_size == 0)
3255     error (_("No register block size recorded in trace file"));
3256   if (ts->traceframe_count <= 0)
3257     {
3258       warning ("No traceframes present in this file.");
3259       return;
3260     }
3261
3262 #define TFILE_PID (1)
3263   inferior_appeared (current_inferior (), TFILE_PID);
3264   inferior_ptid = pid_to_ptid (TFILE_PID);
3265   add_thread_silent (inferior_ptid);
3266
3267   post_create_inferior (&tfile_ops, from_tty);
3268
3269 #if 0
3270   /* FIXME this will get defined in MI patch submission */
3271   tfind_1 (tfind_number, 0, 0, 0, 0);
3272 #endif
3273 }
3274
3275 /* Interpret the given line from the definitions part of the trace
3276    file.  */
3277
3278 static void
3279 tfile_interp_line (char *line,
3280                    struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3281 {
3282   char *p = line;
3283
3284   if (strncmp (p, "R ", strlen ("R ")) == 0)
3285     {
3286       p += strlen ("R ");
3287       trace_regblock_size = strtol (p, &p, 16);
3288     }
3289   else if (strncmp (p, "status ", strlen ("status ")) == 0)
3290     {
3291       p += strlen ("status ");
3292       parse_trace_status (p, current_trace_status ());
3293     }
3294   else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3295     {
3296       p += strlen ("tp ");
3297       parse_tracepoint_definition (p, utpp);
3298     }
3299   else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3300     {
3301       p += strlen ("tsv ");
3302       parse_tsv_definition (p, utsvp);
3303     }
3304   else
3305     warning ("Ignoring trace file definition \"%s\"", line);
3306 }
3307
3308 /* Parse the part of trace status syntax that is shared between
3309    the remote protocol and the trace file reader.  */
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 }