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