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