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