Add target_ops argument to to_trace_find
[platform/upstream/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 target_ops *self,
4797                              struct breakpoint *tp, struct uploaded_tp *utp)
4798 {
4799   /* Other bits of trace status were collected as part of opening the
4800      trace files, so nothing to do here.  */
4801 }
4802
4803 /* Given the position of a traceframe in the file, figure out what
4804    address the frame was collected at.  This would normally be the
4805    value of a collected PC register, but if not available, we
4806    improvise.  */
4807
4808 static CORE_ADDR
4809 tfile_get_traceframe_address (off_t tframe_offset)
4810 {
4811   CORE_ADDR addr = 0;
4812   short tpnum;
4813   struct tracepoint *tp;
4814   off_t saved_offset = cur_offset;
4815
4816   /* FIXME dig pc out of collected registers.  */
4817
4818   /* Fall back to using tracepoint address.  */
4819   lseek (trace_fd, tframe_offset, SEEK_SET);
4820   tfile_read ((gdb_byte *) &tpnum, 2);
4821   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4822                                           gdbarch_byte_order
4823                                               (target_gdbarch ()));
4824
4825   tp = get_tracepoint_by_number_on_target (tpnum);
4826   /* FIXME this is a poor heuristic if multiple locations.  */
4827   if (tp && tp->base.loc)
4828     addr = tp->base.loc->address;
4829
4830   /* Restore our seek position.  */
4831   cur_offset = saved_offset;
4832   lseek (trace_fd, cur_offset, SEEK_SET);
4833   return addr;
4834 }
4835
4836 /* Given a type of search and some parameters, scan the collection of
4837    traceframes in the file looking for a match.  When found, return
4838    both the traceframe and tracepoint number, otherwise -1 for
4839    each.  */
4840
4841 static int
4842 tfile_trace_find (struct target_ops *self, enum trace_find_type type, int num,
4843                   CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
4844 {
4845   short tpnum;
4846   int tfnum = 0, found = 0;
4847   unsigned int data_size;
4848   struct tracepoint *tp;
4849   off_t offset, tframe_offset;
4850   CORE_ADDR tfaddr;
4851
4852   if (num == -1)
4853     {
4854       if (tpp)
4855         *tpp = -1;
4856       return -1;
4857     }
4858
4859   lseek (trace_fd, trace_frames_offset, SEEK_SET);
4860   offset = trace_frames_offset;
4861   while (1)
4862     {
4863       tframe_offset = offset;
4864       tfile_read ((gdb_byte *) &tpnum, 2);
4865       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4866                                               gdbarch_byte_order
4867                                                   (target_gdbarch ()));
4868       offset += 2;
4869       if (tpnum == 0)
4870         break;
4871       tfile_read ((gdb_byte *) &data_size, 4);
4872       data_size = (unsigned int) extract_unsigned_integer
4873                                      ((gdb_byte *) &data_size, 4,
4874                                       gdbarch_byte_order (target_gdbarch ()));
4875       offset += 4;
4876
4877       if (type == tfind_number)
4878         {
4879           /* Looking for a specific trace frame.  */
4880           if (tfnum == num)
4881             found = 1;
4882         }
4883       else
4884         {
4885           /* Start from the _next_ trace frame.  */
4886           if (tfnum > traceframe_number)
4887             {
4888               switch (type)
4889                 {
4890                 case tfind_pc:
4891                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4892                   if (tfaddr == addr1)
4893                     found = 1;
4894                   break;
4895                 case tfind_tp:
4896                   tp = get_tracepoint (num);
4897                   if (tp && tpnum == tp->number_on_target)
4898                     found = 1;
4899                   break;
4900                 case tfind_range:
4901                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4902                   if (addr1 <= tfaddr && tfaddr <= addr2)
4903                     found = 1;
4904                   break;
4905                 case tfind_outside:
4906                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4907                   if (!(addr1 <= tfaddr && tfaddr <= addr2))
4908                     found = 1;
4909                   break;
4910                 default:
4911                   internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4912                 }
4913             }
4914         }
4915
4916       if (found)
4917         {
4918           if (tpp)
4919             *tpp = tpnum;
4920           cur_offset = offset;
4921           cur_data_size = data_size;
4922
4923           return tfnum;
4924         }
4925       /* Skip past the traceframe's data.  */
4926       lseek (trace_fd, data_size, SEEK_CUR);
4927       offset += data_size;
4928       /* Update our own count of traceframes.  */
4929       ++tfnum;
4930     }
4931   /* Did not find what we were looking for.  */
4932   if (tpp)
4933     *tpp = -1;
4934   return -1;
4935 }
4936
4937 /* Prototype of the callback passed to tframe_walk_blocks.  */
4938 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4939
4940 /* Callback for traceframe_walk_blocks, used to find a given block
4941    type in a traceframe.  */
4942
4943 static int
4944 match_blocktype (char blocktype, void *data)
4945 {
4946   char *wantedp = data;
4947
4948   if (*wantedp == blocktype)
4949     return 1;
4950
4951   return 0;
4952 }
4953
4954 /* Walk over all traceframe block starting at POS offset from
4955    CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4956    unmodified.  If CALLBACK returns true, this returns the position in
4957    the traceframe where the block is found, relative to the start of
4958    the traceframe (cur_offset).  Returns -1 if no callback call
4959    returned true, indicating that all blocks have been walked.  */
4960
4961 static int
4962 traceframe_walk_blocks (walk_blocks_callback_func callback,
4963                         int pos, void *data)
4964 {
4965   /* Iterate through a traceframe's blocks, looking for a block of the
4966      requested type.  */
4967
4968   lseek (trace_fd, cur_offset + pos, SEEK_SET);
4969   while (pos < cur_data_size)
4970     {
4971       unsigned short mlen;
4972       char block_type;
4973
4974       tfile_read ((gdb_byte *) &block_type, 1);
4975
4976       ++pos;
4977
4978       if ((*callback) (block_type, data))
4979         return pos;
4980
4981       switch (block_type)
4982         {
4983         case 'R':
4984           lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4985           pos += trace_regblock_size;
4986           break;
4987         case 'M':
4988           lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4989           tfile_read ((gdb_byte *) &mlen, 2);
4990           mlen = (unsigned short)
4991                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4992                                           gdbarch_byte_order
4993                                               (target_gdbarch ()));
4994           lseek (trace_fd, mlen, SEEK_CUR);
4995           pos += (8 + 2 + mlen);
4996           break;
4997         case 'V':
4998           lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4999           pos += (4 + 8);
5000           break;
5001         default:
5002           error (_("Unknown block type '%c' (0x%x) in trace frame"),
5003                  block_type, block_type);
5004           break;
5005         }
5006     }
5007
5008   return -1;
5009 }
5010
5011 /* Convenience wrapper around traceframe_walk_blocks.  Looks for the
5012    position offset of a block of type TYPE_WANTED in the current trace
5013    frame, starting at POS.  Returns -1 if no such block was found.  */
5014
5015 static int
5016 traceframe_find_block_type (char type_wanted, int pos)
5017 {
5018   return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
5019 }
5020
5021 /* Look for a block of saved registers in the traceframe, and get the
5022    requested register from it.  */
5023
5024 static void
5025 tfile_fetch_registers (struct target_ops *ops,
5026                        struct regcache *regcache, int regno)
5027 {
5028   struct gdbarch *gdbarch = get_regcache_arch (regcache);
5029   int offset, regn, regsize, pc_regno;
5030   gdb_byte *regs;
5031
5032   /* An uninitialized reg size says we're not going to be
5033      successful at getting register blocks.  */
5034   if (!trace_regblock_size)
5035     return;
5036
5037   regs = alloca (trace_regblock_size);
5038
5039   if (traceframe_find_block_type ('R', 0) >= 0)
5040     {
5041       tfile_read (regs, trace_regblock_size);
5042
5043       /* Assume the block is laid out in GDB register number order,
5044          each register with the size that it has in GDB.  */
5045       offset = 0;
5046       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
5047         {
5048           regsize = register_size (gdbarch, regn);
5049           /* Make sure we stay within block bounds.  */
5050           if (offset + regsize >= trace_regblock_size)
5051             break;
5052           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
5053             {
5054               if (regno == regn)
5055                 {
5056                   regcache_raw_supply (regcache, regno, regs + offset);
5057                   break;
5058                 }
5059               else if (regno == -1)
5060                 {
5061                   regcache_raw_supply (regcache, regn, regs + offset);
5062                 }
5063             }
5064           offset += regsize;
5065         }
5066       return;
5067     }
5068
5069   /* We get here if no register data has been found.  Mark registers
5070      as unavailable.  */
5071   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
5072     regcache_raw_supply (regcache, regn, NULL);
5073
5074   /* We can often usefully guess that the PC is going to be the same
5075      as the address of the tracepoint.  */
5076   pc_regno = gdbarch_pc_regnum (gdbarch);
5077
5078   /* XXX This guessing code below only works if the PC register isn't
5079      a pseudo-register.  The value of a pseudo-register isn't stored
5080      in the (non-readonly) regcache -- instead it's recomputed
5081      (probably from some other cached raw register) whenever the
5082      register is read.  This guesswork should probably move to some
5083      higher layer.  */
5084   if (pc_regno < 0 || pc_regno >= gdbarch_num_regs (gdbarch))
5085     return;
5086
5087   if (regno == -1 || regno == pc_regno)
5088     {
5089       struct tracepoint *tp = get_tracepoint (tracepoint_number);
5090
5091       if (tp && tp->base.loc)
5092         {
5093           /* But don't try to guess if tracepoint is multi-location...  */
5094           if (tp->base.loc->next)
5095             {
5096               warning (_("Tracepoint %d has multiple "
5097                          "locations, cannot infer $pc"),
5098                        tp->base.number);
5099               return;
5100             }
5101           /* ... or does while-stepping.  */
5102           if (tp->step_count > 0)
5103             {
5104               warning (_("Tracepoint %d does while-stepping, "
5105                          "cannot infer $pc"),
5106                        tp->base.number);
5107               return;
5108             }
5109
5110           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
5111                                   gdbarch_byte_order (gdbarch),
5112                                   tp->base.loc->address);
5113           regcache_raw_supply (regcache, pc_regno, regs);
5114         }
5115     }
5116 }
5117
5118 static enum target_xfer_status
5119 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
5120                     const char *annex, gdb_byte *readbuf,
5121                     const gdb_byte *writebuf, ULONGEST offset, ULONGEST len,
5122                     ULONGEST *xfered_len)
5123 {
5124   /* We're only doing regular memory for now.  */
5125   if (object != TARGET_OBJECT_MEMORY)
5126     return TARGET_XFER_E_IO;
5127
5128   if (readbuf == NULL)
5129     error (_("tfile_xfer_partial: trace file is read-only"));
5130
5131  if (traceframe_number != -1)
5132     {
5133       int pos = 0;
5134
5135       /* Iterate through the traceframe's blocks, looking for
5136          memory.  */
5137       while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
5138         {
5139           ULONGEST maddr, amt;
5140           unsigned short mlen;
5141           enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
5142
5143           tfile_read ((gdb_byte *) &maddr, 8);
5144           maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5145                                             byte_order);
5146           tfile_read ((gdb_byte *) &mlen, 2);
5147           mlen = (unsigned short)
5148             extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
5149
5150           /* If the block includes the first part of the desired
5151              range, return as much it has; GDB will re-request the
5152              remainder, which might be in a different block of this
5153              trace frame.  */
5154           if (maddr <= offset && offset < (maddr + mlen))
5155             {
5156               amt = (maddr + mlen) - offset;
5157               if (amt > len)
5158                 amt = len;
5159
5160               if (maddr != offset)
5161                 lseek (trace_fd, offset - maddr, SEEK_CUR);
5162               tfile_read (readbuf, amt);
5163               *xfered_len = amt;
5164               return TARGET_XFER_OK;
5165             }
5166
5167           /* Skip over this block.  */
5168           pos += (8 + 2 + mlen);
5169         }
5170     }
5171
5172   /* It's unduly pedantic to refuse to look at the executable for
5173      read-only pieces; so do the equivalent of readonly regions aka
5174      QTro packet.  */
5175   /* FIXME account for relocation at some point.  */
5176   if (exec_bfd)
5177     {
5178       asection *s;
5179       bfd_size_type size;
5180       bfd_vma vma;
5181
5182       for (s = exec_bfd->sections; s; s = s->next)
5183         {
5184           if ((s->flags & SEC_LOAD) == 0
5185               || (s->flags & SEC_READONLY) == 0)
5186             continue;
5187
5188           vma = s->vma;
5189           size = bfd_get_section_size (s);
5190           if (vma <= offset && offset < (vma + size))
5191             {
5192               ULONGEST amt;
5193
5194               amt = (vma + size) - offset;
5195               if (amt > len)
5196                 amt = len;
5197
5198               *xfered_len = bfd_get_section_contents (exec_bfd, s,
5199                                                       readbuf, offset - vma, amt);
5200               return TARGET_XFER_OK;
5201             }
5202         }
5203     }
5204
5205   /* Indicate failure to find the requested memory block.  */
5206   return TARGET_XFER_E_IO;
5207 }
5208
5209 /* Iterate through the blocks of a trace frame, looking for a 'V'
5210    block with a matching tsv number.  */
5211
5212 static int
5213 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
5214 {
5215   int pos;
5216   int found = 0;
5217
5218   /* Iterate over blocks in current frame and find the last 'V'
5219      block in which tsv number is TSVNUM.  In one trace frame, there
5220      may be multiple 'V' blocks created for a given trace variable,
5221      and the last matched 'V' block contains the updated value.  */
5222   pos = 0;
5223   while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
5224     {
5225       int vnum;
5226
5227       tfile_read ((gdb_byte *) &vnum, 4);
5228       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
5229                                            gdbarch_byte_order
5230                                            (target_gdbarch ()));
5231       if (tsvnum == vnum)
5232         {
5233           tfile_read ((gdb_byte *) val, 8);
5234           *val = extract_signed_integer ((gdb_byte *) val, 8,
5235                                          gdbarch_byte_order
5236                                          (target_gdbarch ()));
5237           found = 1;
5238         }
5239       pos += (4 + 8);
5240     }
5241
5242   return found;
5243 }
5244
5245 static int
5246 tfile_has_all_memory (struct target_ops *ops)
5247 {
5248   return 1;
5249 }
5250
5251 static int
5252 tfile_has_memory (struct target_ops *ops)
5253 {
5254   return 1;
5255 }
5256
5257 static int
5258 tfile_has_stack (struct target_ops *ops)
5259 {
5260   return traceframe_number != -1;
5261 }
5262
5263 static int
5264 tfile_has_registers (struct target_ops *ops)
5265 {
5266   return traceframe_number != -1;
5267 }
5268
5269 static int
5270 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
5271 {
5272   return 1;
5273 }
5274
5275 /* Callback for traceframe_walk_blocks.  Builds a traceframe_info
5276    object for the tfile target's current traceframe.  */
5277
5278 static int
5279 build_traceframe_info (char blocktype, void *data)
5280 {
5281   struct traceframe_info *info = data;
5282
5283   switch (blocktype)
5284     {
5285     case 'M':
5286       {
5287         struct mem_range *r;
5288         ULONGEST maddr;
5289         unsigned short mlen;
5290
5291         tfile_read ((gdb_byte *) &maddr, 8);
5292         maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5293                                           gdbarch_byte_order
5294                                           (target_gdbarch ()));
5295         tfile_read ((gdb_byte *) &mlen, 2);
5296         mlen = (unsigned short)
5297                 extract_unsigned_integer ((gdb_byte *) &mlen,
5298                                           2, gdbarch_byte_order
5299                                           (target_gdbarch ()));
5300
5301         r = VEC_safe_push (mem_range_s, info->memory, NULL);
5302
5303         r->start = maddr;
5304         r->length = mlen;
5305         break;
5306       }
5307     case 'V':
5308       {
5309         int vnum;
5310
5311         tfile_read ((gdb_byte *) &vnum, 4);
5312         VEC_safe_push (int, info->tvars, vnum);
5313       }
5314     case 'R':
5315     case 'S':
5316       {
5317         break;
5318       }
5319     default:
5320       warning (_("Unhandled trace block type (%d) '%c ' "
5321                  "while building trace frame info."),
5322                blocktype, blocktype);
5323       break;
5324     }
5325
5326   return 0;
5327 }
5328
5329 static struct traceframe_info *
5330 tfile_traceframe_info (void)
5331 {
5332   struct traceframe_info *info = XCNEW (struct traceframe_info);
5333
5334   traceframe_walk_blocks (build_traceframe_info, 0, info);
5335   return info;
5336 }
5337
5338 static void
5339 init_tfile_ops (void)
5340 {
5341   tfile_ops.to_shortname = "tfile";
5342   tfile_ops.to_longname = "Local trace dump file";
5343   tfile_ops.to_doc
5344     = "Use a trace file as a target.  Specify the filename of the trace file.";
5345   tfile_ops.to_open = tfile_open;
5346   tfile_ops.to_close = tfile_close;
5347   tfile_ops.to_fetch_registers = tfile_fetch_registers;
5348   tfile_ops.to_xfer_partial = tfile_xfer_partial;
5349   tfile_ops.to_files_info = tfile_files_info;
5350   tfile_ops.to_get_trace_status = tfile_get_trace_status;
5351   tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
5352   tfile_ops.to_trace_find = tfile_trace_find;
5353   tfile_ops.to_get_trace_state_variable_value
5354     = tfile_get_trace_state_variable_value;
5355   tfile_ops.to_stratum = process_stratum;
5356   tfile_ops.to_has_all_memory = tfile_has_all_memory;
5357   tfile_ops.to_has_memory = tfile_has_memory;
5358   tfile_ops.to_has_stack = tfile_has_stack;
5359   tfile_ops.to_has_registers = tfile_has_registers;
5360   tfile_ops.to_traceframe_info = tfile_traceframe_info;
5361   tfile_ops.to_thread_alive = tfile_thread_alive;
5362   tfile_ops.to_magic = OPS_MAGIC;
5363 }
5364
5365 void
5366 free_current_marker (void *arg)
5367 {
5368   struct static_tracepoint_marker **marker_p = arg;
5369
5370   if (*marker_p != NULL)
5371     {
5372       release_static_tracepoint_marker (*marker_p);
5373       xfree (*marker_p);
5374     }
5375   else
5376     *marker_p = NULL;
5377 }
5378
5379 /* Given a line of text defining a static tracepoint marker, parse it
5380    into a "static tracepoint marker" object.  Throws an error is
5381    parsing fails.  If PP is non-null, it points to one past the end of
5382    the parsed marker definition.  */
5383
5384 void
5385 parse_static_tracepoint_marker_definition (char *line, char **pp,
5386                                            struct static_tracepoint_marker *marker)
5387 {
5388   char *p, *endp;
5389   ULONGEST addr;
5390   int end;
5391
5392   p = line;
5393   p = unpack_varlen_hex (p, &addr);
5394   p++;  /* skip a colon */
5395
5396   marker->gdbarch = target_gdbarch ();
5397   marker->address = (CORE_ADDR) addr;
5398
5399   endp = strchr (p, ':');
5400   if (endp == NULL)
5401     error (_("bad marker definition: %s"), line);
5402
5403   marker->str_id = xmalloc (endp - p + 1);
5404   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
5405   marker->str_id[end] = '\0';
5406
5407   p += 2 * end;
5408   p++;  /* skip a colon */
5409
5410   marker->extra = xmalloc (strlen (p) + 1);
5411   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
5412   marker->extra[end] = '\0';
5413
5414   if (pp)
5415     *pp = p;
5416 }
5417
5418 /* Release a static tracepoint marker's contents.  Note that the
5419    object itself isn't released here.  There objects are usually on
5420    the stack.  */
5421
5422 void
5423 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
5424 {
5425   xfree (marker->str_id);
5426   marker->str_id = NULL;
5427 }
5428
5429 /* Print MARKER to gdb_stdout.  */
5430
5431 static void
5432 print_one_static_tracepoint_marker (int count,
5433                                     struct static_tracepoint_marker *marker)
5434 {
5435   struct command_line *l;
5436   struct symbol *sym;
5437
5438   char wrap_indent[80];
5439   char extra_field_indent[80];
5440   struct ui_out *uiout = current_uiout;
5441   struct cleanup *bkpt_chain;
5442   VEC(breakpoint_p) *tracepoints;
5443
5444   struct symtab_and_line sal;
5445
5446   init_sal (&sal);
5447
5448   sal.pc = marker->address;
5449
5450   tracepoints = static_tracepoints_here (marker->address);
5451
5452   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
5453
5454   /* A counter field to help readability.  This is not a stable
5455      identifier!  */
5456   ui_out_field_int (uiout, "count", count);
5457
5458   ui_out_field_string (uiout, "marker-id", marker->str_id);
5459
5460   ui_out_field_fmt (uiout, "enabled", "%c",
5461                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
5462   ui_out_spaces (uiout, 2);
5463
5464   strcpy (wrap_indent, "                                   ");
5465
5466   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
5467     strcat (wrap_indent, "           ");
5468   else
5469     strcat (wrap_indent, "                   ");
5470
5471   strcpy (extra_field_indent, "         ");
5472
5473   ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
5474
5475   sal = find_pc_line (marker->address, 0);
5476   sym = find_pc_sect_function (marker->address, NULL);
5477   if (sym)
5478     {
5479       ui_out_text (uiout, "in ");
5480       ui_out_field_string (uiout, "func",
5481                            SYMBOL_PRINT_NAME (sym));
5482       ui_out_wrap_hint (uiout, wrap_indent);
5483       ui_out_text (uiout, " at ");
5484     }
5485   else
5486     ui_out_field_skip (uiout, "func");
5487
5488   if (sal.symtab != NULL)
5489     {
5490       ui_out_field_string (uiout, "file",
5491                            symtab_to_filename_for_display (sal.symtab));
5492       ui_out_text (uiout, ":");
5493
5494       if (ui_out_is_mi_like_p (uiout))
5495         {
5496           const char *fullname = symtab_to_fullname (sal.symtab);
5497
5498           ui_out_field_string (uiout, "fullname", fullname);
5499         }
5500       else
5501         ui_out_field_skip (uiout, "fullname");
5502
5503       ui_out_field_int (uiout, "line", sal.line);
5504     }
5505   else
5506     {
5507       ui_out_field_skip (uiout, "fullname");
5508       ui_out_field_skip (uiout, "line");
5509     }
5510
5511   ui_out_text (uiout, "\n");
5512   ui_out_text (uiout, extra_field_indent);
5513   ui_out_text (uiout, _("Data: \""));
5514   ui_out_field_string (uiout, "extra-data", marker->extra);
5515   ui_out_text (uiout, "\"\n");
5516
5517   if (!VEC_empty (breakpoint_p, tracepoints))
5518     {
5519       struct cleanup *cleanup_chain;
5520       int ix;
5521       struct breakpoint *b;
5522
5523       cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
5524                                                            "tracepoints-at");
5525
5526       ui_out_text (uiout, extra_field_indent);
5527       ui_out_text (uiout, _("Probed by static tracepoints: "));
5528       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
5529         {
5530           if (ix > 0)
5531             ui_out_text (uiout, ", ");
5532           ui_out_text (uiout, "#");
5533           ui_out_field_int (uiout, "tracepoint-id", b->number);
5534         }
5535
5536       do_cleanups (cleanup_chain);
5537
5538       if (ui_out_is_mi_like_p (uiout))
5539         ui_out_field_int (uiout, "number-of-tracepoints",
5540                           VEC_length(breakpoint_p, tracepoints));
5541       else
5542         ui_out_text (uiout, "\n");
5543     }
5544   VEC_free (breakpoint_p, tracepoints);
5545
5546   do_cleanups (bkpt_chain);
5547 }
5548
5549 static void
5550 info_static_tracepoint_markers_command (char *arg, int from_tty)
5551 {
5552   VEC(static_tracepoint_marker_p) *markers;
5553   struct cleanup *old_chain;
5554   struct static_tracepoint_marker *marker;
5555   struct ui_out *uiout = current_uiout;
5556   int i;
5557
5558   /* We don't have to check target_can_use_agent and agent's capability on
5559      static tracepoint here, in order to be compatible with older GDBserver.
5560      We don't check USE_AGENT is true or not, because static tracepoints
5561      don't work without in-process agent, so we don't bother users to type
5562      `set agent on' when to use static tracepoint.  */
5563
5564   old_chain
5565     = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
5566                                            "StaticTracepointMarkersTable");
5567
5568   ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
5569
5570   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
5571
5572   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
5573   if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
5574     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
5575   else
5576     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
5577   ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
5578
5579   ui_out_table_body (uiout);
5580
5581   markers = target_static_tracepoint_markers_by_strid (NULL);
5582   make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
5583
5584   for (i = 0;
5585        VEC_iterate (static_tracepoint_marker_p,
5586                     markers, i, marker);
5587        i++)
5588     {
5589       print_one_static_tracepoint_marker (i + 1, marker);
5590       release_static_tracepoint_marker (marker);
5591     }
5592
5593   do_cleanups (old_chain);
5594 }
5595
5596 /* The $_sdata convenience variable is a bit special.  We don't know
5597    for sure type of the value until we actually have a chance to fetch
5598    the data --- the size of the object depends on what has been
5599    collected.  We solve this by making $_sdata be an internalvar that
5600    creates a new value on access.  */
5601
5602 /* Return a new value with the correct type for the sdata object of
5603    the current trace frame.  Return a void value if there's no object
5604    available.  */
5605
5606 static struct value *
5607 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
5608                   void *ignore)
5609 {
5610   LONGEST size;
5611   gdb_byte *buf;
5612
5613   /* We need to read the whole object before we know its size.  */
5614   size = target_read_alloc (&current_target,
5615                             TARGET_OBJECT_STATIC_TRACE_DATA,
5616                             NULL, &buf);
5617   if (size >= 0)
5618     {
5619       struct value *v;
5620       struct type *type;
5621
5622       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
5623                                size);
5624       v = allocate_value (type);
5625       memcpy (value_contents_raw (v), buf, size);
5626       xfree (buf);
5627       return v;
5628     }
5629   else
5630     return allocate_value (builtin_type (gdbarch)->builtin_void);
5631 }
5632
5633 #if !defined(HAVE_LIBEXPAT)
5634
5635 struct traceframe_info *
5636 parse_traceframe_info (const char *tframe_info)
5637 {
5638   static int have_warned;
5639
5640   if (!have_warned)
5641     {
5642       have_warned = 1;
5643       warning (_("Can not parse XML trace frame info; XML support "
5644                  "was disabled at compile time"));
5645     }
5646
5647   return NULL;
5648 }
5649
5650 #else /* HAVE_LIBEXPAT */
5651
5652 #include "xml-support.h"
5653
5654 /* Handle the start of a <memory> element.  */
5655
5656 static void
5657 traceframe_info_start_memory (struct gdb_xml_parser *parser,
5658                               const struct gdb_xml_element *element,
5659                               void *user_data, VEC(gdb_xml_value_s) *attributes)
5660 {
5661   struct traceframe_info *info = user_data;
5662   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
5663   ULONGEST *start_p, *length_p;
5664
5665   start_p = xml_find_attribute (attributes, "start")->value;
5666   length_p = xml_find_attribute (attributes, "length")->value;
5667
5668   r->start = *start_p;
5669   r->length = *length_p;
5670 }
5671
5672 /* Handle the start of a <tvar> element.  */
5673
5674 static void
5675 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
5676                              const struct gdb_xml_element *element,
5677                              void *user_data,
5678                              VEC(gdb_xml_value_s) *attributes)
5679 {
5680   struct traceframe_info *info = user_data;
5681   const char *id_attrib = xml_find_attribute (attributes, "id")->value;
5682   int id = gdb_xml_parse_ulongest (parser, id_attrib);
5683
5684   VEC_safe_push (int, info->tvars, id);
5685 }
5686
5687 /* Discard the constructed trace frame info (if an error occurs).  */
5688
5689 static void
5690 free_result (void *p)
5691 {
5692   struct traceframe_info *result = p;
5693
5694   free_traceframe_info (result);
5695 }
5696
5697 /* The allowed elements and attributes for an XML memory map.  */
5698
5699 static const struct gdb_xml_attribute memory_attributes[] = {
5700   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5701   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5702   { NULL, GDB_XML_AF_NONE, NULL, NULL }
5703 };
5704
5705 static const struct gdb_xml_attribute tvar_attributes[] = {
5706   { "id", GDB_XML_AF_NONE, NULL, NULL },
5707   { NULL, GDB_XML_AF_NONE, NULL, NULL }
5708 };
5709
5710 static const struct gdb_xml_element traceframe_info_children[] = {
5711   { "memory", memory_attributes, NULL,
5712     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5713     traceframe_info_start_memory, NULL },
5714   { "tvar", tvar_attributes, NULL,
5715     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5716     traceframe_info_start_tvar, NULL },
5717   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5718 };
5719
5720 static const struct gdb_xml_element traceframe_info_elements[] = {
5721   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5722     NULL, NULL },
5723   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5724 };
5725
5726 /* Parse a traceframe-info XML document.  */
5727
5728 struct traceframe_info *
5729 parse_traceframe_info (const char *tframe_info)
5730 {
5731   struct traceframe_info *result;
5732   struct cleanup *back_to;
5733
5734   result = XCNEW (struct traceframe_info);
5735   back_to = make_cleanup (free_result, result);
5736
5737   if (gdb_xml_parse_quick (_("trace frame info"),
5738                            "traceframe-info.dtd", traceframe_info_elements,
5739                            tframe_info, result) == 0)
5740     {
5741       /* Parsed successfully, keep the result.  */
5742       discard_cleanups (back_to);
5743
5744       return result;
5745     }
5746
5747   do_cleanups (back_to);
5748   return NULL;
5749 }
5750
5751 #endif /* HAVE_LIBEXPAT */
5752
5753 /* Returns the traceframe_info object for the current traceframe.
5754    This is where we avoid re-fetching the object from the target if we
5755    already have it cached.  */
5756
5757 struct traceframe_info *
5758 get_traceframe_info (void)
5759 {
5760   if (traceframe_info == NULL)
5761     traceframe_info = target_traceframe_info ();
5762
5763   return traceframe_info;
5764 }
5765
5766 /* If the target supports the query, return in RESULT the set of
5767    collected memory in the current traceframe, found within the LEN
5768    bytes range starting at MEMADDR.  Returns true if the target
5769    supports the query, otherwise returns false, and RESULT is left
5770    undefined.  */
5771
5772 int
5773 traceframe_available_memory (VEC(mem_range_s) **result,
5774                              CORE_ADDR memaddr, ULONGEST len)
5775 {
5776   struct traceframe_info *info = get_traceframe_info ();
5777
5778   if (info != NULL)
5779     {
5780       struct mem_range *r;
5781       int i;
5782
5783       *result = NULL;
5784
5785       for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5786         if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5787           {
5788             ULONGEST lo1, hi1, lo2, hi2;
5789             struct mem_range *nr;
5790
5791             lo1 = memaddr;
5792             hi1 = memaddr + len;
5793
5794             lo2 = r->start;
5795             hi2 = r->start + r->length;
5796
5797             nr = VEC_safe_push (mem_range_s, *result, NULL);
5798
5799             nr->start = max (lo1, lo2);
5800             nr->length = min (hi1, hi2) - nr->start;
5801           }
5802
5803       normalize_mem_ranges (*result);
5804       return 1;
5805     }
5806
5807   return 0;
5808 }
5809
5810 /* Implementation of `sdata' variable.  */
5811
5812 static const struct internalvar_funcs sdata_funcs =
5813 {
5814   sdata_make_value,
5815   NULL,
5816   NULL
5817 };
5818
5819 /* module initialization */
5820 void
5821 _initialize_tracepoint (void)
5822 {
5823   struct cmd_list_element *c;
5824
5825   /* Explicitly create without lookup, since that tries to create a
5826      value with a void typed value, and when we get here, gdbarch
5827      isn't initialized yet.  At this point, we're quite sure there
5828      isn't another convenience variable of the same name.  */
5829   create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
5830
5831   traceframe_number = -1;
5832   tracepoint_number = -1;
5833
5834   add_info ("scope", scope_info,
5835             _("List the variables local to a scope"));
5836
5837   add_cmd ("tracepoints", class_trace, NULL,
5838            _("Tracing of program execution without stopping the program."),
5839            &cmdlist);
5840
5841   add_com ("tdump", class_trace, trace_dump_command,
5842            _("Print everything collected at the current tracepoint."));
5843
5844   add_com ("tsave", class_trace, trace_save_command, _("\
5845 Save the trace data to a file.\n\
5846 Use the '-ctf' option to save the data to CTF format.\n\
5847 Use the '-r' option to direct the target to save directly to the file,\n\
5848 using its own filesystem."));
5849
5850   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5851 Define a trace state variable.\n\
5852 Argument is a $-prefixed name, optionally followed\n\
5853 by '=' and an expression that sets the initial value\n\
5854 at the start of tracing."));
5855   set_cmd_completer (c, expression_completer);
5856
5857   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5858 Delete one or more trace state variables.\n\
5859 Arguments are the names of the variables to delete.\n\
5860 If no arguments are supplied, delete all variables."), &deletelist);
5861   /* FIXME add a trace variable completer.  */
5862
5863   add_info ("tvariables", tvariables_info, _("\
5864 Status of trace state variables and their values.\n\
5865 "));
5866
5867   add_info ("static-tracepoint-markers",
5868             info_static_tracepoint_markers_command, _("\
5869 List target static tracepoints markers.\n\
5870 "));
5871
5872   add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5873 Select a trace frame;\n\
5874 No argument means forward by one frame; '-' means backward by one frame."),
5875                   &tfindlist, "tfind ", 1, &cmdlist);
5876
5877   add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5878 Select a trace frame whose PC is outside the given range (exclusive).\n\
5879 Usage: tfind outside addr1, addr2"),
5880            &tfindlist);
5881
5882   add_cmd ("range", class_trace, trace_find_range_command, _("\
5883 Select a trace frame whose PC is in the given range (inclusive).\n\
5884 Usage: tfind range addr1,addr2"),
5885            &tfindlist);
5886
5887   add_cmd ("line", class_trace, trace_find_line_command, _("\
5888 Select a trace frame by source line.\n\
5889 Argument can be a line number (with optional source file),\n\
5890 a function name, or '*' followed by an address.\n\
5891 Default argument is 'the next source line that was traced'."),
5892            &tfindlist);
5893
5894   add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5895 Select a trace frame by tracepoint number.\n\
5896 Default is the tracepoint for the current trace frame."),
5897            &tfindlist);
5898
5899   add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5900 Select a trace frame by PC.\n\
5901 Default is the current PC, or the PC of the current trace frame."),
5902            &tfindlist);
5903
5904   add_cmd ("end", class_trace, trace_find_end_command, _("\
5905 De-select any trace frame and resume 'live' debugging."),
5906            &tfindlist);
5907
5908   add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
5909
5910   add_cmd ("start", class_trace, trace_find_start_command,
5911            _("Select the first trace frame in the trace buffer."),
5912            &tfindlist);
5913
5914   add_com ("tstatus", class_trace, trace_status_command,
5915            _("Display the status of the current trace data collection."));
5916
5917   add_com ("tstop", class_trace, trace_stop_command, _("\
5918 Stop trace data collection.\n\
5919 Usage: tstop [ <notes> ... ]\n\
5920 Any arguments supplied are recorded with the trace as a stop reason and\n\
5921 reported by tstatus (if the target supports trace notes)."));
5922
5923   add_com ("tstart", class_trace, trace_start_command, _("\
5924 Start trace data collection.\n\
5925 Usage: tstart [ <notes> ... ]\n\
5926 Any arguments supplied are recorded with the trace as a note and\n\
5927 reported by tstatus (if the target supports trace notes)."));
5928
5929   add_com ("end", class_trace, end_actions_pseudocommand, _("\
5930 Ends a list of commands or actions.\n\
5931 Several GDB commands allow you to enter a list of commands or actions.\n\
5932 Entering \"end\" on a line by itself is the normal way to terminate\n\
5933 such a list.\n\n\
5934 Note: the \"end\" command cannot be used at the gdb prompt."));
5935
5936   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5937 Specify single-stepping behavior at a tracepoint.\n\
5938 Argument is number of instructions to trace in single-step mode\n\
5939 following the tracepoint.  This command is normally followed by\n\
5940 one or more \"collect\" commands, to specify what to collect\n\
5941 while single-stepping.\n\n\
5942 Note: this command can only be used in a tracepoint \"actions\" list."));
5943
5944   add_com_alias ("ws", "while-stepping", class_alias, 0);
5945   add_com_alias ("stepping", "while-stepping", class_alias, 0);
5946
5947   add_com ("collect", class_trace, collect_pseudocommand, _("\
5948 Specify one or more data items to be collected at a tracepoint.\n\
5949 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
5950 collect all data (variables, registers) referenced by that expression.\n\
5951 Also accepts the following special arguments:\n\
5952     $regs   -- all registers.\n\
5953     $args   -- all function arguments.\n\
5954     $locals -- all variables local to the block/function scope.\n\
5955     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5956 Note: this command can only be used in a tracepoint \"actions\" list."));
5957
5958   add_com ("teval", class_trace, teval_pseudocommand, _("\
5959 Specify one or more expressions to be evaluated at a tracepoint.\n\
5960 Accepts a comma-separated list of (one or more) expressions.\n\
5961 The result of each evaluation will be discarded.\n\
5962 Note: this command can only be used in a tracepoint \"actions\" list."));
5963
5964   add_com ("actions", class_trace, trace_actions_command, _("\
5965 Specify the actions to be taken at a tracepoint.\n\
5966 Tracepoint actions may include collecting of specified data,\n\
5967 single-stepping, or enabling/disabling other tracepoints,\n\
5968 depending on target's capabilities."));
5969
5970   default_collect = xstrdup ("");
5971   add_setshow_string_cmd ("default-collect", class_trace,
5972                           &default_collect, _("\
5973 Set the list of expressions to collect by default"), _("\
5974 Show the list of expressions to collect by default"), NULL,
5975                           NULL, NULL,
5976                           &setlist, &showlist);
5977
5978   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5979                            &disconnected_tracing, _("\
5980 Set whether tracing continues after GDB disconnects."), _("\
5981 Show whether tracing continues after GDB disconnects."), _("\
5982 Use this to continue a tracing run even if GDB disconnects\n\
5983 or detaches from the target.  You can reconnect later and look at\n\
5984 trace data collected in the meantime."),
5985                            set_disconnected_tracing,
5986                            NULL,
5987                            &setlist,
5988                            &showlist);
5989
5990   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5991                            &circular_trace_buffer, _("\
5992 Set target's use of circular trace buffer."), _("\
5993 Show target's use of circular trace buffer."), _("\
5994 Use this to make the trace buffer into a circular buffer,\n\
5995 which will discard traceframes (oldest first) instead of filling\n\
5996 up and stopping the trace run."),
5997                            set_circular_trace_buffer,
5998                            NULL,
5999                            &setlist,
6000                            &showlist);
6001
6002   add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
6003                                        &trace_buffer_size, _("\
6004 Set requested size of trace buffer."), _("\
6005 Show requested size of trace buffer."), _("\
6006 Use this to choose a size for the trace buffer.  Some targets\n\
6007 may have fixed or limited buffer sizes.  Specifying \"unlimited\" or -1\n\
6008 disables any attempt to set the buffer size and lets the target choose."),
6009                                        set_trace_buffer_size, NULL,
6010                                        &setlist, &showlist);
6011
6012   add_setshow_string_cmd ("trace-user", class_trace,
6013                           &trace_user, _("\
6014 Set the user name to use for current and future trace runs"), _("\
6015 Show the user name to use for current and future trace runs"), NULL,
6016                           set_trace_user, NULL,
6017                           &setlist, &showlist);
6018
6019   add_setshow_string_cmd ("trace-notes", class_trace,
6020                           &trace_notes, _("\
6021 Set notes string to use for current and future trace runs"), _("\
6022 Show the notes string to use for current and future trace runs"), NULL,
6023                           set_trace_notes, NULL,
6024                           &setlist, &showlist);
6025
6026   add_setshow_string_cmd ("trace-stop-notes", class_trace,
6027                           &trace_stop_notes, _("\
6028 Set notes string to use for future tstop commands"), _("\
6029 Show the notes string to use for future tstop commands"), NULL,
6030                           set_trace_stop_notes, NULL,
6031                           &setlist, &showlist);
6032
6033   init_tfile_ops ();
6034
6035   add_target_with_completer (&tfile_ops, filename_completer);
6036 }