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