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