* gdbtypes.c (check_typedef): Document that this function can
[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
1705       if ((b->type == bp_fast_tracepoint
1706            ? !may_insert_fast_tracepoints
1707            : !may_insert_tracepoints))
1708         continue;
1709
1710       t->number_on_target = 0;
1711       target_download_tracepoint (b);
1712       t->number_on_target = b->number;
1713     }
1714   VEC_free (breakpoint_p, tp_vec);
1715
1716   /* Send down all the trace state variables too.  */
1717   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1718     {
1719       target_download_trace_state_variable (tsv);
1720     }
1721   
1722   /* Tell target to treat text-like sections as transparent.  */
1723   target_trace_set_readonly_regions ();
1724   /* Set some mode flags.  */
1725   target_set_disconnected_tracing (disconnected_tracing);
1726   target_set_circular_trace_buffer (circular_trace_buffer);
1727
1728   /* Now insert traps and begin collecting data.  */
1729   target_trace_start ();
1730
1731   /* Reset our local state.  */
1732   set_traceframe_num (-1);
1733   set_tracepoint_num (-1);
1734   set_traceframe_context (NULL);
1735   current_trace_status()->running = 1;
1736   clear_traceframe_info ();
1737 }
1738
1739 /* tstart command:
1740
1741    Tell target to clear any previous trace experiment.
1742    Walk the list of tracepoints, and send them (and their actions)
1743    to the target.  If no errors,
1744    Tell target to start a new trace experiment.  */
1745
1746 static void
1747 trace_start_command (char *args, int from_tty)
1748 {
1749   dont_repeat ();       /* Like "run", dangerous to repeat accidentally.  */
1750
1751   if (current_trace_status ()->running)
1752     {
1753       if (from_tty
1754           && !query (_("A trace is running already.  Start a new run? ")))
1755         error (_("New trace run not started."));
1756     }
1757
1758   start_tracing ();
1759 }
1760
1761 /* tstop command */
1762 static void
1763 trace_stop_command (char *args, int from_tty)
1764 {
1765   if (!current_trace_status ()->running)
1766     error (_("Trace is not running."));
1767
1768   stop_tracing ();
1769 }
1770
1771 void
1772 stop_tracing (void)
1773 {
1774   target_trace_stop ();
1775   /* Should change in response to reply?  */
1776   current_trace_status ()->running = 0;
1777 }
1778
1779 /* tstatus command */
1780 static void
1781 trace_status_command (char *args, int from_tty)
1782 {
1783   struct trace_status *ts = current_trace_status ();
1784   int status;
1785   
1786   status = target_get_trace_status (ts);
1787
1788   if (status == -1)
1789     {
1790       if (ts->from_file)
1791         printf_filtered (_("Using a trace file.\n"));
1792       else
1793         {
1794           printf_filtered (_("Trace can not be run on this target.\n"));
1795           return;
1796         }
1797     }
1798
1799   if (!ts->running_known)
1800     {
1801       printf_filtered (_("Run/stop status is unknown.\n"));
1802     }
1803   else if (ts->running)
1804     {
1805       printf_filtered (_("Trace is running on the target.\n"));
1806     }
1807   else
1808     {
1809       switch (ts->stop_reason)
1810         {
1811         case trace_never_run:
1812           printf_filtered (_("No trace has been run on the target.\n"));
1813           break;
1814         case tstop_command:
1815           printf_filtered (_("Trace stopped by a tstop command.\n"));
1816           break;
1817         case trace_buffer_full:
1818           printf_filtered (_("Trace stopped because the buffer was full.\n"));
1819           break;
1820         case trace_disconnected:
1821           printf_filtered (_("Trace stopped because of disconnection.\n"));
1822           break;
1823         case tracepoint_passcount:
1824           printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1825                            ts->stopping_tracepoint);
1826           break;
1827         case tracepoint_error:
1828           if (ts->stopping_tracepoint)
1829             printf_filtered (_("Trace stopped by an "
1830                                "error (%s, tracepoint %d).\n"),
1831                              ts->error_desc, ts->stopping_tracepoint);
1832           else
1833             printf_filtered (_("Trace stopped by an error (%s).\n"),
1834                              ts->error_desc);
1835           break;
1836         case trace_stop_reason_unknown:
1837           printf_filtered (_("Trace stopped for an unknown reason.\n"));
1838           break;
1839         default:
1840           printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1841                            ts->stop_reason);
1842           break;
1843         }
1844     }
1845
1846   if (ts->traceframes_created >= 0
1847       && ts->traceframe_count != ts->traceframes_created)
1848     {
1849       printf_filtered (_("Buffer contains %d trace "
1850                          "frames (of %d created total).\n"),
1851                        ts->traceframe_count, ts->traceframes_created);
1852     }
1853   else if (ts->traceframe_count >= 0)
1854     {
1855       printf_filtered (_("Collected %d trace frames.\n"),
1856                        ts->traceframe_count);
1857     }
1858
1859   if (ts->buffer_free >= 0)
1860     {
1861       if (ts->buffer_size >= 0)
1862         {
1863           printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1864                            ts->buffer_free, ts->buffer_size);
1865           if (ts->buffer_size > 0)
1866             printf_filtered (_(" (%d%% full)"),
1867                              ((int) ((((long long) (ts->buffer_size
1868                                                     - ts->buffer_free)) * 100)
1869                                      / ts->buffer_size)));
1870           printf_filtered (_(".\n"));
1871         }
1872       else
1873         printf_filtered (_("Trace buffer has %d bytes free.\n"),
1874                          ts->buffer_free);
1875     }
1876
1877   if (ts->disconnected_tracing)
1878     printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1879   else
1880     printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1881
1882   if (ts->circular_buffer)
1883     printf_filtered (_("Trace buffer is circular.\n"));
1884
1885   /* Now report on what we're doing with tfind.  */
1886   if (traceframe_number >= 0)
1887     printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1888                      traceframe_number, tracepoint_number);
1889   else
1890     printf_filtered (_("Not looking at any trace frame.\n"));
1891 }
1892
1893 /* Report the trace status to uiout, in a way suitable for MI, and not
1894    suitable for CLI.  If ON_STOP is true, suppress a few fields that
1895    are not meaningful in the -trace-stop response.
1896
1897    The implementation is essentially parallel to trace_status_command, but
1898    merging them will result in unreadable code.  */
1899 void
1900 trace_status_mi (int on_stop)
1901 {
1902   struct ui_out *uiout = current_uiout;
1903   struct trace_status *ts = current_trace_status ();
1904   int status;
1905
1906   status = target_get_trace_status (ts);
1907
1908   if (status == -1 && !ts->from_file)
1909     {
1910       ui_out_field_string (uiout, "supported", "0");
1911       return;
1912     }
1913
1914   if (ts->from_file)
1915     ui_out_field_string (uiout, "supported", "file");
1916   else if (!on_stop)
1917     ui_out_field_string (uiout, "supported", "1");
1918
1919   gdb_assert (ts->running_known);
1920
1921   if (ts->running)
1922     {
1923       ui_out_field_string (uiout, "running", "1");
1924
1925       /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1926          Given that the frontend gets the status either on -trace-stop, or from
1927          -trace-status after re-connection, it does not seem like this
1928          information is necessary for anything.  It is not necessary for either
1929          figuring the vital state of the target nor for navigation of trace
1930          frames.  If the frontend wants to show the current state is some
1931          configure dialog, it can request the value when such dialog is
1932          invoked by the user.  */
1933     }
1934   else
1935     {
1936       char *stop_reason = NULL;
1937       int stopping_tracepoint = -1;
1938
1939       if (!on_stop)
1940         ui_out_field_string (uiout, "running", "0");
1941
1942       if (ts->stop_reason != trace_stop_reason_unknown)
1943         {
1944           switch (ts->stop_reason)
1945             {
1946             case tstop_command:
1947               stop_reason = "request";
1948               break;
1949             case trace_buffer_full:
1950               stop_reason = "overflow";
1951               break;
1952             case trace_disconnected:
1953               stop_reason = "disconnection";
1954               break;
1955             case tracepoint_passcount:
1956               stop_reason = "passcount";
1957               stopping_tracepoint = ts->stopping_tracepoint;
1958               break;
1959             case tracepoint_error:
1960               stop_reason = "error";
1961               stopping_tracepoint = ts->stopping_tracepoint;
1962               break;
1963             }
1964           
1965           if (stop_reason)
1966             {
1967               ui_out_field_string (uiout, "stop-reason", stop_reason);
1968               if (stopping_tracepoint != -1)
1969                 ui_out_field_int (uiout, "stopping-tracepoint",
1970                                   stopping_tracepoint);
1971               if (ts->stop_reason == tracepoint_error)
1972                 ui_out_field_string (uiout, "error-description",
1973                                      ts->error_desc);
1974             }
1975         }
1976     }
1977
1978   if (ts->traceframe_count != -1)
1979     ui_out_field_int (uiout, "frames", ts->traceframe_count);
1980   if (ts->traceframes_created != -1)
1981     ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
1982   if (ts->buffer_size != -1)
1983     ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1984   if (ts->buffer_free != -1)
1985     ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1986
1987   ui_out_field_int (uiout, "disconnected",  ts->disconnected_tracing);
1988   ui_out_field_int (uiout, "circular",  ts->circular_buffer);
1989 }
1990
1991 /* This function handles the details of what to do about an ongoing
1992    tracing run if the user has asked to detach or otherwise disconnect
1993    from the target.  */
1994 void
1995 disconnect_tracing (int from_tty)
1996 {
1997   /* It can happen that the target that was tracing went away on its
1998      own, and we didn't notice.  Get a status update, and if the
1999      current target doesn't even do tracing, then assume it's not
2000      running anymore.  */
2001   if (target_get_trace_status (current_trace_status ()) < 0)
2002     current_trace_status ()->running = 0;
2003
2004   /* If running interactively, give the user the option to cancel and
2005      then decide what to do differently with the run.  Scripts are
2006      just going to disconnect and let the target deal with it,
2007      according to how it's been instructed previously via
2008      disconnected-tracing.  */
2009   if (current_trace_status ()->running && from_tty)
2010     {
2011       if (current_trace_status ()->disconnected_tracing)
2012         {
2013           if (!query (_("Trace is running and will "
2014                         "continue after detach; detach anyway? ")))
2015             error (_("Not confirmed."));
2016         }
2017       else
2018         {
2019           if (!query (_("Trace is running but will "
2020                         "stop on detach; detach anyway? ")))
2021             error (_("Not confirmed."));
2022         }
2023     }
2024
2025   /* Also we want to be out of tfind mode, otherwise things can get
2026      confusing upon reconnection.  Just use these calls instead of
2027      full tfind_1 behavior because we're in the middle of detaching,
2028      and there's no point to updating current stack frame etc.  */
2029   set_current_traceframe (-1);
2030   set_traceframe_context (NULL);
2031 }
2032
2033 /* Worker function for the various flavors of the tfind command.  */
2034 void
2035 tfind_1 (enum trace_find_type type, int num,
2036          ULONGEST addr1, ULONGEST addr2,
2037          int from_tty)
2038 {
2039   int target_frameno = -1, target_tracept = -1;
2040   struct frame_id old_frame_id = null_frame_id;
2041   struct tracepoint *tp;
2042   struct ui_out *uiout = current_uiout;
2043
2044   /* Only try to get the current stack frame if we have a chance of
2045      succeeding.  In particular, if we're trying to get a first trace
2046      frame while all threads are running, it's not going to succeed,
2047      so leave it with a default value and let the frame comparison
2048      below (correctly) decide to print out the source location of the
2049      trace frame.  */
2050   if (!(type == tfind_number && num == -1)
2051       && (has_stack_frames () || traceframe_number >= 0))
2052     old_frame_id = get_frame_id (get_current_frame ());
2053
2054   target_frameno = target_trace_find (type, num, addr1, addr2,
2055                                       &target_tracept);
2056   
2057   if (type == tfind_number
2058       && num == -1
2059       && target_frameno == -1)
2060     {
2061       /* We told the target to get out of tfind mode, and it did.  */
2062     }
2063   else if (target_frameno == -1)
2064     {
2065       /* A request for a non-existent trace frame has failed.
2066          Our response will be different, depending on FROM_TTY:
2067
2068          If FROM_TTY is true, meaning that this command was 
2069          typed interactively by the user, then give an error
2070          and DO NOT change the state of traceframe_number etc.
2071
2072          However if FROM_TTY is false, meaning that we're either
2073          in a script, a loop, or a user-defined command, then 
2074          DON'T give an error, but DO change the state of
2075          traceframe_number etc. to invalid.
2076
2077          The rationalle is that if you typed the command, you
2078          might just have committed a typo or something, and you'd
2079          like to NOT lose your current debugging state.  However
2080          if you're in a user-defined command or especially in a
2081          loop, then you need a way to detect that the command
2082          failed WITHOUT aborting.  This allows you to write
2083          scripts that search thru the trace buffer until the end,
2084          and then continue on to do something else.  */
2085   
2086       if (from_tty)
2087         error (_("Target failed to find requested trace frame."));
2088       else
2089         {
2090           if (info_verbose)
2091             printf_filtered ("End of trace buffer.\n");
2092 #if 0 /* dubious now?  */
2093           /* The following will not recurse, since it's
2094              special-cased.  */
2095           trace_find_command ("-1", from_tty);
2096 #endif
2097         }
2098     }
2099   
2100   tp = get_tracepoint_by_number_on_target (target_tracept);
2101
2102   reinit_frame_cache ();
2103   registers_changed ();
2104   target_dcache_invalidate ();
2105   set_traceframe_num (target_frameno);
2106   clear_traceframe_info ();
2107   set_tracepoint_num (tp ? tp->base.number : target_tracept);
2108   if (target_frameno == -1)
2109     set_traceframe_context (NULL);
2110   else
2111     set_traceframe_context (get_current_frame ());
2112
2113   if (traceframe_number >= 0)
2114     {
2115       /* Use different branches for MI and CLI to make CLI messages
2116          i18n-eable.  */
2117       if (ui_out_is_mi_like_p (uiout))
2118         {
2119           ui_out_field_string (uiout, "found", "1");
2120           ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2121           ui_out_field_int (uiout, "traceframe", traceframe_number);
2122         }
2123       else
2124         {
2125           printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2126                              traceframe_number, tracepoint_number);
2127         }
2128     }
2129   else
2130     {
2131       if (ui_out_is_mi_like_p (uiout))
2132         ui_out_field_string (uiout, "found", "0");
2133       else if (type == tfind_number && num == -1)
2134         printf_unfiltered (_("No longer looking at any trace frame\n"));
2135       else /* This case may never occur, check.  */
2136         printf_unfiltered (_("No trace frame found\n"));
2137     }
2138
2139   /* If we're in nonstop mode and getting out of looking at trace
2140      frames, there won't be any current frame to go back to and
2141      display.  */
2142   if (from_tty
2143       && (has_stack_frames () || traceframe_number >= 0))
2144     {
2145       enum print_what print_what;
2146
2147       /* NOTE: in imitation of the step command, try to determine
2148          whether we have made a transition from one function to
2149          another.  If so, we'll print the "stack frame" (ie. the new
2150          function and it's arguments) -- otherwise we'll just show the
2151          new source line.  */
2152
2153       if (frame_id_eq (old_frame_id,
2154                        get_frame_id (get_current_frame ())))
2155         print_what = SRC_LINE;
2156       else
2157         print_what = SRC_AND_LOC;
2158
2159       print_stack_frame (get_selected_frame (NULL), 1, print_what);
2160       do_displays ();
2161     }
2162 }
2163
2164 /* trace_find_command takes a trace frame number n, 
2165    sends "QTFrame:<n>" to the target, 
2166    and accepts a reply that may contain several optional pieces
2167    of information: a frame number, a tracepoint number, and an
2168    indication of whether this is a trap frame or a stepping frame.
2169
2170    The minimal response is just "OK" (which indicates that the 
2171    target does not give us a frame number or a tracepoint number).
2172    Instead of that, the target may send us a string containing
2173    any combination of:
2174    F<hexnum>    (gives the selected frame number)
2175    T<hexnum>    (gives the selected tracepoint number)
2176  */
2177
2178 /* tfind command */
2179 static void
2180 trace_find_command (char *args, int from_tty)
2181 { /* This should only be called with a numeric argument.  */
2182   int frameno = -1;
2183
2184   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2185     error (_("May not look at trace frames while trace is running."));
2186   
2187   if (args == 0 || *args == 0)
2188     { /* TFIND with no args means find NEXT trace frame.  */
2189       if (traceframe_number == -1)
2190         frameno = 0;    /* "next" is first one.  */
2191         else
2192         frameno = traceframe_number + 1;
2193     }
2194   else if (0 == strcmp (args, "-"))
2195     {
2196       if (traceframe_number == -1)
2197         error (_("not debugging trace buffer"));
2198       else if (from_tty && traceframe_number == 0)
2199         error (_("already at start of trace buffer"));
2200       
2201       frameno = traceframe_number - 1;
2202       }
2203   /* A hack to work around eval's need for fp to have been collected.  */
2204   else if (0 == strcmp (args, "-1"))
2205     frameno = -1;
2206   else
2207     frameno = parse_and_eval_long (args);
2208
2209   if (frameno < -1)
2210     error (_("invalid input (%d is less than zero)"), frameno);
2211
2212   tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2213 }
2214
2215 /* tfind end */
2216 static void
2217 trace_find_end_command (char *args, int from_tty)
2218 {
2219   trace_find_command ("-1", from_tty);
2220 }
2221
2222 /* tfind none */
2223 static void
2224 trace_find_none_command (char *args, int from_tty)
2225 {
2226   trace_find_command ("-1", from_tty);
2227 }
2228
2229 /* tfind start */
2230 static void
2231 trace_find_start_command (char *args, int from_tty)
2232 {
2233   trace_find_command ("0", from_tty);
2234 }
2235
2236 /* tfind pc command */
2237 static void
2238 trace_find_pc_command (char *args, int from_tty)
2239 {
2240   CORE_ADDR pc;
2241
2242   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2243     error (_("May not look at trace frames while trace is running."));
2244
2245   if (args == 0 || *args == 0)
2246     pc = regcache_read_pc (get_current_regcache ());
2247   else
2248     pc = parse_and_eval_address (args);
2249
2250   tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2251 }
2252
2253 /* tfind tracepoint command */
2254 static void
2255 trace_find_tracepoint_command (char *args, int from_tty)
2256 {
2257   int tdp;
2258   struct tracepoint *tp;
2259
2260   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2261     error (_("May not look at trace frames while trace is running."));
2262
2263   if (args == 0 || *args == 0)
2264     {
2265       if (tracepoint_number == -1)
2266         error (_("No current tracepoint -- please supply an argument."));
2267       else
2268         tdp = tracepoint_number;        /* Default is current TDP.  */
2269     }
2270   else
2271     tdp = parse_and_eval_long (args);
2272
2273   /* If we have the tracepoint on hand, use the number that the
2274      target knows about (which may be different if we disconnected
2275      and reconnected).  */
2276   tp = get_tracepoint (tdp);
2277   if (tp)
2278     tdp = tp->number_on_target;
2279
2280   tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2281 }
2282
2283 /* TFIND LINE command:
2284
2285    This command will take a sourceline for argument, just like BREAK
2286    or TRACE (ie. anything that "decode_line_1" can handle).
2287
2288    With no argument, this command will find the next trace frame 
2289    corresponding to a source line OTHER THAN THE CURRENT ONE.  */
2290
2291 static void
2292 trace_find_line_command (char *args, int from_tty)
2293 {
2294   static CORE_ADDR start_pc, end_pc;
2295   struct symtabs_and_lines sals;
2296   struct symtab_and_line sal;
2297   struct cleanup *old_chain;
2298
2299   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2300     error (_("May not look at trace frames while trace is running."));
2301
2302   if (args == 0 || *args == 0)
2303     {
2304       sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2305       sals.nelts = 1;
2306       sals.sals = (struct symtab_and_line *)
2307         xmalloc (sizeof (struct symtab_and_line));
2308       sals.sals[0] = sal;
2309     }
2310   else
2311     {
2312       sals = decode_line_spec (args, 1);
2313       sal = sals.sals[0];
2314     }
2315   
2316   old_chain = make_cleanup (xfree, sals.sals);
2317   if (sal.symtab == 0)
2318     error (_("No line number information available."));
2319
2320   if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2321     {
2322       if (start_pc == end_pc)
2323         {
2324           printf_filtered ("Line %d of \"%s\"",
2325                            sal.line, sal.symtab->filename);
2326           wrap_here ("  ");
2327           printf_filtered (" is at address ");
2328           print_address (get_current_arch (), start_pc, gdb_stdout);
2329           wrap_here ("  ");
2330           printf_filtered (" but contains no code.\n");
2331           sal = find_pc_line (start_pc, 0);
2332           if (sal.line > 0
2333               && find_line_pc_range (sal, &start_pc, &end_pc)
2334               && start_pc != end_pc)
2335             printf_filtered ("Attempting to find line %d instead.\n",
2336                              sal.line);
2337           else
2338             error (_("Cannot find a good line."));
2339         }
2340       }
2341     else
2342     /* Is there any case in which we get here, and have an address
2343        which the user would want to see?  If we have debugging
2344        symbols and no line numbers?  */
2345     error (_("Line number %d is out of range for \"%s\"."),
2346            sal.line, sal.symtab->filename);
2347
2348   /* Find within range of stated line.  */
2349   if (args && *args)
2350     tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2351   else
2352     tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2353   do_cleanups (old_chain);
2354 }
2355
2356 /* tfind range command */
2357 static void
2358 trace_find_range_command (char *args, int from_tty)
2359 {
2360   static CORE_ADDR start, stop;
2361   char *tmp;
2362
2363   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2364     error (_("May not look at trace frames while trace is running."));
2365
2366   if (args == 0 || *args == 0)
2367     { /* XXX FIXME: what should default behavior be?  */
2368       printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2369       return;
2370     }
2371
2372   if (0 != (tmp = strchr (args, ',')))
2373     {
2374       *tmp++ = '\0';    /* Terminate start address.  */
2375       while (isspace ((int) *tmp))
2376         tmp++;
2377       start = parse_and_eval_address (args);
2378       stop = parse_and_eval_address (tmp);
2379     }
2380   else
2381     {                   /* No explicit end address?  */
2382       start = parse_and_eval_address (args);
2383       stop = start + 1; /* ??? */
2384     }
2385
2386   tfind_1 (tfind_range, 0, start, stop, from_tty);
2387 }
2388
2389 /* tfind outside command */
2390 static void
2391 trace_find_outside_command (char *args, int from_tty)
2392 {
2393   CORE_ADDR start, stop;
2394   char *tmp;
2395
2396   if (current_trace_status ()->running && !current_trace_status ()->from_file)
2397     error (_("May not look at trace frames while trace is running."));
2398
2399   if (args == 0 || *args == 0)
2400     { /* XXX FIXME: what should default behavior be?  */
2401       printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2402       return;
2403     }
2404
2405   if (0 != (tmp = strchr (args, ',')))
2406     {
2407       *tmp++ = '\0';    /* Terminate start address.  */
2408       while (isspace ((int) *tmp))
2409         tmp++;
2410       start = parse_and_eval_address (args);
2411       stop = parse_and_eval_address (tmp);
2412     }
2413   else
2414     {                   /* No explicit end address?  */
2415       start = parse_and_eval_address (args);
2416       stop = start + 1; /* ??? */
2417     }
2418
2419   tfind_1 (tfind_outside, 0, start, stop, from_tty);
2420 }
2421
2422 /* info scope command: list the locals for a scope.  */
2423 static void
2424 scope_info (char *args, int from_tty)
2425 {
2426   struct symtabs_and_lines sals;
2427   struct symbol *sym;
2428   struct minimal_symbol *msym;
2429   struct block *block;
2430   char *symname, *save_args = args;
2431   struct dict_iterator iter;
2432   int j, count = 0;
2433   struct gdbarch *gdbarch;
2434   int regno;
2435
2436   if (args == 0 || *args == 0)
2437     error (_("requires an argument (function, "
2438              "line or *addr) to define a scope"));
2439
2440   sals = decode_line_1 (&args, 1, NULL, 0, NULL);
2441   if (sals.nelts == 0)
2442     return;             /* Presumably decode_line_1 has already warned.  */
2443
2444   /* Resolve line numbers to PC.  */
2445   resolve_sal_pc (&sals.sals[0]);
2446   block = block_for_pc (sals.sals[0].pc);
2447
2448   while (block != 0)
2449     {
2450       QUIT;                     /* Allow user to bail out with ^C.  */
2451       ALL_BLOCK_SYMBOLS (block, iter, sym)
2452         {
2453           QUIT;                 /* Allow user to bail out with ^C.  */
2454           if (count == 0)
2455             printf_filtered ("Scope for %s:\n", save_args);
2456           count++;
2457
2458           symname = SYMBOL_PRINT_NAME (sym);
2459           if (symname == NULL || *symname == '\0')
2460             continue;           /* Probably botched, certainly useless.  */
2461
2462           gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2463
2464           printf_filtered ("Symbol %s is ", symname);
2465           switch (SYMBOL_CLASS (sym))
2466             {
2467             default:
2468             case LOC_UNDEF:     /* Messed up symbol?  */
2469               printf_filtered ("a bogus symbol, class %d.\n",
2470                                SYMBOL_CLASS (sym));
2471               count--;          /* Don't count this one.  */
2472               continue;
2473             case LOC_CONST:
2474               printf_filtered ("a constant with value %ld (0x%lx)",
2475                                SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2476               break;
2477             case LOC_CONST_BYTES:
2478               printf_filtered ("constant bytes: ");
2479               if (SYMBOL_TYPE (sym))
2480                 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2481                   fprintf_filtered (gdb_stdout, " %02x",
2482                                     (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2483               break;
2484             case LOC_STATIC:
2485               printf_filtered ("in static storage at address ");
2486               printf_filtered ("%s", paddress (gdbarch,
2487                                                SYMBOL_VALUE_ADDRESS (sym)));
2488               break;
2489             case LOC_REGISTER:
2490               /* GDBARCH is the architecture associated with the objfile
2491                  the symbol is defined in; the target architecture may be
2492                  different, and may provide additional registers.  However,
2493                  we do not know the target architecture at this point.
2494                  We assume the objfile architecture will contain all the
2495                  standard registers that occur in debug info in that
2496                  objfile.  */
2497               regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2498                                                                   gdbarch);
2499
2500               if (SYMBOL_IS_ARGUMENT (sym))
2501                 printf_filtered ("an argument in register $%s",
2502                                  gdbarch_register_name (gdbarch, regno));
2503               else
2504                 printf_filtered ("a local variable in register $%s",
2505                                  gdbarch_register_name (gdbarch, regno));
2506               break;
2507             case LOC_ARG:
2508               printf_filtered ("an argument at stack/frame offset %ld",
2509                                SYMBOL_VALUE (sym));
2510               break;
2511             case LOC_LOCAL:
2512               printf_filtered ("a local variable at frame offset %ld",
2513                                SYMBOL_VALUE (sym));
2514               break;
2515             case LOC_REF_ARG:
2516               printf_filtered ("a reference argument at offset %ld",
2517                                SYMBOL_VALUE (sym));
2518               break;
2519             case LOC_REGPARM_ADDR:
2520               /* Note comment at LOC_REGISTER.  */
2521               regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2522                                                                   gdbarch);
2523               printf_filtered ("the address of an argument, in register $%s",
2524                                gdbarch_register_name (gdbarch, regno));
2525               break;
2526             case LOC_TYPEDEF:
2527               printf_filtered ("a typedef.\n");
2528               continue;
2529             case LOC_LABEL:
2530               printf_filtered ("a label at address ");
2531               printf_filtered ("%s", paddress (gdbarch,
2532                                                SYMBOL_VALUE_ADDRESS (sym)));
2533               break;
2534             case LOC_BLOCK:
2535               printf_filtered ("a function at address ");
2536               printf_filtered ("%s",
2537                 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2538               break;
2539             case LOC_UNRESOLVED:
2540               msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2541                                             NULL, NULL);
2542               if (msym == NULL)
2543                 printf_filtered ("Unresolved Static");
2544               else
2545                 {
2546                   printf_filtered ("static storage at address ");
2547                   printf_filtered ("%s",
2548                     paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2549                 }
2550               break;
2551             case LOC_OPTIMIZED_OUT:
2552               printf_filtered ("optimized out.\n");
2553               continue;
2554             case LOC_COMPUTED:
2555               SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2556                                                             BLOCK_START (block),
2557                                                             gdb_stdout);
2558               break;
2559             }
2560           if (SYMBOL_TYPE (sym))
2561             printf_filtered (", length %d.\n",
2562                              TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2563         }
2564       if (BLOCK_FUNCTION (block))
2565         break;
2566       else
2567         block = BLOCK_SUPERBLOCK (block);
2568     }
2569   if (count <= 0)
2570     printf_filtered ("Scope for %s contains no locals or arguments.\n",
2571                      save_args);
2572 }
2573
2574 /* worker function (cleanup) */
2575 static void
2576 replace_comma (void *data)
2577 {
2578   char *comma = data;
2579   *comma = ',';
2580 }
2581
2582
2583 /* Helper for trace_dump_command.  Dump the action list starting at
2584    ACTION.  STEPPING_ACTIONS is true if we're iterating over the
2585    actions of the body of a while-stepping action.  STEPPING_FRAME is
2586    set if the current traceframe was determined to be a while-stepping
2587    traceframe.  */
2588
2589 static void
2590 trace_dump_actions (struct command_line *action,
2591                     int stepping_actions, int stepping_frame,
2592                     int from_tty)
2593 {
2594   char *action_exp, *next_comma;
2595
2596   for (; action != NULL; action = action->next)
2597     {
2598       struct cmd_list_element *cmd;
2599
2600       QUIT;                     /* Allow user to bail out with ^C.  */
2601       action_exp = action->line;
2602       while (isspace ((int) *action_exp))
2603         action_exp++;
2604
2605       /* The collection actions to be done while stepping are
2606          bracketed by the commands "while-stepping" and "end".  */
2607
2608       if (*action_exp == '#')   /* comment line */
2609         continue;
2610
2611       cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2612       if (cmd == 0)
2613         error (_("Bad action list item: %s"), action_exp);
2614
2615       if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2616         {
2617           int i;
2618
2619           for (i = 0; i < action->body_count; ++i)
2620             trace_dump_actions (action->body_list[i],
2621                                 1, stepping_frame, from_tty);
2622         }
2623       else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2624         {
2625           /* Display the collected data.
2626              For the trap frame, display only what was collected at
2627              the trap.  Likewise for stepping frames, display only
2628              what was collected while stepping.  This means that the
2629              two boolean variables, STEPPING_FRAME and
2630              STEPPING_ACTIONS should be equal.  */
2631           if (stepping_frame == stepping_actions)
2632             {
2633               if (*action_exp == '/')
2634                 action_exp = decode_agent_options (action_exp);
2635
2636               do
2637                 {               /* Repeat over a comma-separated list.  */
2638                   QUIT;         /* Allow user to bail out with ^C.  */
2639                   if (*action_exp == ',')
2640                     action_exp++;
2641                   while (isspace ((int) *action_exp))
2642                     action_exp++;
2643
2644                   next_comma = strchr (action_exp, ',');
2645
2646                   if (0 == strncasecmp (action_exp, "$reg", 4))
2647                     registers_info (NULL, from_tty);
2648                   else if (0 == strncasecmp (action_exp, "$_ret", 5))
2649                     ;
2650                   else if (0 == strncasecmp (action_exp, "$loc", 4))
2651                     locals_info (NULL, from_tty);
2652                   else if (0 == strncasecmp (action_exp, "$arg", 4))
2653                     args_info (NULL, from_tty);
2654                   else
2655                     {           /* variable */
2656                       if (next_comma)
2657                         {
2658                           make_cleanup (replace_comma, next_comma);
2659                           *next_comma = '\0';
2660                         }
2661                       printf_filtered ("%s = ", action_exp);
2662                       output_command (action_exp, from_tty);
2663                       printf_filtered ("\n");
2664                     }
2665                   if (next_comma)
2666                     *next_comma = ',';
2667                   action_exp = next_comma;
2668                 }
2669               while (action_exp && *action_exp == ',');
2670             }
2671         }
2672     }
2673 }
2674
2675 /* The tdump command.  */
2676
2677 static void
2678 trace_dump_command (char *args, int from_tty)
2679 {
2680   struct regcache *regcache;
2681   struct tracepoint *t;
2682   int stepping_frame = 0;
2683   struct bp_location *loc;
2684   char *line, *default_collect_line = NULL;
2685   struct command_line *actions, *default_collect_action = NULL;
2686   struct cleanup *old_chain = NULL;
2687
2688   if (tracepoint_number == -1)
2689     {
2690       warning (_("No current trace frame."));
2691       return;
2692     }
2693
2694   t = get_tracepoint (tracepoint_number);
2695
2696   if (t == NULL)
2697     error (_("No known tracepoint matches 'current' tracepoint #%d."),
2698            tracepoint_number);
2699
2700   printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2701                    tracepoint_number, traceframe_number);
2702
2703   /* The current frame is a trap frame if the frame PC is equal
2704      to the tracepoint PC.  If not, then the current frame was
2705      collected during single-stepping.  */
2706
2707   regcache = get_current_regcache ();
2708
2709   /* If the traceframe's address matches any of the tracepoint's
2710      locations, assume it is a direct hit rather than a while-stepping
2711      frame.  (FIXME this is not reliable, should record each frame's
2712      type.)  */
2713   stepping_frame = 1;
2714   for (loc = t->base.loc; loc; loc = loc->next)
2715     if (loc->address == regcache_read_pc (regcache))
2716       stepping_frame = 0;
2717
2718   actions = breakpoint_commands (&t->base);
2719
2720   /* If there is a default-collect list, make up a collect command,
2721      prepend to the tracepoint's commands, and pass the whole mess to
2722      the trace dump scanner.  We need to validate because
2723      default-collect might have been junked since the trace run.  */
2724   if (*default_collect)
2725     {
2726       default_collect_line = xstrprintf ("collect %s", default_collect);
2727       old_chain = make_cleanup (xfree, default_collect_line);
2728       line = default_collect_line;
2729       validate_actionline (&line, &t->base);
2730       default_collect_action = xmalloc (sizeof (struct command_line));
2731       make_cleanup (xfree, default_collect_action);
2732       default_collect_action->next = actions;
2733       default_collect_action->line = line;
2734       actions = default_collect_action;
2735     }
2736
2737   trace_dump_actions (actions, 0, stepping_frame, from_tty);
2738
2739   if (*default_collect)
2740     do_cleanups (old_chain);
2741 }
2742
2743 /* Encode a piece of a tracepoint's source-level definition in a form
2744    that is suitable for both protocol and saving in files.  */
2745 /* This version does not do multiple encodes for long strings; it should
2746    return an offset to the next piece to encode.  FIXME  */
2747
2748 extern int
2749 encode_source_string (int tpnum, ULONGEST addr,
2750                       char *srctype, char *src, char *buf, int buf_size)
2751 {
2752   if (80 + strlen (srctype) > buf_size)
2753     error (_("Buffer too small for source encoding"));
2754   sprintf (buf, "%x:%s:%s:%x:%x:",
2755            tpnum, phex_nz (addr, sizeof (addr)),
2756            srctype, 0, (int) strlen (src));
2757   if (strlen (buf) + strlen (src) * 2 >= buf_size)
2758     error (_("Source string too long for buffer"));
2759   bin2hex (src, buf + strlen (buf), 0);
2760   return -1;
2761 }
2762
2763 extern int trace_regblock_size;
2764
2765 /* Save tracepoint data to file named FILENAME.  If TARGET_DOES_SAVE is
2766    non-zero, the save is performed on the target, otherwise GDB obtains all
2767    trace data and saves it locally.  */
2768
2769 void
2770 trace_save (const char *filename, int target_does_save)
2771 {
2772   struct cleanup *cleanup;
2773   char *pathname;
2774   struct trace_status *ts = current_trace_status ();
2775   int err, status;
2776   FILE *fp;
2777   struct uploaded_tp *uploaded_tps = NULL, *utp;
2778   struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2779   int a;
2780   char *act;
2781   LONGEST gotten = 0;
2782   ULONGEST offset = 0;
2783 #define MAX_TRACE_UPLOAD 2000
2784   gdb_byte buf[MAX_TRACE_UPLOAD];
2785   int written;
2786
2787   /* If the target is to save the data to a file on its own, then just
2788      send the command and be done with it.  */
2789   if (target_does_save)
2790     {
2791       err = target_save_trace_data (filename);
2792       if (err < 0)
2793         error (_("Target failed to save trace data to '%s'."),
2794                filename);
2795       return;
2796     }
2797
2798   /* Get the trace status first before opening the file, so if the
2799      target is losing, we can get out without touching files.  */
2800   status = target_get_trace_status (ts);
2801
2802   pathname = tilde_expand (filename);
2803   cleanup = make_cleanup (xfree, pathname);
2804
2805   fp = fopen (pathname, "wb");
2806   if (!fp)
2807     error (_("Unable to open file '%s' for saving trace data (%s)"),
2808            filename, safe_strerror (errno));
2809   make_cleanup_fclose (fp);
2810
2811   /* Write a file header, with a high-bit-set char to indicate a
2812      binary file, plus a hint as what this file is, and a version
2813      number in case of future needs.  */
2814   written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
2815   if (written < 1)
2816     perror_with_name (pathname);
2817
2818   /* Write descriptive info.  */
2819
2820   /* Write out the size of a register block.  */
2821   fprintf (fp, "R %x\n", trace_regblock_size);
2822
2823   /* Write out status of the tracing run (aka "tstatus" info).  */
2824   fprintf (fp, "status %c;%s",
2825            (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
2826   if (ts->stop_reason == tracepoint_error)
2827     {
2828       char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
2829
2830       bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
2831       fprintf (fp, ":%s", buf);
2832     }
2833   fprintf (fp, ":%x", ts->stopping_tracepoint);
2834   if (ts->traceframe_count >= 0)
2835     fprintf (fp, ";tframes:%x", ts->traceframe_count);
2836   if (ts->traceframes_created >= 0)
2837     fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2838   if (ts->buffer_free >= 0)
2839     fprintf (fp, ";tfree:%x", ts->buffer_free);
2840   if (ts->buffer_size >= 0)
2841     fprintf (fp, ";tsize:%x", ts->buffer_size);
2842   if (ts->disconnected_tracing)
2843     fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2844   if (ts->circular_buffer)
2845     fprintf (fp, ";circular:%x", ts->circular_buffer);
2846   fprintf (fp, "\n");
2847
2848   /* Note that we want to upload tracepoints and save those, rather
2849      than simply writing out the local ones, because the user may have
2850      changed tracepoints in GDB in preparation for a future tracing
2851      run, or maybe just mass-deleted all types of breakpoints as part
2852      of cleaning up.  So as not to contaminate the session, leave the
2853      data in its uploaded form, don't make into real tracepoints.  */
2854
2855   /* Get trace state variables first, they may be checked when parsing
2856      uploaded commands.  */
2857
2858   target_upload_trace_state_variables (&uploaded_tsvs);
2859
2860   for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2861     {
2862       char *buf = "";
2863
2864       if (utsv->name)
2865         {
2866           buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2867           bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2868         }
2869
2870       fprintf (fp, "tsv %x:%s:%x:%s\n",
2871                utsv->number, phex_nz (utsv->initial_value, 8),
2872                utsv->builtin, buf);
2873
2874       if (utsv->name)
2875         xfree (buf);
2876     }
2877
2878   free_uploaded_tsvs (&uploaded_tsvs);
2879
2880   target_upload_tracepoints (&uploaded_tps);
2881
2882   for (utp = uploaded_tps; utp; utp = utp->next)
2883     {
2884       fprintf (fp, "tp T%x:%s:%c:%x:%x",
2885                utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2886                (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2887       if (utp->type == bp_fast_tracepoint)
2888         fprintf (fp, ":F%x", utp->orig_size);
2889       if (utp->cond)
2890         fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2891                  utp->cond);
2892       fprintf (fp, "\n");
2893       for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
2894         fprintf (fp, "tp A%x:%s:%s\n",
2895                  utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2896       for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
2897         fprintf (fp, "tp S%x:%s:%s\n",
2898                  utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
2899       if (utp->at_string)
2900         {
2901           encode_source_string (utp->number, utp->addr,
2902                                 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2903           fprintf (fp, "tp Z%s\n", buf);
2904         }
2905       if (utp->cond_string)
2906         {
2907           encode_source_string (utp->number, utp->addr,
2908                                 "cond", utp->cond_string,
2909                                 buf, MAX_TRACE_UPLOAD);
2910           fprintf (fp, "tp Z%s\n", buf);
2911         }
2912       for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
2913         {
2914           encode_source_string (utp->number, utp->addr, "cmd", act,
2915                                 buf, MAX_TRACE_UPLOAD);
2916           fprintf (fp, "tp Z%s\n", buf);
2917         }
2918     }
2919
2920   free_uploaded_tps (&uploaded_tps);
2921
2922   /* Mark the end of the definition section.  */
2923   fprintf (fp, "\n");
2924
2925   /* Get and write the trace data proper.  We ask for big blocks, in
2926      the hopes of efficiency, but will take less if the target has
2927      packet size limitations or some such.  */
2928   while (1)
2929     {
2930       gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2931       if (gotten < 0)
2932         error (_("Failure to get requested trace buffer data"));
2933       /* No more data is forthcoming, we're done.  */
2934       if (gotten == 0)
2935         break;
2936       written = fwrite (buf, gotten, 1, fp);
2937       if (written < 1)
2938         perror_with_name (pathname);
2939       offset += gotten;
2940     }
2941
2942   /* Mark the end of trace data.  (We know that gotten is 0 at this point.)  */
2943   written = fwrite (&gotten, 4, 1, fp);
2944   if (written < 1)
2945     perror_with_name (pathname);
2946
2947   do_cleanups (cleanup);
2948 }
2949
2950 static void
2951 trace_save_command (char *args, int from_tty)
2952 {
2953   int target_does_save = 0;
2954   char **argv;
2955   char *filename = NULL;
2956   struct cleanup *back_to;
2957
2958   if (args == NULL)
2959     error_no_arg (_("file in which to save trace data"));
2960
2961   argv = gdb_buildargv (args);
2962   back_to = make_cleanup_freeargv (argv);
2963
2964   for (; *argv; ++argv)
2965     {
2966       if (strcmp (*argv, "-r") == 0)
2967         target_does_save = 1;
2968       else if (**argv == '-')
2969         error (_("unknown option `%s'"), *argv);
2970       else
2971         filename = *argv;
2972     }
2973
2974   if (!filename)
2975     error_no_arg (_("file in which to save trace data"));
2976
2977   trace_save (filename, target_does_save);
2978
2979   if (from_tty)
2980     printf_filtered (_("Trace data saved to file '%s'.\n"), filename);
2981
2982   do_cleanups (back_to);
2983 }
2984
2985 /* Tell the target what to do with an ongoing tracing run if GDB
2986    disconnects for some reason.  */
2987
2988 void
2989 send_disconnected_tracing_value (int value)
2990 {
2991   target_set_disconnected_tracing (value);
2992 }
2993
2994 static void
2995 set_disconnected_tracing (char *args, int from_tty,
2996                           struct cmd_list_element *c)
2997 {
2998   send_disconnected_tracing_value (disconnected_tracing);
2999 }
3000
3001 static void
3002 set_circular_trace_buffer (char *args, int from_tty,
3003                            struct cmd_list_element *c)
3004 {
3005   target_set_circular_trace_buffer (circular_trace_buffer);
3006 }
3007
3008 /* Convert the memory pointed to by mem into hex, placing result in buf.
3009  * Return a pointer to the last char put in buf (null)
3010  * "stolen" from sparc-stub.c
3011  */
3012
3013 static const char hexchars[] = "0123456789abcdef";
3014
3015 static char *
3016 mem2hex (gdb_byte *mem, char *buf, int count)
3017 {
3018   gdb_byte ch;
3019
3020   while (count-- > 0)
3021     {
3022       ch = *mem++;
3023
3024       *buf++ = hexchars[ch >> 4];
3025       *buf++ = hexchars[ch & 0xf];
3026     }
3027
3028   *buf = 0;
3029
3030   return buf;
3031 }
3032
3033 int
3034 get_traceframe_number (void)
3035 {
3036   return traceframe_number;
3037 }
3038
3039 /* Make the traceframe NUM be the current trace frame.  Does nothing
3040    if NUM is already current.  */
3041
3042 void
3043 set_current_traceframe (int num)
3044 {
3045   int newnum;
3046
3047   if (traceframe_number == num)
3048     {
3049       /* Nothing to do.  */
3050       return;
3051     }
3052
3053   newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3054
3055   if (newnum != num)
3056     warning (_("could not change traceframe"));
3057
3058   traceframe_number = newnum;
3059
3060   /* Changing the traceframe changes our view of registers and of the
3061      frame chain.  */
3062   registers_changed ();
3063
3064   clear_traceframe_info ();
3065 }
3066
3067 /* Make the traceframe NUM be the current trace frame, and do nothing
3068    more.  */
3069
3070 void
3071 set_traceframe_number (int num)
3072 {
3073   traceframe_number = num;
3074 }
3075
3076 /* A cleanup used when switching away and back from tfind mode.  */
3077
3078 struct current_traceframe_cleanup
3079 {
3080   /* The traceframe we were inspecting.  */
3081   int traceframe_number;
3082 };
3083
3084 static void
3085 do_restore_current_traceframe_cleanup (void *arg)
3086 {
3087   struct current_traceframe_cleanup *old = arg;
3088
3089   set_current_traceframe (old->traceframe_number);
3090 }
3091
3092 static void
3093 restore_current_traceframe_cleanup_dtor (void *arg)
3094 {
3095   struct current_traceframe_cleanup *old = arg;
3096
3097   xfree (old);
3098 }
3099
3100 struct cleanup *
3101 make_cleanup_restore_current_traceframe (void)
3102 {
3103   struct current_traceframe_cleanup *old;
3104
3105   old = xmalloc (sizeof (struct current_traceframe_cleanup));
3106   old->traceframe_number = traceframe_number;
3107
3108   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3109                             restore_current_traceframe_cleanup_dtor);
3110 }
3111
3112 struct cleanup *
3113 make_cleanup_restore_traceframe_number (void)
3114 {
3115   return make_cleanup_restore_integer (&traceframe_number);
3116 }
3117
3118 /* Given a number and address, return an uploaded tracepoint with that
3119    number, creating if necessary.  */
3120
3121 struct uploaded_tp *
3122 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3123 {
3124   struct uploaded_tp *utp;
3125
3126   for (utp = *utpp; utp; utp = utp->next)
3127     if (utp->number == num && utp->addr == addr)
3128       return utp;
3129   utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3130   memset (utp, 0, sizeof (struct uploaded_tp));
3131   utp->number = num;
3132   utp->addr = addr;
3133   utp->actions = NULL;
3134   utp->step_actions = NULL;
3135   utp->cmd_strings = NULL;
3136   utp->next = *utpp;
3137   *utpp = utp;
3138   return utp;
3139 }
3140
3141 static void
3142 free_uploaded_tps (struct uploaded_tp **utpp)
3143 {
3144   struct uploaded_tp *next_one;
3145
3146   while (*utpp)
3147     {
3148       next_one = (*utpp)->next;
3149       xfree (*utpp);
3150       *utpp = next_one;
3151     }
3152 }
3153
3154 /* Given a number and address, return an uploaded tracepoint with that
3155    number, creating if necessary.  */
3156
3157 struct uploaded_tsv *
3158 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3159 {
3160   struct uploaded_tsv *utsv;
3161
3162   for (utsv = *utsvp; utsv; utsv = utsv->next)
3163     if (utsv->number == num)
3164       return utsv;
3165   utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3166   memset (utsv, 0, sizeof (struct uploaded_tsv));
3167   utsv->number = num;
3168   utsv->next = *utsvp;
3169   *utsvp = utsv;
3170   return utsv;
3171 }
3172
3173 static void
3174 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3175 {
3176   struct uploaded_tsv *next_one;
3177
3178   while (*utsvp)
3179     {
3180       next_one = (*utsvp)->next;
3181       xfree (*utsvp);
3182       *utsvp = next_one;
3183     }
3184 }
3185
3186 /* FIXME this function is heuristic and will miss the cases where the
3187    conditional is semantically identical but differs in whitespace,
3188    such as "x == 0" vs "x==0".  */
3189
3190 static int
3191 cond_string_is_same (char *str1, char *str2)
3192 {
3193   if (str1 == NULL || str2 == NULL)
3194     return (str1 == str2);
3195
3196   return (strcmp (str1, str2) == 0);
3197 }
3198
3199 /* Look for an existing tracepoint that seems similar enough to the
3200    uploaded one.  Enablement isn't compared, because the user can
3201    toggle that freely, and may have done so in anticipation of the
3202    next trace run.  */
3203
3204 struct tracepoint *
3205 find_matching_tracepoint (struct uploaded_tp *utp)
3206 {
3207   VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3208   int ix;
3209   struct breakpoint *b;
3210   struct bp_location *loc;
3211
3212   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3213     {
3214       struct tracepoint *t = (struct tracepoint *) b;
3215
3216       if (b->type == utp->type
3217           && t->step_count == utp->step
3218           && t->pass_count == utp->pass
3219           && cond_string_is_same (t->base.cond_string, utp->cond_string)
3220           /* FIXME also test actions.  */
3221           )
3222         {
3223           /* Scan the locations for an address match.  */
3224           for (loc = b->loc; loc; loc = loc->next)
3225             {
3226               if (loc->address == utp->addr)
3227                 return t;
3228             }
3229         }
3230     }
3231   return NULL;
3232 }
3233
3234 /* Given a list of tracepoints uploaded from a target, attempt to
3235    match them up with existing tracepoints, and create new ones if not
3236    found.  */
3237
3238 void
3239 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3240 {
3241   struct uploaded_tp *utp;
3242   struct tracepoint *t;
3243
3244   /* Look for GDB tracepoints that match up with our uploaded versions.  */
3245   for (utp = *uploaded_tps; utp; utp = utp->next)
3246     {
3247       t = find_matching_tracepoint (utp);
3248       if (t)
3249         printf_filtered (_("Assuming tracepoint %d is same "
3250                            "as target's tracepoint %d at %s.\n"),
3251                          t->base.number, utp->number,
3252                          paddress (get_current_arch (), utp->addr));
3253       else
3254         {
3255           t = create_tracepoint_from_upload (utp);
3256           if (t)
3257             printf_filtered (_("Created tracepoint %d for "
3258                                "target's tracepoint %d at %s.\n"),
3259                              t->base.number, utp->number,
3260                              paddress (get_current_arch (), utp->addr));
3261           else
3262             printf_filtered (_("Failed to create tracepoint for target's "
3263                                "tracepoint %d at %s, skipping it.\n"),
3264                              utp->number,
3265                              paddress (get_current_arch (), utp->addr));
3266         }
3267       /* Whether found or created, record the number used by the
3268          target, to help with mapping target tracepoints back to their
3269          counterparts here.  */
3270       if (t)
3271         t->number_on_target = utp->number;
3272     }
3273
3274   free_uploaded_tps (uploaded_tps);
3275 }
3276
3277 /* Trace state variables don't have much to identify them beyond their
3278    name, so just use that to detect matches.  */
3279
3280 struct trace_state_variable *
3281 find_matching_tsv (struct uploaded_tsv *utsv)
3282 {
3283   if (!utsv->name)
3284     return NULL;
3285
3286   return find_trace_state_variable (utsv->name);
3287 }
3288
3289 struct trace_state_variable *
3290 create_tsv_from_upload (struct uploaded_tsv *utsv)
3291 {
3292   const char *namebase;
3293   char buf[20];
3294   int try_num = 0;
3295   struct trace_state_variable *tsv;
3296
3297   if (utsv->name)
3298     {
3299       namebase = utsv->name;
3300       sprintf (buf, "%s", namebase);
3301     }
3302   else
3303     {
3304       namebase = "__tsv";
3305       sprintf (buf, "%s_%d", namebase, try_num++);
3306     }
3307
3308   /* Fish for a name that is not in use.  */
3309   /* (should check against all internal vars?)  */
3310   while (find_trace_state_variable (buf))
3311     sprintf (buf, "%s_%d", namebase, try_num++);
3312
3313   /* We have an available name, create the variable.  */
3314   tsv = create_trace_state_variable (buf);
3315   tsv->initial_value = utsv->initial_value;
3316   tsv->builtin = utsv->builtin;
3317
3318   return tsv;
3319 }
3320
3321 /* Given a list of uploaded trace state variables, try to match them
3322    up with existing variables, or create additional ones.  */
3323
3324 void
3325 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3326 {
3327   int ix;
3328   struct uploaded_tsv *utsv;
3329   struct trace_state_variable *tsv;
3330   int highest;
3331
3332   /* Most likely some numbers will have to be reassigned as part of
3333      the merge, so clear them all in anticipation.  */
3334   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3335     tsv->number = 0;
3336
3337   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3338     {
3339       tsv = find_matching_tsv (utsv);
3340       if (tsv)
3341         {
3342           if (info_verbose)
3343             printf_filtered (_("Assuming trace state variable $%s "
3344                                "is same as target's variable %d.\n"),
3345                              tsv->name, utsv->number);
3346         }
3347       else
3348         {
3349           tsv = create_tsv_from_upload (utsv);
3350           if (info_verbose)
3351             printf_filtered (_("Created trace state variable "
3352                                "$%s for target's variable %d.\n"),
3353                              tsv->name, utsv->number);
3354         }
3355       /* Give precedence to numberings that come from the target.  */
3356       if (tsv)
3357         tsv->number = utsv->number;
3358     }
3359
3360   /* Renumber everything that didn't get a target-assigned number.  */
3361   highest = 0;
3362   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3363     if (tsv->number > highest)
3364       highest = tsv->number;
3365
3366   ++highest;
3367   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3368     if (tsv->number == 0)
3369       tsv->number = highest++;
3370
3371   free_uploaded_tsvs (uploaded_tsvs);
3372 }
3373
3374 /* target tfile command */
3375
3376 struct target_ops tfile_ops;
3377
3378 /* Fill in tfile_ops with its defined operations and properties.  */
3379
3380 #define TRACE_HEADER_SIZE 8
3381
3382 char *trace_filename;
3383 int trace_fd = -1;
3384 off_t trace_frames_offset;
3385 off_t cur_offset;
3386 int cur_traceframe_number;
3387 int cur_data_size;
3388 int trace_regblock_size;
3389
3390 static void tfile_interp_line (char *line,
3391                                struct uploaded_tp **utpp,
3392                                struct uploaded_tsv **utsvp);
3393
3394 /* Read SIZE bytes into READBUF from the trace frame, starting at
3395    TRACE_FD's current position.  Note that this call `read'
3396    underneath, hence it advances the file's seek position.  Throws an
3397    error if the `read' syscall fails, or less than SIZE bytes are
3398    read.  */
3399
3400 static void
3401 tfile_read (gdb_byte *readbuf, int size)
3402 {
3403   int gotten;
3404
3405   gotten = read (trace_fd, readbuf, size);
3406   if (gotten < 0)
3407     perror_with_name (trace_filename);
3408   else if (gotten < size)
3409     error (_("Premature end of file while reading trace file"));
3410 }
3411
3412 static void
3413 tfile_open (char *filename, int from_tty)
3414 {
3415   volatile struct gdb_exception ex;
3416   char *temp;
3417   struct cleanup *old_chain;
3418   int flags;
3419   int scratch_chan;
3420   char header[TRACE_HEADER_SIZE];
3421   char linebuf[1000]; /* Should be max remote packet size or so.  */
3422   char byte;
3423   int bytes, i;
3424   struct trace_status *ts;
3425   struct uploaded_tp *uploaded_tps = NULL;
3426   struct uploaded_tsv *uploaded_tsvs = NULL;
3427
3428   target_preopen (from_tty);
3429   if (!filename)
3430     error (_("No trace file specified."));
3431
3432   filename = tilde_expand (filename);
3433   if (!IS_ABSOLUTE_PATH(filename))
3434     {
3435       temp = concat (current_directory, "/", filename, (char *) NULL);
3436       xfree (filename);
3437       filename = temp;
3438     }
3439
3440   old_chain = make_cleanup (xfree, filename);
3441
3442   flags = O_BINARY | O_LARGEFILE;
3443   flags |= O_RDONLY;
3444   scratch_chan = open (filename, flags, 0);
3445   if (scratch_chan < 0)
3446     perror_with_name (filename);
3447
3448   /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
3449
3450   discard_cleanups (old_chain); /* Don't free filename any more.  */
3451   unpush_target (&tfile_ops);
3452
3453   trace_filename = xstrdup (filename);
3454   trace_fd = scratch_chan;
3455
3456   bytes = 0;
3457   /* Read the file header and test for validity.  */
3458   tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3459
3460   bytes += TRACE_HEADER_SIZE;
3461   if (!(header[0] == 0x7f
3462         && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3463     error (_("File is not a valid trace file."));
3464
3465   push_target (&tfile_ops);
3466
3467   trace_regblock_size = 0;
3468   ts = current_trace_status ();
3469   /* We know we're working with a file.  */
3470   ts->from_file = 1;
3471   /* Set defaults in case there is no status line.  */
3472   ts->running_known = 0;
3473   ts->stop_reason = trace_stop_reason_unknown;
3474   ts->traceframe_count = -1;
3475   ts->buffer_free = 0;
3476   ts->disconnected_tracing = 0;
3477   ts->circular_buffer = 0;
3478
3479   cur_traceframe_number = -1;
3480
3481   TRY_CATCH (ex, RETURN_MASK_ALL)
3482     {
3483       /* Read through a section of newline-terminated lines that
3484          define things like tracepoints.  */
3485       i = 0;
3486       while (1)
3487         {
3488           tfile_read (&byte, 1);
3489
3490           ++bytes;
3491           if (byte == '\n')
3492             {
3493               /* Empty line marks end of the definition section.  */
3494               if (i == 0)
3495                 break;
3496               linebuf[i] = '\0';
3497               i = 0;
3498               tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3499             }
3500           else
3501             linebuf[i++] = byte;
3502           if (i >= 1000)
3503             error (_("Excessively long lines in trace file"));
3504         }
3505
3506       /* Record the starting offset of the binary trace data.  */
3507       trace_frames_offset = bytes;
3508
3509       /* If we don't have a blocksize, we can't interpret the
3510          traceframes.  */
3511       if (trace_regblock_size == 0)
3512         error (_("No register block size recorded in trace file"));
3513     }
3514   if (ex.reason < 0)
3515     {
3516       /* Pop the partially set up target.  */
3517       pop_target ();
3518       throw_exception (ex);
3519     }
3520
3521   inferior_appeared (current_inferior (), TFILE_PID);
3522   inferior_ptid = pid_to_ptid (TFILE_PID);
3523   add_thread_silent (inferior_ptid);
3524
3525   if (ts->traceframe_count <= 0)
3526     warning (_("No traceframes present in this file."));
3527
3528   /* Add the file's tracepoints and variables into the current mix.  */
3529
3530   /* Get trace state variables first, they may be checked when parsing
3531      uploaded commands.  */
3532   merge_uploaded_trace_state_variables (&uploaded_tsvs);
3533
3534   merge_uploaded_tracepoints (&uploaded_tps);
3535
3536   post_create_inferior (&tfile_ops, from_tty);
3537 }
3538
3539 /* Interpret the given line from the definitions part of the trace
3540    file.  */
3541
3542 static void
3543 tfile_interp_line (char *line,
3544                    struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3545 {
3546   char *p = line;
3547
3548   if (strncmp (p, "R ", strlen ("R ")) == 0)
3549     {
3550       p += strlen ("R ");
3551       trace_regblock_size = strtol (p, &p, 16);
3552     }
3553   else if (strncmp (p, "status ", strlen ("status ")) == 0)
3554     {
3555       p += strlen ("status ");
3556       parse_trace_status (p, current_trace_status ());
3557     }
3558   else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3559     {
3560       p += strlen ("tp ");
3561       parse_tracepoint_definition (p, utpp);
3562     }
3563   else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3564     {
3565       p += strlen ("tsv ");
3566       parse_tsv_definition (p, utsvp);
3567     }
3568   else
3569     warning (_("Ignoring trace file definition \"%s\""), line);
3570 }
3571
3572 /* Parse the part of trace status syntax that is shared between
3573    the remote protocol and the trace file reader.  */
3574
3575 void
3576 parse_trace_status (char *line, struct trace_status *ts)
3577 {
3578   char *p = line, *p1, *p2, *p_temp;
3579   ULONGEST val;
3580
3581   ts->running_known = 1;
3582   ts->running = (*p++ == '1');
3583   ts->stop_reason = trace_stop_reason_unknown;
3584   xfree (ts->error_desc);
3585   ts->error_desc = NULL;
3586   ts->traceframe_count = -1;
3587   ts->traceframes_created = -1;
3588   ts->buffer_free = -1;
3589   ts->buffer_size = -1;
3590   ts->disconnected_tracing = 0;
3591   ts->circular_buffer = 0;
3592
3593   while (*p++)
3594     {
3595       p1 = strchr (p, ':');
3596       if (p1 == NULL)
3597         error (_("Malformed trace status, at %s\n\
3598 Status line: '%s'\n"), p, line);
3599       if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3600         {
3601           p = unpack_varlen_hex (++p1, &val);
3602           ts->stop_reason = trace_buffer_full;
3603         }
3604       else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3605         {
3606           p = unpack_varlen_hex (++p1, &val);
3607           ts->stop_reason = trace_never_run;
3608         }
3609       else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3610                         p1 - p) == 0)
3611         {
3612           p = unpack_varlen_hex (++p1, &val);
3613           ts->stop_reason = tracepoint_passcount;
3614           ts->stopping_tracepoint = val;
3615         }
3616       else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3617         {
3618           p = unpack_varlen_hex (++p1, &val);
3619           ts->stop_reason = tstop_command;
3620         }
3621       else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3622         {
3623           p = unpack_varlen_hex (++p1, &val);
3624           ts->stop_reason = trace_disconnected;
3625         }
3626       else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3627         {
3628           p2 = strchr (++p1, ':');
3629           if (p2 != p1)
3630             {
3631               int end;
3632
3633               ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3634               end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
3635               ts->error_desc[end] = '\0';
3636             }
3637           else
3638             ts->error_desc = xstrdup ("");
3639
3640           p = unpack_varlen_hex (++p2, &val);
3641           ts->stopping_tracepoint = val;
3642           ts->stop_reason = tracepoint_error;
3643         }
3644       else if (strncmp (p, "tframes", p1 - p) == 0)
3645         {
3646           p = unpack_varlen_hex (++p1, &val);
3647           ts->traceframe_count = val;
3648         }
3649       else if (strncmp (p, "tcreated", p1 - p) == 0)
3650         {
3651           p = unpack_varlen_hex (++p1, &val);
3652           ts->traceframes_created = val;
3653         }
3654       else if (strncmp (p, "tfree", p1 - p) == 0)
3655         {
3656           p = unpack_varlen_hex (++p1, &val);
3657           ts->buffer_free = val;
3658         }
3659       else if (strncmp (p, "tsize", p1 - p) == 0)
3660         {
3661           p = unpack_varlen_hex (++p1, &val);
3662           ts->buffer_size = val;
3663         }
3664       else if (strncmp (p, "disconn", p1 - p) == 0)
3665         {
3666           p = unpack_varlen_hex (++p1, &val);
3667           ts->disconnected_tracing = val;
3668         }
3669       else if (strncmp (p, "circular", p1 - p) == 0)
3670         {
3671           p = unpack_varlen_hex (++p1, &val);
3672           ts->circular_buffer = val;
3673         }
3674       else
3675         {
3676           /* Silently skip unknown optional info.  */
3677           p_temp = strchr (p1 + 1, ';');
3678           if (p_temp)
3679             p = p_temp;
3680           else
3681             /* Must be at the end.  */
3682             break;
3683         }
3684     }
3685 }
3686
3687 /* Given a line of text defining a part of a tracepoint, parse it into
3688    an "uploaded tracepoint".  */
3689
3690 void
3691 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3692 {
3693   char *p;
3694   char piece;
3695   ULONGEST num, addr, step, pass, orig_size, xlen, start;
3696   int enabled, end;
3697   enum bptype type;
3698   char *cond, *srctype, *buf;
3699   struct uploaded_tp *utp = NULL;
3700
3701   p = line;
3702   /* Both tracepoint and action definitions start with the same number
3703      and address sequence.  */
3704   piece = *p++;
3705   p = unpack_varlen_hex (p, &num);
3706   p++;  /* skip a colon */
3707   p = unpack_varlen_hex (p, &addr);
3708   p++;  /* skip a colon */
3709   if (piece == 'T')
3710     {
3711       enabled = (*p++ == 'E');
3712       p++;  /* skip a colon */
3713       p = unpack_varlen_hex (p, &step);
3714       p++;  /* skip a colon */
3715       p = unpack_varlen_hex (p, &pass);
3716       type = bp_tracepoint;
3717       cond = NULL;
3718       /* Thumb through optional fields.  */
3719       while (*p == ':')
3720         {
3721           p++;  /* skip a colon */
3722           if (*p == 'F')
3723             {
3724               type = bp_fast_tracepoint;
3725               p++;
3726               p = unpack_varlen_hex (p, &orig_size);
3727             }
3728           else if (*p == 'S')
3729             {
3730               type = bp_static_tracepoint;
3731               p++;
3732             }
3733           else if (*p == 'X')
3734             {
3735               p++;
3736               p = unpack_varlen_hex (p, &xlen);
3737               p++;  /* skip a comma */
3738               cond = (char *) xmalloc (2 * xlen + 1);
3739               strncpy (cond, p, 2 * xlen);
3740               cond[2 * xlen] = '\0';
3741               p += 2 * xlen;
3742             }
3743           else
3744             warning (_("Unrecognized char '%c' in tracepoint "
3745                        "definition, skipping rest"), *p);
3746         }
3747       utp = get_uploaded_tp (num, addr, utpp);
3748       utp->type = type;
3749       utp->enabled = enabled;
3750       utp->step = step;
3751       utp->pass = pass;
3752       utp->cond = cond;
3753     }
3754   else if (piece == 'A')
3755     {
3756       utp = get_uploaded_tp (num, addr, utpp);
3757       VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3758     }
3759   else if (piece == 'S')
3760     {
3761       utp = get_uploaded_tp (num, addr, utpp);
3762       VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3763     }
3764   else if (piece == 'Z')
3765     {
3766       /* Parse a chunk of source form definition.  */
3767       utp = get_uploaded_tp (num, addr, utpp);
3768       srctype = p;
3769       p = strchr (p, ':');
3770       p++;  /* skip a colon */
3771       p = unpack_varlen_hex (p, &start);
3772       p++;  /* skip a colon */
3773       p = unpack_varlen_hex (p, &xlen);
3774       p++;  /* skip a colon */
3775
3776       buf = alloca (strlen (line));
3777
3778       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3779       buf[end] = '\0';
3780
3781       if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3782         utp->at_string = xstrdup (buf);
3783       else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3784         utp->cond_string = xstrdup (buf);
3785       else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3786         VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3787     }
3788   else
3789     {
3790       /* Don't error out, the target might be sending us optional
3791          info that we don't care about.  */
3792       warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3793     }
3794 }
3795
3796 /* Convert a textual description of a trace state variable into an
3797    uploaded object.  */
3798
3799 void
3800 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3801 {
3802   char *p, *buf;
3803   ULONGEST num, initval, builtin;
3804   int end;
3805   struct uploaded_tsv *utsv = NULL;
3806
3807   buf = alloca (strlen (line));
3808
3809   p = line;
3810   p = unpack_varlen_hex (p, &num);
3811   p++; /* skip a colon */
3812   p = unpack_varlen_hex (p, &initval);
3813   p++; /* skip a colon */
3814   p = unpack_varlen_hex (p, &builtin);
3815   p++; /* skip a colon */
3816   end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3817   buf[end] = '\0';
3818
3819   utsv = get_uploaded_tsv (num, utsvp);
3820   utsv->initial_value = initval;
3821   utsv->builtin = builtin;
3822   utsv->name = xstrdup (buf);
3823 }
3824
3825 /* Close the trace file and generally clean up.  */
3826
3827 static void
3828 tfile_close (int quitting)
3829 {
3830   int pid;
3831
3832   if (trace_fd < 0)
3833     return;
3834
3835   pid = ptid_get_pid (inferior_ptid);
3836   inferior_ptid = null_ptid;    /* Avoid confusion from thread stuff.  */
3837   exit_inferior_silent (pid);
3838
3839   close (trace_fd);
3840   trace_fd = -1;
3841   xfree (trace_filename);
3842   trace_filename = NULL;
3843 }
3844
3845 static void
3846 tfile_files_info (struct target_ops *t)
3847 {
3848   /* (it would be useful to mention the name of the file).  */
3849   printf_filtered ("Looking at a trace file.\n");
3850 }
3851
3852 /* The trace status for a file is that tracing can never be run.  */
3853
3854 static int
3855 tfile_get_trace_status (struct trace_status *ts)
3856 {
3857   /* Other bits of trace status were collected as part of opening the
3858      trace files, so nothing to do here.  */
3859
3860   return -1;
3861 }
3862
3863 /* Given the position of a traceframe in the file, figure out what
3864    address the frame was collected at.  This would normally be the
3865    value of a collected PC register, but if not available, we
3866    improvise.  */
3867
3868 static ULONGEST
3869 tfile_get_traceframe_address (off_t tframe_offset)
3870 {
3871   ULONGEST addr = 0;
3872   short tpnum;
3873   struct tracepoint *tp;
3874   off_t saved_offset = cur_offset;
3875
3876   /* FIXME dig pc out of collected registers.  */
3877
3878   /* Fall back to using tracepoint address.  */
3879   lseek (trace_fd, tframe_offset, SEEK_SET);
3880   tfile_read ((gdb_byte *) &tpnum, 2);
3881   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3882                                           gdbarch_byte_order
3883                                               (target_gdbarch));
3884
3885   tp = get_tracepoint_by_number_on_target (tpnum);
3886   /* FIXME this is a poor heuristic if multiple locations.  */
3887   if (tp && tp->base.loc)
3888     addr = tp->base.loc->address;
3889
3890   /* Restore our seek position.  */
3891   cur_offset = saved_offset;
3892   lseek (trace_fd, cur_offset, SEEK_SET);
3893   return addr;
3894 }
3895
3896 /* Make tfile's selected traceframe match GDB's selected
3897    traceframe.  */
3898
3899 static void
3900 set_tfile_traceframe (void)
3901 {
3902   int newnum;
3903
3904   if (cur_traceframe_number == get_traceframe_number ())
3905     return;
3906
3907   /* Avoid recursion, tfile_trace_find calls us again.  */
3908   cur_traceframe_number = get_traceframe_number ();
3909
3910   newnum = target_trace_find (tfind_number,
3911                               get_traceframe_number (), 0, 0, NULL);
3912
3913   /* Should not happen.  If it does, all bets are off.  */
3914   if (newnum != get_traceframe_number ())
3915     warning (_("could not set tfile's traceframe"));
3916 }
3917
3918 /* Given a type of search and some parameters, scan the collection of
3919    traceframes in the file looking for a match.  When found, return
3920    both the traceframe and tracepoint number, otherwise -1 for
3921    each.  */
3922
3923 static int
3924 tfile_trace_find (enum trace_find_type type, int num,
3925                   ULONGEST addr1, ULONGEST addr2, int *tpp)
3926 {
3927   short tpnum;
3928   int tfnum = 0, found = 0;
3929   unsigned int data_size;
3930   struct tracepoint *tp;
3931   off_t offset, tframe_offset;
3932   ULONGEST tfaddr;
3933
3934   /* Lookups other than by absolute frame number depend on the current
3935      trace selected, so make sure it is correct on the tfile end
3936      first.  */
3937   if (type != tfind_number)
3938     set_tfile_traceframe ();
3939   else if (num == -1)
3940     {
3941       if (tpp)
3942         *tpp = -1;
3943       return -1;
3944     }
3945
3946   lseek (trace_fd, trace_frames_offset, SEEK_SET);
3947   offset = trace_frames_offset;
3948   while (1)
3949     {
3950       tframe_offset = offset;
3951       tfile_read ((gdb_byte *) &tpnum, 2);
3952       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3953                                               gdbarch_byte_order
3954                                                   (target_gdbarch));
3955       offset += 2;
3956       if (tpnum == 0)
3957         break;
3958       tfile_read ((gdb_byte *) &data_size, 4);
3959       data_size = (unsigned int) extract_unsigned_integer
3960                                      ((gdb_byte *) &data_size, 4,
3961                                       gdbarch_byte_order (target_gdbarch));
3962       offset += 4;
3963       switch (type)
3964         {
3965         case tfind_number:
3966           if (tfnum == num)
3967             found = 1;
3968           break;
3969         case tfind_pc:
3970           tfaddr = tfile_get_traceframe_address (tframe_offset);
3971           if (tfaddr == addr1)
3972             found = 1;
3973           break;
3974         case tfind_tp:
3975           tp = get_tracepoint (num);
3976           if (tp && tpnum == tp->number_on_target)
3977             found = 1;
3978           break;
3979         case tfind_range:
3980           tfaddr = tfile_get_traceframe_address (tframe_offset);
3981           if (addr1 <= tfaddr && tfaddr <= addr2)
3982             found = 1;
3983           break;
3984         case tfind_outside:
3985           tfaddr = tfile_get_traceframe_address (tframe_offset);
3986           if (!(addr1 <= tfaddr && tfaddr <= addr2))
3987             found = 1;
3988           break;
3989         default:
3990           internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3991         }
3992       if (found)
3993         {
3994           if (tpp)
3995             *tpp = tpnum;
3996           cur_offset = offset;
3997           cur_data_size = data_size;
3998           cur_traceframe_number = tfnum;
3999           return tfnum;
4000         }
4001       /* Skip past the traceframe's data.  */
4002       lseek (trace_fd, data_size, SEEK_CUR);
4003       offset += data_size;
4004       /* Update our own count of traceframes.  */
4005       ++tfnum;
4006     }
4007   /* Did not find what we were looking for.  */
4008   if (tpp)
4009     *tpp = -1;
4010   return -1;
4011 }
4012
4013 /* Prototype of the callback passed to tframe_walk_blocks.  */
4014 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4015
4016 /* Callback for traceframe_walk_blocks, used to find a given block
4017    type in a traceframe.  */
4018
4019 static int
4020 match_blocktype (char blocktype, void *data)
4021 {
4022   char *wantedp = data;
4023
4024   if (*wantedp == blocktype)
4025     return 1;
4026
4027   return 0;
4028 }
4029
4030 /* Walk over all traceframe block starting at POS offset from
4031    CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4032    unmodified.  If CALLBACK returns true, this returns the position in
4033    the traceframe where the block is found, relative to the start of
4034    the traceframe (cur_offset).  Returns -1 if no callback call
4035    returned true, indicating that all blocks have been walked.  */
4036
4037 static int
4038 traceframe_walk_blocks (walk_blocks_callback_func callback,
4039                         int pos, void *data)
4040 {
4041   /* Iterate through a traceframe's blocks, looking for a block of the
4042      requested type.  */
4043
4044   lseek (trace_fd, cur_offset + pos, SEEK_SET);
4045   while (pos < cur_data_size)
4046     {
4047       unsigned short mlen;
4048       char block_type;
4049
4050       tfile_read (&block_type, 1);
4051
4052       ++pos;
4053
4054       if ((*callback) (block_type, data))
4055         return pos;
4056
4057       switch (block_type)
4058         {
4059         case 'R':
4060           lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4061           pos += trace_regblock_size;
4062           break;
4063         case 'M':
4064           lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4065           tfile_read ((gdb_byte *) &mlen, 2);
4066           mlen = (unsigned short)
4067                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4068                                           gdbarch_byte_order
4069                                               (target_gdbarch));
4070           lseek (trace_fd, mlen, SEEK_CUR);
4071           pos += (8 + 2 + mlen);
4072           break;
4073         case 'V':
4074           lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4075           pos += (4 + 8);
4076           break;
4077         default:
4078           error (_("Unknown block type '%c' (0x%x) in trace frame"),
4079                  block_type, block_type);
4080           break;
4081         }
4082     }
4083
4084   return -1;
4085 }
4086
4087 /* Convenience wrapper around traceframe_walk_blocks.  Looks for the
4088    position offset of a block of type TYPE_WANTED in the current trace
4089    frame, starting at POS.  Returns -1 if no such block was found.  */
4090
4091 static int
4092 traceframe_find_block_type (char type_wanted, int pos)
4093 {
4094   return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4095 }
4096
4097 /* Look for a block of saved registers in the traceframe, and get the
4098    requested register from it.  */
4099
4100 static void
4101 tfile_fetch_registers (struct target_ops *ops,
4102                        struct regcache *regcache, int regno)
4103 {
4104   struct gdbarch *gdbarch = get_regcache_arch (regcache);
4105   char block_type;
4106   int pos, offset, regn, regsize, pc_regno;
4107   unsigned short mlen;
4108   char *regs;
4109
4110   /* An uninitialized reg size says we're not going to be
4111      successful at getting register blocks.  */
4112   if (!trace_regblock_size)
4113     return;
4114
4115   set_tfile_traceframe ();
4116
4117   regs = alloca (trace_regblock_size);
4118
4119   if (traceframe_find_block_type ('R', 0) >= 0)
4120     {
4121       tfile_read (regs, trace_regblock_size);
4122
4123       /* Assume the block is laid out in GDB register number order,
4124          each register with the size that it has in GDB.  */
4125       offset = 0;
4126       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4127         {
4128           regsize = register_size (gdbarch, regn);
4129           /* Make sure we stay within block bounds.  */
4130           if (offset + regsize >= trace_regblock_size)
4131             break;
4132           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4133             {
4134               if (regno == regn)
4135                 {
4136                   regcache_raw_supply (regcache, regno, regs + offset);
4137                   break;
4138                 }
4139               else if (regno == -1)
4140                 {
4141                   regcache_raw_supply (regcache, regn, regs + offset);
4142                 }
4143             }
4144           offset += regsize;
4145         }
4146       return;
4147     }
4148
4149   /* We get here if no register data has been found.  Mark registers
4150      as unavailable.  */
4151   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4152     regcache_raw_supply (regcache, regn, NULL);
4153
4154   /* We can often usefully guess that the PC is going to be the same
4155      as the address of the tracepoint.  */
4156   pc_regno = gdbarch_pc_regnum (gdbarch);
4157   if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4158     {
4159       struct tracepoint *tp = get_tracepoint (tracepoint_number);
4160
4161       if (tp && tp->base.loc)
4162         {
4163           /* But don't try to guess if tracepoint is multi-location...  */
4164           if (tp->base.loc->next)
4165             {
4166               warning (_("Tracepoint %d has multiple "
4167                          "locations, cannot infer $pc"),
4168                        tp->base.number);
4169               return;
4170             }
4171           /* ... or does while-stepping.  */
4172           if (tp->step_count > 0)
4173             {
4174               warning (_("Tracepoint %d does while-stepping, "
4175                          "cannot infer $pc"),
4176                        tp->base.number);
4177               return;
4178             }
4179
4180           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4181                                   gdbarch_byte_order (gdbarch),
4182                                   tp->base.loc->address);
4183           regcache_raw_supply (regcache, pc_regno, regs);
4184         }
4185     }
4186 }
4187
4188 static LONGEST
4189 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4190                     const char *annex, gdb_byte *readbuf,
4191                     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4192 {
4193   /* We're only doing regular memory for now.  */
4194   if (object != TARGET_OBJECT_MEMORY)
4195     return -1;
4196
4197   if (readbuf == NULL)
4198     error (_("tfile_xfer_partial: trace file is read-only"));
4199
4200   set_tfile_traceframe ();
4201
4202  if (traceframe_number != -1)
4203     {
4204       int pos = 0;
4205
4206       /* Iterate through the traceframe's blocks, looking for
4207          memory.  */
4208       while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4209         {
4210           ULONGEST maddr, amt;
4211           unsigned short mlen;
4212           enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
4213
4214           tfile_read ((gdb_byte *) &maddr, 8);
4215           maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4216                                             byte_order);
4217           tfile_read ((gdb_byte *) &mlen, 2);
4218           mlen = (unsigned short)
4219             extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4220
4221           /* If the block includes the first part of the desired
4222              range, return as much it has; GDB will re-request the
4223              remainder, which might be in a different block of this
4224              trace frame.  */
4225           if (maddr <= offset && offset < (maddr + mlen))
4226             {
4227               amt = (maddr + mlen) - offset;
4228               if (amt > len)
4229                 amt = len;
4230
4231               tfile_read (readbuf, amt);
4232               return amt;
4233             }
4234
4235           /* Skip over this block.  */
4236           pos += (8 + 2 + mlen);
4237         }
4238     }
4239
4240   /* It's unduly pedantic to refuse to look at the executable for
4241      read-only pieces; so do the equivalent of readonly regions aka
4242      QTro packet.  */
4243   /* FIXME account for relocation at some point.  */
4244   if (exec_bfd)
4245     {
4246       asection *s;
4247       bfd_size_type size;
4248       bfd_vma vma;
4249
4250       for (s = exec_bfd->sections; s; s = s->next)
4251         {
4252           if ((s->flags & SEC_LOAD) == 0
4253               || (s->flags & SEC_READONLY) == 0)
4254             continue;
4255
4256           vma = s->vma;
4257           size = bfd_get_section_size (s);
4258           if (vma <= offset && offset < (vma + size))
4259             {
4260               ULONGEST amt;
4261
4262               amt = (vma + size) - offset;
4263               if (amt > len)
4264                 amt = len;
4265
4266               amt = bfd_get_section_contents (exec_bfd, s,
4267                                               readbuf, offset - vma, amt);
4268               return amt;
4269             }
4270         }
4271     }
4272
4273   /* Indicate failure to find the requested memory block.  */
4274   return -1;
4275 }
4276
4277 /* Iterate through the blocks of a trace frame, looking for a 'V'
4278    block with a matching tsv number.  */
4279
4280 static int
4281 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4282 {
4283   int pos;
4284
4285   set_tfile_traceframe ();
4286
4287   pos = 0;
4288   while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4289     {
4290       int vnum;
4291
4292       tfile_read ((gdb_byte *) &vnum, 4);
4293       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4294                                            gdbarch_byte_order
4295                                            (target_gdbarch));
4296       if (tsvnum == vnum)
4297         {
4298           tfile_read ((gdb_byte *) val, 8);
4299           *val = extract_signed_integer ((gdb_byte *) val, 8,
4300                                          gdbarch_byte_order
4301                                          (target_gdbarch));
4302           return 1;
4303         }
4304       pos += (4 + 8);
4305     }
4306
4307   /* Didn't find anything.  */
4308   return 0;
4309 }
4310
4311 static int
4312 tfile_has_all_memory (struct target_ops *ops)
4313 {
4314   return 1;
4315 }
4316
4317 static int
4318 tfile_has_memory (struct target_ops *ops)
4319 {
4320   return 1;
4321 }
4322
4323 static int
4324 tfile_has_stack (struct target_ops *ops)
4325 {
4326   return traceframe_number != -1;
4327 }
4328
4329 static int
4330 tfile_has_registers (struct target_ops *ops)
4331 {
4332   return traceframe_number != -1;
4333 }
4334
4335 static int
4336 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4337 {
4338   return 1;
4339 }
4340
4341 /* Callback for traceframe_walk_blocks.  Builds a traceframe_info
4342    object for the tfile target's current traceframe.  */
4343
4344 static int
4345 build_traceframe_info (char blocktype, void *data)
4346 {
4347   struct traceframe_info *info = data;
4348
4349   switch (blocktype)
4350     {
4351     case 'M':
4352       {
4353         struct mem_range *r;
4354         ULONGEST maddr;
4355         unsigned short mlen;
4356
4357         tfile_read ((gdb_byte *) &maddr, 8);
4358         tfile_read ((gdb_byte *) &mlen, 2);
4359
4360         r = VEC_safe_push (mem_range_s, info->memory, NULL);
4361
4362         r->start = maddr;
4363         r->length = mlen;
4364         break;
4365       }
4366     case 'V':
4367     case 'R':
4368     case 'S':
4369       {
4370         break;
4371       }
4372     default:
4373       warning (_("Unhandled trace block type (%d) '%c ' "
4374                  "while building trace frame info."),
4375                blocktype, blocktype);
4376       break;
4377     }
4378
4379   return 0;
4380 }
4381
4382 static struct traceframe_info *
4383 tfile_traceframe_info (void)
4384 {
4385   struct traceframe_info *info = XCNEW (struct traceframe_info);
4386
4387   traceframe_walk_blocks (build_traceframe_info, 0, info);
4388   return info;
4389 }
4390
4391 static void
4392 init_tfile_ops (void)
4393 {
4394   tfile_ops.to_shortname = "tfile";
4395   tfile_ops.to_longname = "Local trace dump file";
4396   tfile_ops.to_doc
4397     = "Use a trace file as a target.  Specify the filename of the trace file.";
4398   tfile_ops.to_open = tfile_open;
4399   tfile_ops.to_close = tfile_close;
4400   tfile_ops.to_fetch_registers = tfile_fetch_registers;
4401   tfile_ops.to_xfer_partial = tfile_xfer_partial;
4402   tfile_ops.to_files_info = tfile_files_info;
4403   tfile_ops.to_get_trace_status = tfile_get_trace_status;
4404   tfile_ops.to_trace_find = tfile_trace_find;
4405   tfile_ops.to_get_trace_state_variable_value
4406     = tfile_get_trace_state_variable_value;
4407   tfile_ops.to_stratum = process_stratum;
4408   tfile_ops.to_has_all_memory = tfile_has_all_memory;
4409   tfile_ops.to_has_memory = tfile_has_memory;
4410   tfile_ops.to_has_stack = tfile_has_stack;
4411   tfile_ops.to_has_registers = tfile_has_registers;
4412   tfile_ops.to_traceframe_info = tfile_traceframe_info;
4413   tfile_ops.to_thread_alive = tfile_thread_alive;
4414   tfile_ops.to_magic = OPS_MAGIC;
4415 }
4416
4417 /* Given a line of text defining a static tracepoint marker, parse it
4418    into a "static tracepoint marker" object.  Throws an error is
4419    parsing fails.  If PP is non-null, it points to one past the end of
4420    the parsed marker definition.  */
4421
4422 void
4423 parse_static_tracepoint_marker_definition (char *line, char **pp,
4424                                            struct static_tracepoint_marker *marker)
4425 {
4426   char *p, *endp;
4427   ULONGEST addr;
4428   int end;
4429
4430   p = line;
4431   p = unpack_varlen_hex (p, &addr);
4432   p++;  /* skip a colon */
4433
4434   marker->gdbarch = target_gdbarch;
4435   marker->address = (CORE_ADDR) addr;
4436
4437   endp = strchr (p, ':');
4438   if (endp == NULL)
4439     error (_("bad marker definition: %s"), line);
4440
4441   marker->str_id = xmalloc (endp - p + 1);
4442   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4443   marker->str_id[end] = '\0';
4444
4445   p += 2 * end;
4446   p++;  /* skip a colon */
4447
4448   marker->extra = xmalloc (strlen (p) + 1);
4449   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4450   marker->extra[end] = '\0';
4451
4452   if (pp)
4453     *pp = p;
4454 }
4455
4456 /* Release a static tracepoint marker's contents.  Note that the
4457    object itself isn't released here.  There objects are usually on
4458    the stack.  */
4459
4460 void
4461 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4462 {
4463   xfree (marker->str_id);
4464   marker->str_id = NULL;
4465 }
4466
4467 /* Print MARKER to gdb_stdout.  */
4468
4469 static void
4470 print_one_static_tracepoint_marker (int count,
4471                                     struct static_tracepoint_marker *marker)
4472 {
4473   struct command_line *l;
4474   struct symbol *sym;
4475
4476   char wrap_indent[80];
4477   char extra_field_indent[80];
4478   struct ui_out *uiout = current_uiout;
4479   struct ui_stream *stb = ui_out_stream_new (uiout);
4480   struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4481   struct cleanup *bkpt_chain;
4482   VEC(breakpoint_p) *tracepoints;
4483
4484   struct symtab_and_line sal;
4485
4486   init_sal (&sal);
4487
4488   sal.pc = marker->address;
4489
4490   tracepoints = static_tracepoints_here (marker->address);
4491
4492   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4493
4494   /* A counter field to help readability.  This is not a stable
4495      identifier!  */
4496   ui_out_field_int (uiout, "count", count);
4497
4498   ui_out_field_string (uiout, "marker-id", marker->str_id);
4499
4500   ui_out_field_fmt (uiout, "enabled", "%c",
4501                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4502   ui_out_spaces (uiout, 2);
4503
4504   strcpy (wrap_indent, "                                   ");
4505
4506   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4507     strcat (wrap_indent, "           ");
4508   else
4509     strcat (wrap_indent, "                   ");
4510
4511   strcpy (extra_field_indent, "         ");
4512
4513   ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4514
4515   sal = find_pc_line (marker->address, 0);
4516   sym = find_pc_sect_function (marker->address, NULL);
4517   if (sym)
4518     {
4519       ui_out_text (uiout, "in ");
4520       ui_out_field_string (uiout, "func",
4521                            SYMBOL_PRINT_NAME (sym));
4522       ui_out_wrap_hint (uiout, wrap_indent);
4523       ui_out_text (uiout, " at ");
4524     }
4525   else
4526     ui_out_field_skip (uiout, "func");
4527
4528   if (sal.symtab != NULL)
4529     {
4530       ui_out_field_string (uiout, "file", sal.symtab->filename);
4531       ui_out_text (uiout, ":");
4532
4533       if (ui_out_is_mi_like_p (uiout))
4534         {
4535           char *fullname = symtab_to_fullname (sal.symtab);
4536
4537           if (fullname)
4538             ui_out_field_string (uiout, "fullname", fullname);
4539         }
4540       else
4541         ui_out_field_skip (uiout, "fullname");
4542
4543       ui_out_field_int (uiout, "line", sal.line);
4544     }
4545   else
4546     {
4547       ui_out_field_skip (uiout, "fullname");
4548       ui_out_field_skip (uiout, "line");
4549     }
4550
4551   ui_out_text (uiout, "\n");
4552   ui_out_text (uiout, extra_field_indent);
4553   ui_out_text (uiout, _("Data: \""));
4554   ui_out_field_string (uiout, "extra-data", marker->extra);
4555   ui_out_text (uiout, "\"\n");
4556
4557   if (!VEC_empty (breakpoint_p, tracepoints))
4558     {
4559       struct cleanup *cleanup_chain;
4560       int ix;
4561       struct breakpoint *b;
4562
4563       cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4564                                                            "tracepoints-at");
4565
4566       ui_out_text (uiout, extra_field_indent);
4567       ui_out_text (uiout, _("Probed by static tracepoints: "));
4568       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4569         {
4570           if (ix > 0)
4571             ui_out_text (uiout, ", ");
4572           ui_out_text (uiout, "#");
4573           ui_out_field_int (uiout, "tracepoint-id", b->number);
4574         }
4575
4576       do_cleanups (cleanup_chain);
4577
4578       if (ui_out_is_mi_like_p (uiout))
4579         ui_out_field_int (uiout, "number-of-tracepoints",
4580                           VEC_length(breakpoint_p, tracepoints));
4581       else
4582         ui_out_text (uiout, "\n");
4583     }
4584   VEC_free (breakpoint_p, tracepoints);
4585
4586   do_cleanups (bkpt_chain);
4587   do_cleanups (old_chain);
4588 }
4589
4590 static void
4591 info_static_tracepoint_markers_command (char *arg, int from_tty)
4592 {
4593   VEC(static_tracepoint_marker_p) *markers;
4594   struct cleanup *old_chain;
4595   struct static_tracepoint_marker *marker;
4596   struct ui_out *uiout = current_uiout;
4597   int i;
4598
4599   old_chain
4600     = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4601                                            "StaticTracepointMarkersTable");
4602
4603   ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4604
4605   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4606
4607   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4608   if (gdbarch_addr_bit (target_gdbarch) <= 32)
4609     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4610   else
4611     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4612   ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4613
4614   ui_out_table_body (uiout);
4615
4616   markers = target_static_tracepoint_markers_by_strid (NULL);
4617   make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4618
4619   for (i = 0;
4620        VEC_iterate (static_tracepoint_marker_p,
4621                     markers, i, marker);
4622        i++)
4623     {
4624       print_one_static_tracepoint_marker (i + 1, marker);
4625       release_static_tracepoint_marker (marker);
4626     }
4627
4628   do_cleanups (old_chain);
4629 }
4630
4631 /* The $_sdata convenience variable is a bit special.  We don't know
4632    for sure type of the value until we actually have a chance to fetch
4633    the data --- the size of the object depends on what has been
4634    collected.  We solve this by making $_sdata be an internalvar that
4635    creates a new value on access.  */
4636
4637 /* Return a new value with the correct type for the sdata object of
4638    the current trace frame.  Return a void value if there's no object
4639    available.  */
4640
4641 static struct value *
4642 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4643 {
4644   LONGEST size;
4645   gdb_byte *buf;
4646
4647   /* We need to read the whole object before we know its size.  */
4648   size = target_read_alloc (&current_target,
4649                             TARGET_OBJECT_STATIC_TRACE_DATA,
4650                             NULL, &buf);
4651   if (size >= 0)
4652     {
4653       struct value *v;
4654       struct type *type;
4655
4656       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4657                                size);
4658       v = allocate_value (type);
4659       memcpy (value_contents_raw (v), buf, size);
4660       xfree (buf);
4661       return v;
4662     }
4663   else
4664     return allocate_value (builtin_type (gdbarch)->builtin_void);
4665 }
4666
4667 #if !defined(HAVE_LIBEXPAT)
4668
4669 struct traceframe_info *
4670 parse_traceframe_info (const char *tframe_info)
4671 {
4672   static int have_warned;
4673
4674   if (!have_warned)
4675     {
4676       have_warned = 1;
4677       warning (_("Can not parse XML trace frame info; XML support "
4678                  "was disabled at compile time"));
4679     }
4680
4681   return NULL;
4682 }
4683
4684 #else /* HAVE_LIBEXPAT */
4685
4686 #include "xml-support.h"
4687
4688 /* Handle the start of a <memory> element.  */
4689
4690 static void
4691 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4692                               const struct gdb_xml_element *element,
4693                               void *user_data, VEC(gdb_xml_value_s) *attributes)
4694 {
4695   struct traceframe_info *info = user_data;
4696   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4697   ULONGEST *start_p, *length_p;
4698
4699   start_p = xml_find_attribute (attributes, "start")->value;
4700   length_p = xml_find_attribute (attributes, "length")->value;
4701
4702   r->start = *start_p;
4703   r->length = *length_p;
4704 }
4705
4706 /* Discard the constructed trace frame info (if an error occurs).  */
4707
4708 static void
4709 free_result (void *p)
4710 {
4711   struct traceframe_info *result = p;
4712
4713   free_traceframe_info (result);
4714 }
4715
4716 /* The allowed elements and attributes for an XML memory map.  */
4717
4718 static const struct gdb_xml_attribute memory_attributes[] = {
4719   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4720   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4721   { NULL, GDB_XML_AF_NONE, NULL, NULL }
4722 };
4723
4724 static const struct gdb_xml_element traceframe_info_children[] = {
4725   { "memory", memory_attributes, NULL,
4726     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4727     traceframe_info_start_memory, NULL },
4728   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4729 };
4730
4731 static const struct gdb_xml_element traceframe_info_elements[] = {
4732   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4733     NULL, NULL },
4734   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4735 };
4736
4737 /* Parse a traceframe-info XML document.  */
4738
4739 struct traceframe_info *
4740 parse_traceframe_info (const char *tframe_info)
4741 {
4742   struct traceframe_info *result;
4743   struct cleanup *back_to;
4744
4745   result = XCNEW (struct traceframe_info);
4746   back_to = make_cleanup (free_result, result);
4747
4748   if (gdb_xml_parse_quick (_("trace frame info"),
4749                            "traceframe-info.dtd", traceframe_info_elements,
4750                            tframe_info, result) == 0)
4751     {
4752       /* Parsed successfully, keep the result.  */
4753       discard_cleanups (back_to);
4754
4755       return result;
4756     }
4757
4758   do_cleanups (back_to);
4759   return NULL;
4760 }
4761
4762 #endif /* HAVE_LIBEXPAT */
4763
4764 /* Returns the traceframe_info object for the current traceframe.
4765    This is where we avoid re-fetching the object from the target if we
4766    already have it cached.  */
4767
4768 struct traceframe_info *
4769 get_traceframe_info (void)
4770 {
4771   if (traceframe_info == NULL)
4772     traceframe_info = target_traceframe_info ();
4773
4774   return traceframe_info;
4775 }
4776
4777 /* If the target supports the query, return in RESULT the set of
4778    collected memory in the current traceframe, found within the LEN
4779    bytes range starting at MEMADDR.  Returns true if the target
4780    supports the query, otherwise returns false, and RESULT is left
4781    undefined.  */
4782
4783 int
4784 traceframe_available_memory (VEC(mem_range_s) **result,
4785                              CORE_ADDR memaddr, ULONGEST len)
4786 {
4787   struct traceframe_info *info = get_traceframe_info ();
4788
4789   if (info != NULL)
4790     {
4791       struct mem_range *r;
4792       int i;
4793
4794       *result = NULL;
4795
4796       for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4797         if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4798           {
4799             ULONGEST lo1, hi1, lo2, hi2;
4800             struct mem_range *nr;
4801
4802             lo1 = memaddr;
4803             hi1 = memaddr + len;
4804
4805             lo2 = r->start;
4806             hi2 = r->start + r->length;
4807
4808             nr = VEC_safe_push (mem_range_s, *result, NULL);
4809
4810             nr->start = max (lo1, lo2);
4811             nr->length = min (hi1, hi2) - nr->start;
4812           }
4813
4814       normalize_mem_ranges (*result);
4815       return 1;
4816     }
4817
4818   return 0;
4819 }
4820
4821 /* module initialization */
4822 void
4823 _initialize_tracepoint (void)
4824 {
4825   struct cmd_list_element *c;
4826
4827   /* Explicitly create without lookup, since that tries to create a
4828      value with a void typed value, and when we get here, gdbarch
4829      isn't initialized yet.  At this point, we're quite sure there
4830      isn't another convenience variable of the same name.  */
4831   create_internalvar_type_lazy ("_sdata", sdata_make_value);
4832
4833   traceframe_number = -1;
4834   tracepoint_number = -1;
4835
4836   if (tracepoint_list.list == NULL)
4837     {
4838       tracepoint_list.listsize = 128;
4839       tracepoint_list.list = xmalloc
4840         (tracepoint_list.listsize * sizeof (struct memrange));
4841     }
4842   if (tracepoint_list.aexpr_list == NULL)
4843     {
4844       tracepoint_list.aexpr_listsize = 128;
4845       tracepoint_list.aexpr_list = xmalloc
4846         (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4847     }
4848
4849   if (stepping_list.list == NULL)
4850     {
4851       stepping_list.listsize = 128;
4852       stepping_list.list = xmalloc
4853         (stepping_list.listsize * sizeof (struct memrange));
4854     }
4855
4856   if (stepping_list.aexpr_list == NULL)
4857     {
4858       stepping_list.aexpr_listsize = 128;
4859       stepping_list.aexpr_list = xmalloc
4860         (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4861     }
4862
4863   add_info ("scope", scope_info,
4864             _("List the variables local to a scope"));
4865
4866   add_cmd ("tracepoints", class_trace, NULL,
4867            _("Tracing of program execution without stopping the program."),
4868            &cmdlist);
4869
4870   add_com ("tdump", class_trace, trace_dump_command,
4871            _("Print everything collected at the current tracepoint."));
4872
4873   add_com ("tsave", class_trace, trace_save_command, _("\
4874 Save the trace data to a file.\n\
4875 Use the '-r' option to direct the target to save directly to the file,\n\
4876 using its own filesystem."));
4877
4878   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4879 Define a trace state variable.\n\
4880 Argument is a $-prefixed name, optionally followed\n\
4881 by '=' and an expression that sets the initial value\n\
4882 at the start of tracing."));
4883   set_cmd_completer (c, expression_completer);
4884
4885   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4886 Delete one or more trace state variables.\n\
4887 Arguments are the names of the variables to delete.\n\
4888 If no arguments are supplied, delete all variables."), &deletelist);
4889   /* FIXME add a trace variable completer.  */
4890
4891   add_info ("tvariables", tvariables_info, _("\
4892 Status of trace state variables and their values.\n\
4893 "));
4894
4895   add_info ("static-tracepoint-markers",
4896             info_static_tracepoint_markers_command, _("\
4897 List target static tracepoints markers.\n\
4898 "));
4899
4900   add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4901 Select a trace frame;\n\
4902 No argument means forward by one frame; '-' means backward by one frame."),
4903                   &tfindlist, "tfind ", 1, &cmdlist);
4904
4905   add_cmd ("outside", class_trace, trace_find_outside_command, _("\
4906 Select a trace frame whose PC is outside the given range (exclusive).\n\
4907 Usage: tfind outside addr1, addr2"),
4908            &tfindlist);
4909
4910   add_cmd ("range", class_trace, trace_find_range_command, _("\
4911 Select a trace frame whose PC is in the given range (inclusive).\n\
4912 Usage: tfind range addr1,addr2"),
4913            &tfindlist);
4914
4915   add_cmd ("line", class_trace, trace_find_line_command, _("\
4916 Select a trace frame by source line.\n\
4917 Argument can be a line number (with optional source file),\n\
4918 a function name, or '*' followed by an address.\n\
4919 Default argument is 'the next source line that was traced'."),
4920            &tfindlist);
4921
4922   add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4923 Select a trace frame by tracepoint number.\n\
4924 Default is the tracepoint for the current trace frame."),
4925            &tfindlist);
4926
4927   add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4928 Select a trace frame by PC.\n\
4929 Default is the current PC, or the PC of the current trace frame."),
4930            &tfindlist);
4931
4932   add_cmd ("end", class_trace, trace_find_end_command, _("\
4933 Synonym for 'none'.\n\
4934 De-select any trace frame and resume 'live' debugging."),
4935            &tfindlist);
4936
4937   add_cmd ("none", class_trace, trace_find_none_command,
4938            _("De-select any trace frame and resume 'live' debugging."),
4939            &tfindlist);
4940
4941   add_cmd ("start", class_trace, trace_find_start_command,
4942            _("Select the first trace frame in the trace buffer."),
4943            &tfindlist);
4944
4945   add_com ("tstatus", class_trace, trace_status_command,
4946            _("Display the status of the current trace data collection."));
4947
4948   add_com ("tstop", class_trace, trace_stop_command,
4949            _("Stop trace data collection."));
4950
4951   add_com ("tstart", class_trace, trace_start_command,
4952            _("Start trace data collection."));
4953
4954   add_com ("end", class_trace, end_actions_pseudocommand, _("\
4955 Ends a list of commands or actions.\n\
4956 Several GDB commands allow you to enter a list of commands or actions.\n\
4957 Entering \"end\" on a line by itself is the normal way to terminate\n\
4958 such a list.\n\n\
4959 Note: the \"end\" command cannot be used at the gdb prompt."));
4960
4961   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4962 Specify single-stepping behavior at a tracepoint.\n\
4963 Argument is number of instructions to trace in single-step mode\n\
4964 following the tracepoint.  This command is normally followed by\n\
4965 one or more \"collect\" commands, to specify what to collect\n\
4966 while single-stepping.\n\n\
4967 Note: this command can only be used in a tracepoint \"actions\" list."));
4968
4969   add_com_alias ("ws", "while-stepping", class_alias, 0);
4970   add_com_alias ("stepping", "while-stepping", class_alias, 0);
4971
4972   add_com ("collect", class_trace, collect_pseudocommand, _("\
4973 Specify one or more data items to be collected at a tracepoint.\n\
4974 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
4975 collect all data (variables, registers) referenced by that expression.\n\
4976 Also accepts the following special arguments:\n\
4977     $regs   -- all registers.\n\
4978     $args   -- all function arguments.\n\
4979     $locals -- all variables local to the block/function scope.\n\
4980     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4981 Note: this command can only be used in a tracepoint \"actions\" list."));
4982
4983   add_com ("teval", class_trace, teval_pseudocommand, _("\
4984 Specify one or more expressions to be evaluated at a tracepoint.\n\
4985 Accepts a comma-separated list of (one or more) expressions.\n\
4986 The result of each evaluation will be discarded.\n\
4987 Note: this command can only be used in a tracepoint \"actions\" list."));
4988
4989   add_com ("actions", class_trace, trace_actions_command, _("\
4990 Specify the actions to be taken at a tracepoint.\n\
4991 Tracepoint actions may include collecting of specified data,\n\
4992 single-stepping, or enabling/disabling other tracepoints,\n\
4993 depending on target's capabilities."));
4994
4995   default_collect = xstrdup ("");
4996   add_setshow_string_cmd ("default-collect", class_trace,
4997                           &default_collect, _("\
4998 Set the list of expressions to collect by default"), _("\
4999 Show the list of expressions to collect by default"), NULL,
5000                           NULL, NULL,
5001                           &setlist, &showlist);
5002
5003   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5004                            &disconnected_tracing, _("\
5005 Set whether tracing continues after GDB disconnects."), _("\
5006 Show whether tracing continues after GDB disconnects."), _("\
5007 Use this to continue a tracing run even if GDB disconnects\n\
5008 or detaches from the target.  You can reconnect later and look at\n\
5009 trace data collected in the meantime."),
5010                            set_disconnected_tracing,
5011                            NULL,
5012                            &setlist,
5013                            &showlist);
5014
5015   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5016                            &circular_trace_buffer, _("\
5017 Set target's use of circular trace buffer."), _("\
5018 Show target's use of circular trace buffer."), _("\
5019 Use this to make the trace buffer into a circular buffer,\n\
5020 which will discard traceframes (oldest first) instead of filling\n\
5021 up and stopping the trace run."),
5022                            set_circular_trace_buffer,
5023                            NULL,
5024                            &setlist,
5025                            &showlist);
5026
5027   init_tfile_ops ();
5028
5029   add_target (&tfile_ops);
5030 }