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