gdb/
[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
3069   /* This command only makes sense for the current frame, not the
3070      selected frame.  */
3071   make_cleanup_restore_current_thread ();
3072   select_frame (get_current_frame ());
3073
3074   actions = all_tracepoint_actions_and_cleanup (loc->owner);
3075
3076   trace_dump_actions (actions, 0, stepping_frame, from_tty);
3077
3078   do_cleanups (old_chain);
3079 }
3080
3081 /* Encode a piece of a tracepoint's source-level definition in a form
3082    that is suitable for both protocol and saving in files.  */
3083 /* This version does not do multiple encodes for long strings; it should
3084    return an offset to the next piece to encode.  FIXME  */
3085
3086 extern int
3087 encode_source_string (int tpnum, ULONGEST addr,
3088                       char *srctype, char *src, char *buf, int buf_size)
3089 {
3090   if (80 + strlen (srctype) > buf_size)
3091     error (_("Buffer too small for source encoding"));
3092   sprintf (buf, "%x:%s:%s:%x:%x:",
3093            tpnum, phex_nz (addr, sizeof (addr)),
3094            srctype, 0, (int) strlen (src));
3095   if (strlen (buf) + strlen (src) * 2 >= buf_size)
3096     error (_("Source string too long for buffer"));
3097   bin2hex ((gdb_byte *) src, buf + strlen (buf), 0);
3098   return -1;
3099 }
3100
3101 /* Free trace file writer.  */
3102
3103 static void
3104 trace_file_writer_xfree (void *arg)
3105 {
3106   struct trace_file_writer *writer = arg;
3107
3108   writer->ops->dtor (writer);
3109   xfree (writer);
3110 }
3111
3112 /* TFILE trace writer.  */
3113
3114 struct tfile_trace_file_writer
3115 {
3116   struct trace_file_writer base;
3117
3118   /* File pointer to tfile trace file.  */
3119   FILE *fp;
3120   /* Path name of the tfile trace file.  */
3121   char *pathname;
3122 };
3123
3124 /* This is the implementation of trace_file_write_ops method
3125    target_save.  We just call the generic target
3126    target_save_trace_data to do target-side saving.  */
3127
3128 static int
3129 tfile_target_save (struct trace_file_writer *self,
3130                    const char *filename)
3131 {
3132   int err = target_save_trace_data (filename);
3133
3134   return (err >= 0);
3135 }
3136
3137 /* This is the implementation of trace_file_write_ops method
3138    dtor.  */
3139
3140 static void
3141 tfile_dtor (struct trace_file_writer *self)
3142 {
3143   struct tfile_trace_file_writer *writer
3144     = (struct tfile_trace_file_writer *) self;
3145
3146   xfree (writer->pathname);
3147
3148   if (writer->fp != NULL)
3149     fclose (writer->fp);
3150 }
3151
3152 /* This is the implementation of trace_file_write_ops method
3153    start.  It creates the trace file FILENAME and registers some
3154    cleanups.  */
3155
3156 static void
3157 tfile_start (struct trace_file_writer *self, const char *filename)
3158 {
3159   struct tfile_trace_file_writer *writer
3160     = (struct tfile_trace_file_writer *) self;
3161
3162   writer->pathname = tilde_expand (filename);
3163   writer->fp = gdb_fopen_cloexec (writer->pathname, "wb");
3164   if (writer->fp == NULL)
3165     error (_("Unable to open file '%s' for saving trace data (%s)"),
3166            filename, safe_strerror (errno));
3167 }
3168
3169 /* This is the implementation of trace_file_write_ops method
3170    write_header.  Write the TFILE header.  */
3171
3172 static void
3173 tfile_write_header (struct trace_file_writer *self)
3174 {
3175   struct tfile_trace_file_writer *writer
3176     = (struct tfile_trace_file_writer *) self;
3177   int written;
3178
3179   /* Write a file header, with a high-bit-set char to indicate a
3180      binary file, plus a hint as what this file is, and a version
3181      number in case of future needs.  */
3182   written = fwrite ("\x7fTRACE0\n", 8, 1, writer->fp);
3183   if (written < 1)
3184     perror_with_name (writer->pathname);
3185 }
3186
3187 /* This is the implementation of trace_file_write_ops method
3188    write_regblock_type.  Write the size of register block.  */
3189
3190 static void
3191 tfile_write_regblock_type (struct trace_file_writer *self, int size)
3192 {
3193   struct tfile_trace_file_writer *writer
3194     = (struct tfile_trace_file_writer *) self;
3195
3196   fprintf (writer->fp, "R %x\n", size);
3197 }
3198
3199 /* This is the implementation of trace_file_write_ops method
3200    write_status.  */
3201
3202 static void
3203 tfile_write_status (struct trace_file_writer *self,
3204                     struct trace_status *ts)
3205 {
3206   struct tfile_trace_file_writer *writer
3207     = (struct tfile_trace_file_writer *) self;
3208
3209   fprintf (writer->fp, "status %c;%s",
3210            (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
3211   if (ts->stop_reason == tracepoint_error
3212       || ts->stop_reason == tstop_command)
3213     {
3214       char *buf = (char *) alloca (strlen (ts->stop_desc) * 2 + 1);
3215
3216       bin2hex ((gdb_byte *) ts->stop_desc, buf, 0);
3217       fprintf (writer->fp, ":%s", buf);
3218     }
3219   fprintf (writer->fp, ":%x", ts->stopping_tracepoint);
3220   if (ts->traceframe_count >= 0)
3221     fprintf (writer->fp, ";tframes:%x", ts->traceframe_count);
3222   if (ts->traceframes_created >= 0)
3223     fprintf (writer->fp, ";tcreated:%x", ts->traceframes_created);
3224   if (ts->buffer_free >= 0)
3225     fprintf (writer->fp, ";tfree:%x", ts->buffer_free);
3226   if (ts->buffer_size >= 0)
3227     fprintf (writer->fp, ";tsize:%x", ts->buffer_size);
3228   if (ts->disconnected_tracing)
3229     fprintf (writer->fp, ";disconn:%x", ts->disconnected_tracing);
3230   if (ts->circular_buffer)
3231     fprintf (writer->fp, ";circular:%x", ts->circular_buffer);
3232   if (ts->start_time)
3233     {
3234       fprintf (writer->fp, ";starttime:%s",
3235       phex_nz (ts->start_time, sizeof (ts->start_time)));
3236     }
3237   if (ts->stop_time)
3238     {
3239       fprintf (writer->fp, ";stoptime:%s",
3240       phex_nz (ts->stop_time, sizeof (ts->stop_time)));
3241     }
3242   if (ts->notes != NULL)
3243     {
3244       char *buf = (char *) alloca (strlen (ts->notes) * 2 + 1);
3245
3246       bin2hex ((gdb_byte *) ts->notes, buf, 0);
3247       fprintf (writer->fp, ";notes:%s", buf);
3248     }
3249   if (ts->user_name != NULL)
3250     {
3251       char *buf = (char *) alloca (strlen (ts->user_name) * 2 + 1);
3252
3253       bin2hex ((gdb_byte *) ts->user_name, buf, 0);
3254       fprintf (writer->fp, ";username:%s", buf);
3255     }
3256   fprintf (writer->fp, "\n");
3257 }
3258
3259 /* This is the implementation of trace_file_write_ops method
3260    write_uploaded_tsv.  */
3261
3262 static void
3263 tfile_write_uploaded_tsv (struct trace_file_writer *self,
3264                           struct uploaded_tsv *utsv)
3265 {
3266   char *buf = "";
3267   struct tfile_trace_file_writer *writer
3268     = (struct tfile_trace_file_writer *) self;
3269
3270   if (utsv->name)
3271     {
3272       buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
3273       bin2hex ((gdb_byte *) (utsv->name), buf, 0);
3274     }
3275
3276   fprintf (writer->fp, "tsv %x:%s:%x:%s\n",
3277            utsv->number, phex_nz (utsv->initial_value, 8),
3278            utsv->builtin, buf);
3279
3280   if (utsv->name)
3281     xfree (buf);
3282 }
3283
3284 #define MAX_TRACE_UPLOAD 2000
3285
3286 /* This is the implementation of trace_file_write_ops method
3287    write_uploaded_tp.  */
3288
3289 static void
3290 tfile_write_uploaded_tp (struct trace_file_writer *self,
3291                          struct uploaded_tp *utp)
3292 {
3293   struct tfile_trace_file_writer *writer
3294     = (struct tfile_trace_file_writer *) self;
3295   int a;
3296   char *act;
3297   char buf[MAX_TRACE_UPLOAD];
3298
3299   fprintf (writer->fp, "tp T%x:%s:%c:%x:%x",
3300            utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3301            (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
3302   if (utp->type == bp_fast_tracepoint)
3303     fprintf (writer->fp, ":F%x", utp->orig_size);
3304   if (utp->cond)
3305     fprintf (writer->fp,
3306              ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
3307              utp->cond);
3308   fprintf (writer->fp, "\n");
3309   for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
3310     fprintf (writer->fp, "tp A%x:%s:%s\n",
3311              utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3312   for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
3313     fprintf (writer->fp, "tp S%x:%s:%s\n",
3314              utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
3315   if (utp->at_string)
3316     {
3317       encode_source_string (utp->number, utp->addr,
3318                             "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
3319       fprintf (writer->fp, "tp Z%s\n", buf);
3320     }
3321   if (utp->cond_string)
3322     {
3323       encode_source_string (utp->number, utp->addr,
3324                             "cond", utp->cond_string,
3325                             buf, MAX_TRACE_UPLOAD);
3326       fprintf (writer->fp, "tp Z%s\n", buf);
3327     }
3328   for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
3329     {
3330       encode_source_string (utp->number, utp->addr, "cmd", act,
3331                             buf, MAX_TRACE_UPLOAD);
3332       fprintf (writer->fp, "tp Z%s\n", buf);
3333     }
3334   fprintf (writer->fp, "tp V%x:%s:%x:%s\n",
3335            utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
3336            utp->hit_count,
3337            phex_nz (utp->traceframe_usage,
3338                     sizeof (utp->traceframe_usage)));
3339 }
3340
3341 /* This is the implementation of trace_file_write_ops method
3342    write_definition_end.  */
3343
3344 static void
3345 tfile_write_definition_end (struct trace_file_writer *self)
3346 {
3347   struct tfile_trace_file_writer *writer
3348     = (struct tfile_trace_file_writer *) self;
3349
3350   fprintf (writer->fp, "\n");
3351 }
3352
3353 /* This is the implementation of trace_file_write_ops method
3354    write_raw_data.  */
3355
3356 static void
3357 tfile_write_raw_data (struct trace_file_writer *self, gdb_byte *buf,
3358                       LONGEST len)
3359 {
3360   struct tfile_trace_file_writer *writer
3361     = (struct tfile_trace_file_writer *) self;
3362
3363   if (fwrite (buf, len, 1, writer->fp) < 1)
3364     perror_with_name (writer->pathname);
3365 }
3366
3367 /* This is the implementation of trace_file_write_ops method
3368    end.  */
3369
3370 static void
3371 tfile_end (struct trace_file_writer *self)
3372 {
3373   struct tfile_trace_file_writer *writer
3374     = (struct tfile_trace_file_writer *) self;
3375   uint32_t gotten = 0;
3376
3377   /* Mark the end of trace data.  */
3378   if (fwrite (&gotten, 4, 1, writer->fp) < 1)
3379     perror_with_name (writer->pathname);
3380 }
3381
3382 /* Operations to write trace buffers into TFILE format.  */
3383
3384 static const struct trace_file_write_ops tfile_write_ops =
3385 {
3386   tfile_dtor,
3387   tfile_target_save,
3388   tfile_start,
3389   tfile_write_header,
3390   tfile_write_regblock_type,
3391   tfile_write_status,
3392   tfile_write_uploaded_tsv,
3393   tfile_write_uploaded_tp,
3394   tfile_write_definition_end,
3395   tfile_write_raw_data,
3396   NULL,
3397   tfile_end,
3398 };
3399
3400 /* Helper macros.  */
3401
3402 #define TRACE_WRITE_R_BLOCK(writer, buf, size)  \
3403   writer->ops->frame_ops->write_r_block ((writer), (buf), (size))
3404 #define TRACE_WRITE_M_BLOCK_HEADER(writer, addr, size)            \
3405   writer->ops->frame_ops->write_m_block_header ((writer), (addr), \
3406                                                 (size))
3407 #define TRACE_WRITE_M_BLOCK_MEMORY(writer, buf, size)     \
3408   writer->ops->frame_ops->write_m_block_memory ((writer), (buf), \
3409                                                 (size))
3410 #define TRACE_WRITE_V_BLOCK(writer, num, val)   \
3411   writer->ops->frame_ops->write_v_block ((writer), (num), (val))
3412
3413 /* Save tracepoint data to file named FILENAME through WRITER.  WRITER
3414    determines the trace file format.  If TARGET_DOES_SAVE is non-zero,
3415    the save is performed on the target, otherwise GDB obtains all trace
3416    data and saves it locally.  */
3417
3418 static void
3419 trace_save (const char *filename, struct trace_file_writer *writer,
3420             int target_does_save)
3421 {
3422   struct trace_status *ts = current_trace_status ();
3423   int status;
3424   struct uploaded_tp *uploaded_tps = NULL, *utp;
3425   struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
3426
3427   ULONGEST offset = 0;
3428   gdb_byte buf[MAX_TRACE_UPLOAD];
3429 #define MAX_TRACE_UPLOAD 2000
3430   int written;
3431   enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
3432
3433   /* If the target is to save the data to a file on its own, then just
3434      send the command and be done with it.  */
3435   if (target_does_save)
3436     {
3437       if (!writer->ops->target_save (writer, filename))
3438         error (_("Target failed to save trace data to '%s'."),
3439                filename);
3440       return;
3441     }
3442
3443   /* Get the trace status first before opening the file, so if the
3444      target is losing, we can get out without touching files.  */
3445   status = target_get_trace_status (ts);
3446
3447   writer->ops->start (writer, filename);
3448
3449   writer->ops->write_header (writer);
3450
3451   /* Write descriptive info.  */
3452
3453   /* Write out the size of a register block.  */
3454   writer->ops->write_regblock_type (writer, trace_regblock_size);
3455
3456   /* Write out status of the tracing run (aka "tstatus" info).  */
3457   writer->ops->write_status (writer, ts);
3458
3459   /* Note that we want to upload tracepoints and save those, rather
3460      than simply writing out the local ones, because the user may have
3461      changed tracepoints in GDB in preparation for a future tracing
3462      run, or maybe just mass-deleted all types of breakpoints as part
3463      of cleaning up.  So as not to contaminate the session, leave the
3464      data in its uploaded form, don't make into real tracepoints.  */
3465
3466   /* Get trace state variables first, they may be checked when parsing
3467      uploaded commands.  */
3468
3469   target_upload_trace_state_variables (&uploaded_tsvs);
3470
3471   for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
3472     writer->ops->write_uploaded_tsv (writer, utsv);
3473
3474   free_uploaded_tsvs (&uploaded_tsvs);
3475
3476   target_upload_tracepoints (&uploaded_tps);
3477
3478   for (utp = uploaded_tps; utp; utp = utp->next)
3479     target_get_tracepoint_status (NULL, utp);
3480
3481   for (utp = uploaded_tps; utp; utp = utp->next)
3482     writer->ops->write_uploaded_tp (writer, utp);
3483
3484   free_uploaded_tps (&uploaded_tps);
3485
3486   /* Mark the end of the definition section.  */
3487   writer->ops->write_definition_end (writer);
3488
3489   /* Get and write the trace data proper.  */
3490   while (1)
3491     {
3492       LONGEST gotten = 0;
3493
3494       /* The writer supports writing the contents of trace buffer
3495           directly to trace file.  Don't parse the contents of trace
3496           buffer.  */
3497       if (writer->ops->write_trace_buffer != NULL)
3498         {
3499           /* We ask for big blocks, in the hopes of efficiency, but
3500              will take less if the target has packet size limitations
3501              or some such.  */
3502           gotten = target_get_raw_trace_data (buf, offset,
3503                                               MAX_TRACE_UPLOAD);
3504           if (gotten < 0)
3505             error (_("Failure to get requested trace buffer data"));
3506           /* No more data is forthcoming, we're done.  */
3507           if (gotten == 0)
3508             break;
3509
3510           writer->ops->write_trace_buffer (writer, buf, gotten);
3511
3512           offset += gotten;
3513         }
3514       else
3515         {
3516           uint16_t tp_num;
3517           uint32_t tf_size;
3518           /* Parse the trace buffers according to how data are stored
3519              in trace buffer in GDBserver.  */
3520
3521           gotten = target_get_raw_trace_data (buf, offset, 6);
3522
3523           if (gotten == 0)
3524             break;
3525
3526           /* Read the first six bytes in, which is the tracepoint
3527              number and trace frame size.  */
3528           tp_num = (uint16_t)
3529             extract_unsigned_integer (&buf[0], 2, byte_order);
3530
3531           tf_size = (uint32_t)
3532             extract_unsigned_integer (&buf[2], 4, byte_order);
3533
3534           writer->ops->frame_ops->start (writer, tp_num);
3535           gotten = 6;
3536
3537           if (tf_size > 0)
3538             {
3539               unsigned int block;
3540
3541               offset += 6;
3542
3543               for (block = 0; block < tf_size; )
3544                 {
3545                   gdb_byte block_type;
3546
3547                   /* We'll fetch one block each time, in order to
3548                      handle the extremely large 'M' block.  We first
3549                      fetch one byte to get the type of the block.  */
3550                   gotten = target_get_raw_trace_data (buf, offset, 1);
3551                   if (gotten < 1)
3552                     error (_("Failure to get requested trace buffer data"));
3553
3554                   gotten = 1;
3555                   block += 1;
3556                   offset += 1;
3557
3558                   block_type = buf[0];
3559                   switch (block_type)
3560                     {
3561                     case 'R':
3562                       gotten
3563                         = target_get_raw_trace_data (buf, offset,
3564                                                      trace_regblock_size);
3565                       if (gotten < trace_regblock_size)
3566                         error (_("Failure to get requested trace"
3567                                  " buffer data"));
3568
3569                       TRACE_WRITE_R_BLOCK (writer, buf,
3570                                            trace_regblock_size);
3571                       break;
3572                     case 'M':
3573                       {
3574                         unsigned short mlen;
3575                         ULONGEST addr;
3576                         LONGEST t;
3577                         int j;
3578
3579                         t = target_get_raw_trace_data (buf,offset, 10);
3580                         if (t < 10)
3581                           error (_("Failure to get requested trace"
3582                                    " buffer data"));
3583
3584                         offset += 10;
3585                         block += 10;
3586
3587                         gotten = 0;
3588                         addr = (ULONGEST)
3589                           extract_unsigned_integer (buf, 8,
3590                                                     byte_order);
3591                         mlen = (unsigned short)
3592                           extract_unsigned_integer (&buf[8], 2,
3593                                                     byte_order);
3594
3595                         TRACE_WRITE_M_BLOCK_HEADER (writer, addr,
3596                                                     mlen);
3597
3598                         /* The memory contents in 'M' block may be
3599                            very large.  Fetch the data from the target
3600                            and write them into file one by one.  */
3601                         for (j = 0; j < mlen; )
3602                           {
3603                             unsigned int read_length;
3604
3605                             if (mlen - j > MAX_TRACE_UPLOAD)
3606                               read_length = MAX_TRACE_UPLOAD;
3607                             else
3608                               read_length = mlen - j;
3609
3610                             t = target_get_raw_trace_data (buf,
3611                                                            offset + j,
3612                                                            read_length);
3613                             if (t < read_length)
3614                               error (_("Failure to get requested"
3615                                        " trace buffer data"));
3616
3617                             TRACE_WRITE_M_BLOCK_MEMORY (writer, buf,
3618                                                         read_length);
3619
3620                             j += read_length;
3621                             gotten += read_length;
3622                           }
3623
3624                         break;
3625                       }
3626                     case 'V':
3627                       {
3628                         int vnum;
3629                         LONGEST val;
3630
3631                         gotten
3632                           = target_get_raw_trace_data (buf, offset,
3633                                                        12);
3634                         if (gotten < 12)
3635                           error (_("Failure to get requested"
3636                                    " trace buffer data"));
3637
3638                         vnum  = (int) extract_signed_integer (buf,
3639                                                               4,
3640                                                               byte_order);
3641                         val
3642                           = extract_signed_integer (&buf[4], 8,
3643                                                     byte_order);
3644
3645                         TRACE_WRITE_V_BLOCK (writer, vnum, val);
3646                       }
3647                       break;
3648                     default:
3649                       error (_("Unknown block type '%c' (0x%x) in"
3650                                " trace frame"),
3651                              block_type, block_type);
3652                     }
3653
3654                   block += gotten;
3655                   offset += gotten;
3656                 }
3657             }
3658           else
3659             offset += gotten;
3660
3661           writer->ops->frame_ops->end (writer);
3662         }
3663     }
3664
3665   writer->ops->end (writer);
3666 }
3667
3668 /* Return a trace writer for TFILE format.  */
3669
3670 static struct trace_file_writer *
3671 tfile_trace_file_writer_new (void)
3672 {
3673   struct tfile_trace_file_writer *writer
3674     = xmalloc (sizeof (struct tfile_trace_file_writer));
3675
3676   writer->base.ops = &tfile_write_ops;
3677   writer->fp = NULL;
3678   writer->pathname = NULL;
3679
3680   return (struct trace_file_writer *) writer;
3681 }
3682
3683 static void
3684 trace_save_command (char *args, int from_tty)
3685 {
3686   int target_does_save = 0;
3687   char **argv;
3688   char *filename = NULL;
3689   struct cleanup *back_to;
3690   int generate_ctf = 0;
3691   struct trace_file_writer *writer = NULL;
3692
3693   if (args == NULL)
3694     error_no_arg (_("file in which to save trace data"));
3695
3696   argv = gdb_buildargv (args);
3697   back_to = make_cleanup_freeargv (argv);
3698
3699   for (; *argv; ++argv)
3700     {
3701       if (strcmp (*argv, "-r") == 0)
3702         target_does_save = 1;
3703       if (strcmp (*argv, "-ctf") == 0)
3704         generate_ctf = 1;
3705       else if (**argv == '-')
3706         error (_("unknown option `%s'"), *argv);
3707       else
3708         filename = *argv;
3709     }
3710
3711   if (!filename)
3712     error_no_arg (_("file in which to save trace data"));
3713
3714   if (generate_ctf)
3715     writer = ctf_trace_file_writer_new ();
3716   else
3717     writer = tfile_trace_file_writer_new ();
3718
3719   make_cleanup (trace_file_writer_xfree, writer);
3720
3721   trace_save (filename, writer, target_does_save);
3722
3723   if (from_tty)
3724     printf_filtered (_("Trace data saved to %s '%s'.\n"),
3725                      generate_ctf ? "directory" : "file", filename);
3726
3727   do_cleanups (back_to);
3728 }
3729
3730 /* Save the trace data to file FILENAME of tfile format.  */
3731
3732 void
3733 trace_save_tfile (const char *filename, int target_does_save)
3734 {
3735   struct trace_file_writer *writer;
3736   struct cleanup *back_to;
3737
3738   writer = tfile_trace_file_writer_new ();
3739   back_to = make_cleanup (trace_file_writer_xfree, writer);
3740   trace_save (filename, writer, target_does_save);
3741   do_cleanups (back_to);
3742 }
3743
3744 /* Save the trace data to dir DIRNAME of ctf format.  */
3745
3746 void
3747 trace_save_ctf (const char *dirname, int target_does_save)
3748 {
3749   struct trace_file_writer *writer;
3750   struct cleanup *back_to;
3751
3752   writer = ctf_trace_file_writer_new ();
3753   back_to = make_cleanup (trace_file_writer_xfree, writer);
3754
3755   trace_save (dirname, writer, target_does_save);
3756   do_cleanups (back_to);
3757 }
3758
3759 /* Tell the target what to do with an ongoing tracing run if GDB
3760    disconnects for some reason.  */
3761
3762 static void
3763 set_disconnected_tracing (char *args, int from_tty,
3764                           struct cmd_list_element *c)
3765 {
3766   target_set_disconnected_tracing (disconnected_tracing);
3767 }
3768
3769 static void
3770 set_circular_trace_buffer (char *args, int from_tty,
3771                            struct cmd_list_element *c)
3772 {
3773   target_set_circular_trace_buffer (circular_trace_buffer);
3774 }
3775
3776 static void
3777 set_trace_buffer_size (char *args, int from_tty,
3778                            struct cmd_list_element *c)
3779 {
3780   target_set_trace_buffer_size (trace_buffer_size);
3781 }
3782
3783 static void
3784 set_trace_user (char *args, int from_tty,
3785                 struct cmd_list_element *c)
3786 {
3787   int ret;
3788
3789   ret = target_set_trace_notes (trace_user, NULL, NULL);
3790
3791   if (!ret)
3792     warning (_("Target does not support trace notes, user ignored"));
3793 }
3794
3795 static void
3796 set_trace_notes (char *args, int from_tty,
3797                  struct cmd_list_element *c)
3798 {
3799   int ret;
3800
3801   ret = target_set_trace_notes (NULL, trace_notes, NULL);
3802
3803   if (!ret)
3804     warning (_("Target does not support trace notes, note ignored"));
3805 }
3806
3807 static void
3808 set_trace_stop_notes (char *args, int from_tty,
3809                       struct cmd_list_element *c)
3810 {
3811   int ret;
3812
3813   ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
3814
3815   if (!ret)
3816     warning (_("Target does not support trace notes, stop note ignored"));
3817 }
3818
3819 /* Convert the memory pointed to by mem into hex, placing result in buf.
3820  * Return a pointer to the last char put in buf (null)
3821  * "stolen" from sparc-stub.c
3822  */
3823
3824 static const char hexchars[] = "0123456789abcdef";
3825
3826 static char *
3827 mem2hex (gdb_byte *mem, char *buf, int count)
3828 {
3829   gdb_byte ch;
3830
3831   while (count-- > 0)
3832     {
3833       ch = *mem++;
3834
3835       *buf++ = hexchars[ch >> 4];
3836       *buf++ = hexchars[ch & 0xf];
3837     }
3838
3839   *buf = 0;
3840
3841   return buf;
3842 }
3843
3844 int
3845 get_traceframe_number (void)
3846 {
3847   return traceframe_number;
3848 }
3849
3850 int
3851 get_tracepoint_number (void)
3852 {
3853   return tracepoint_number;
3854 }
3855
3856 /* Make the traceframe NUM be the current trace frame.  Does nothing
3857    if NUM is already current.  */
3858
3859 void
3860 set_current_traceframe (int num)
3861 {
3862   int newnum;
3863
3864   if (traceframe_number == num)
3865     {
3866       /* Nothing to do.  */
3867       return;
3868     }
3869
3870   newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3871
3872   if (newnum != num)
3873     warning (_("could not change traceframe"));
3874
3875   set_traceframe_num (newnum);
3876
3877   /* Changing the traceframe changes our view of registers and of the
3878      frame chain.  */
3879   registers_changed ();
3880
3881   clear_traceframe_info ();
3882 }
3883
3884 /* Make the traceframe NUM be the current trace frame, and do nothing
3885    more.  */
3886
3887 void
3888 set_traceframe_number (int num)
3889 {
3890   traceframe_number = num;
3891 }
3892
3893 /* A cleanup used when switching away and back from tfind mode.  */
3894
3895 struct current_traceframe_cleanup
3896 {
3897   /* The traceframe we were inspecting.  */
3898   int traceframe_number;
3899 };
3900
3901 static void
3902 do_restore_current_traceframe_cleanup (void *arg)
3903 {
3904   struct current_traceframe_cleanup *old = arg;
3905
3906   set_current_traceframe (old->traceframe_number);
3907 }
3908
3909 static void
3910 restore_current_traceframe_cleanup_dtor (void *arg)
3911 {
3912   struct current_traceframe_cleanup *old = arg;
3913
3914   xfree (old);
3915 }
3916
3917 struct cleanup *
3918 make_cleanup_restore_current_traceframe (void)
3919 {
3920   struct current_traceframe_cleanup *old;
3921
3922   old = xmalloc (sizeof (struct current_traceframe_cleanup));
3923   old->traceframe_number = traceframe_number;
3924
3925   return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3926                             restore_current_traceframe_cleanup_dtor);
3927 }
3928
3929 struct cleanup *
3930 make_cleanup_restore_traceframe_number (void)
3931 {
3932   return make_cleanup_restore_integer (&traceframe_number);
3933 }
3934
3935 /* Given a number and address, return an uploaded tracepoint with that
3936    number, creating if necessary.  */
3937
3938 struct uploaded_tp *
3939 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3940 {
3941   struct uploaded_tp *utp;
3942
3943   for (utp = *utpp; utp; utp = utp->next)
3944     if (utp->number == num && utp->addr == addr)
3945       return utp;
3946   utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3947   memset (utp, 0, sizeof (struct uploaded_tp));
3948   utp->number = num;
3949   utp->addr = addr;
3950   utp->actions = NULL;
3951   utp->step_actions = NULL;
3952   utp->cmd_strings = NULL;
3953   utp->next = *utpp;
3954   *utpp = utp;
3955   return utp;
3956 }
3957
3958 static void
3959 free_uploaded_tps (struct uploaded_tp **utpp)
3960 {
3961   struct uploaded_tp *next_one;
3962
3963   while (*utpp)
3964     {
3965       next_one = (*utpp)->next;
3966       xfree (*utpp);
3967       *utpp = next_one;
3968     }
3969 }
3970
3971 /* Given a number and address, return an uploaded tracepoint with that
3972    number, creating if necessary.  */
3973
3974 struct uploaded_tsv *
3975 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3976 {
3977   struct uploaded_tsv *utsv;
3978
3979   for (utsv = *utsvp; utsv; utsv = utsv->next)
3980     if (utsv->number == num)
3981       return utsv;
3982   utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3983   memset (utsv, 0, sizeof (struct uploaded_tsv));
3984   utsv->number = num;
3985   utsv->next = *utsvp;
3986   *utsvp = utsv;
3987   return utsv;
3988 }
3989
3990 static void
3991 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3992 {
3993   struct uploaded_tsv *next_one;
3994
3995   while (*utsvp)
3996     {
3997       next_one = (*utsvp)->next;
3998       xfree (*utsvp);
3999       *utsvp = next_one;
4000     }
4001 }
4002
4003 /* FIXME this function is heuristic and will miss the cases where the
4004    conditional is semantically identical but differs in whitespace,
4005    such as "x == 0" vs "x==0".  */
4006
4007 static int
4008 cond_string_is_same (char *str1, char *str2)
4009 {
4010   if (str1 == NULL || str2 == NULL)
4011     return (str1 == str2);
4012
4013   return (strcmp (str1, str2) == 0);
4014 }
4015
4016 /* Look for an existing tracepoint that seems similar enough to the
4017    uploaded one.  Enablement isn't compared, because the user can
4018    toggle that freely, and may have done so in anticipation of the
4019    next trace run.  Return the location of matched tracepoint.  */
4020
4021 static struct bp_location *
4022 find_matching_tracepoint_location (struct uploaded_tp *utp)
4023 {
4024   VEC(breakpoint_p) *tp_vec = all_tracepoints ();
4025   int ix;
4026   struct breakpoint *b;
4027   struct bp_location *loc;
4028
4029   for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
4030     {
4031       struct tracepoint *t = (struct tracepoint *) b;
4032
4033       if (b->type == utp->type
4034           && t->step_count == utp->step
4035           && t->pass_count == utp->pass
4036           && cond_string_is_same (t->base.cond_string, utp->cond_string)
4037           /* FIXME also test actions.  */
4038           )
4039         {
4040           /* Scan the locations for an address match.  */
4041           for (loc = b->loc; loc; loc = loc->next)
4042             {
4043               if (loc->address == utp->addr)
4044                 return loc;
4045             }
4046         }
4047     }
4048   return NULL;
4049 }
4050
4051 /* Given a list of tracepoints uploaded from a target, attempt to
4052    match them up with existing tracepoints, and create new ones if not
4053    found.  */
4054
4055 void
4056 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
4057 {
4058   struct uploaded_tp *utp;
4059   /* A set of tracepoints which are modified.  */
4060   VEC(breakpoint_p) *modified_tp = NULL;
4061   int ix;
4062   struct breakpoint *b;
4063
4064   /* Look for GDB tracepoints that match up with our uploaded versions.  */
4065   for (utp = *uploaded_tps; utp; utp = utp->next)
4066     {
4067       struct bp_location *loc;
4068       struct tracepoint *t;
4069
4070       loc = find_matching_tracepoint_location (utp);
4071       if (loc)
4072         {
4073           int found = 0;
4074
4075           /* Mark this location as already inserted.  */
4076           loc->inserted = 1;
4077           t = (struct tracepoint *) loc->owner;
4078           printf_filtered (_("Assuming tracepoint %d is same "
4079                              "as target's tracepoint %d at %s.\n"),
4080                            loc->owner->number, utp->number,
4081                            paddress (loc->gdbarch, utp->addr));
4082
4083           /* The tracepoint LOC->owner was modified (the location LOC
4084              was marked as inserted in the target).  Save it in
4085              MODIFIED_TP if not there yet.  The 'breakpoint-modified'
4086              observers will be notified later once for each tracepoint
4087              saved in MODIFIED_TP.  */
4088           for (ix = 0;
4089                VEC_iterate (breakpoint_p, modified_tp, ix, b);
4090                ix++)
4091             if (b == loc->owner)
4092               {
4093                 found = 1;
4094                 break;
4095               }
4096           if (!found)
4097             VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
4098         }
4099       else
4100         {
4101           t = create_tracepoint_from_upload (utp);
4102           if (t)
4103             printf_filtered (_("Created tracepoint %d for "
4104                                "target's tracepoint %d at %s.\n"),
4105                              t->base.number, utp->number,
4106                              paddress (get_current_arch (), utp->addr));
4107           else
4108             printf_filtered (_("Failed to create tracepoint for target's "
4109                                "tracepoint %d at %s, skipping it.\n"),
4110                              utp->number,
4111                              paddress (get_current_arch (), utp->addr));
4112         }
4113       /* Whether found or created, record the number used by the
4114          target, to help with mapping target tracepoints back to their
4115          counterparts here.  */
4116       if (t)
4117         t->number_on_target = utp->number;
4118     }
4119
4120   /* Notify 'breakpoint-modified' observer that at least one of B's
4121      locations was changed.  */
4122   for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
4123     observer_notify_breakpoint_modified (b);
4124
4125   VEC_free (breakpoint_p, modified_tp);
4126   free_uploaded_tps (uploaded_tps);
4127 }
4128
4129 /* Trace state variables don't have much to identify them beyond their
4130    name, so just use that to detect matches.  */
4131
4132 static struct trace_state_variable *
4133 find_matching_tsv (struct uploaded_tsv *utsv)
4134 {
4135   if (!utsv->name)
4136     return NULL;
4137
4138   return find_trace_state_variable (utsv->name);
4139 }
4140
4141 static struct trace_state_variable *
4142 create_tsv_from_upload (struct uploaded_tsv *utsv)
4143 {
4144   const char *namebase;
4145   char *buf;
4146   int try_num = 0;
4147   struct trace_state_variable *tsv;
4148   struct cleanup *old_chain;
4149
4150   if (utsv->name)
4151     {
4152       namebase = utsv->name;
4153       buf = xstrprintf ("%s", namebase);
4154     }
4155   else
4156     {
4157       namebase = "__tsv";
4158       buf = xstrprintf ("%s_%d", namebase, try_num++);
4159     }
4160
4161   /* Fish for a name that is not in use.  */
4162   /* (should check against all internal vars?)  */
4163   while (find_trace_state_variable (buf))
4164     {
4165       xfree (buf);
4166       buf = xstrprintf ("%s_%d", namebase, try_num++);
4167     }
4168
4169   old_chain = make_cleanup (xfree, buf);
4170
4171   /* We have an available name, create the variable.  */
4172   tsv = create_trace_state_variable (buf);
4173   tsv->initial_value = utsv->initial_value;
4174   tsv->builtin = utsv->builtin;
4175
4176   observer_notify_tsv_created (tsv);
4177
4178   do_cleanups (old_chain);
4179
4180   return tsv;
4181 }
4182
4183 /* Given a list of uploaded trace state variables, try to match them
4184    up with existing variables, or create additional ones.  */
4185
4186 void
4187 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
4188 {
4189   int ix;
4190   struct uploaded_tsv *utsv;
4191   struct trace_state_variable *tsv;
4192   int highest;
4193
4194   /* Most likely some numbers will have to be reassigned as part of
4195      the merge, so clear them all in anticipation.  */
4196   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4197     tsv->number = 0;
4198
4199   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
4200     {
4201       tsv = find_matching_tsv (utsv);
4202       if (tsv)
4203         {
4204           if (info_verbose)
4205             printf_filtered (_("Assuming trace state variable $%s "
4206                                "is same as target's variable %d.\n"),
4207                              tsv->name, utsv->number);
4208         }
4209       else
4210         {
4211           tsv = create_tsv_from_upload (utsv);
4212           if (info_verbose)
4213             printf_filtered (_("Created trace state variable "
4214                                "$%s for target's variable %d.\n"),
4215                              tsv->name, utsv->number);
4216         }
4217       /* Give precedence to numberings that come from the target.  */
4218       if (tsv)
4219         tsv->number = utsv->number;
4220     }
4221
4222   /* Renumber everything that didn't get a target-assigned number.  */
4223   highest = 0;
4224   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4225     if (tsv->number > highest)
4226       highest = tsv->number;
4227
4228   ++highest;
4229   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
4230     if (tsv->number == 0)
4231       tsv->number = highest++;
4232
4233   free_uploaded_tsvs (uploaded_tsvs);
4234 }
4235
4236 /* target tfile command */
4237
4238 static struct target_ops tfile_ops;
4239
4240 /* Fill in tfile_ops with its defined operations and properties.  */
4241
4242 #define TRACE_HEADER_SIZE 8
4243
4244 static char *trace_filename;
4245 static int trace_fd = -1;
4246 static off_t trace_frames_offset;
4247 static off_t cur_offset;
4248 static int cur_data_size;
4249 int trace_regblock_size;
4250
4251 static void tfile_interp_line (char *line,
4252                                struct uploaded_tp **utpp,
4253                                struct uploaded_tsv **utsvp);
4254
4255 /* Read SIZE bytes into READBUF from the trace frame, starting at
4256    TRACE_FD's current position.  Note that this call `read'
4257    underneath, hence it advances the file's seek position.  Throws an
4258    error if the `read' syscall fails, or less than SIZE bytes are
4259    read.  */
4260
4261 static void
4262 tfile_read (gdb_byte *readbuf, int size)
4263 {
4264   int gotten;
4265
4266   gotten = read (trace_fd, readbuf, size);
4267   if (gotten < 0)
4268     perror_with_name (trace_filename);
4269   else if (gotten < size)
4270     error (_("Premature end of file while reading trace file"));
4271 }
4272
4273 static void
4274 tfile_open (char *filename, int from_tty)
4275 {
4276   volatile struct gdb_exception ex;
4277   char *temp;
4278   struct cleanup *old_chain;
4279   int flags;
4280   int scratch_chan;
4281   char header[TRACE_HEADER_SIZE];
4282   char linebuf[1000]; /* Should be max remote packet size or so.  */
4283   gdb_byte byte;
4284   int bytes, i;
4285   struct trace_status *ts;
4286   struct uploaded_tp *uploaded_tps = NULL;
4287   struct uploaded_tsv *uploaded_tsvs = NULL;
4288
4289   target_preopen (from_tty);
4290   if (!filename)
4291     error (_("No trace file specified."));
4292
4293   filename = tilde_expand (filename);
4294   if (!IS_ABSOLUTE_PATH(filename))
4295     {
4296       temp = concat (current_directory, "/", filename, (char *) NULL);
4297       xfree (filename);
4298       filename = temp;
4299     }
4300
4301   old_chain = make_cleanup (xfree, filename);
4302
4303   flags = O_BINARY | O_LARGEFILE;
4304   flags |= O_RDONLY;
4305   scratch_chan = gdb_open_cloexec (filename, flags, 0);
4306   if (scratch_chan < 0)
4307     perror_with_name (filename);
4308
4309   /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
4310
4311   discard_cleanups (old_chain); /* Don't free filename any more.  */
4312   unpush_target (&tfile_ops);
4313
4314   trace_filename = xstrdup (filename);
4315   trace_fd = scratch_chan;
4316
4317   bytes = 0;
4318   /* Read the file header and test for validity.  */
4319   tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
4320
4321   bytes += TRACE_HEADER_SIZE;
4322   if (!(header[0] == 0x7f
4323         && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
4324     error (_("File is not a valid trace file."));
4325
4326   push_target (&tfile_ops);
4327
4328   trace_regblock_size = 0;
4329   ts = current_trace_status ();
4330   /* We know we're working with a file.  Record its name.  */
4331   ts->filename = trace_filename;
4332   /* Set defaults in case there is no status line.  */
4333   ts->running_known = 0;
4334   ts->stop_reason = trace_stop_reason_unknown;
4335   ts->traceframe_count = -1;
4336   ts->buffer_free = 0;
4337   ts->disconnected_tracing = 0;
4338   ts->circular_buffer = 0;
4339
4340   TRY_CATCH (ex, RETURN_MASK_ALL)
4341     {
4342       /* Read through a section of newline-terminated lines that
4343          define things like tracepoints.  */
4344       i = 0;
4345       while (1)
4346         {
4347           tfile_read (&byte, 1);
4348
4349           ++bytes;
4350           if (byte == '\n')
4351             {
4352               /* Empty line marks end of the definition section.  */
4353               if (i == 0)
4354                 break;
4355               linebuf[i] = '\0';
4356               i = 0;
4357               tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
4358             }
4359           else
4360             linebuf[i++] = byte;
4361           if (i >= 1000)
4362             error (_("Excessively long lines in trace file"));
4363         }
4364
4365       /* Record the starting offset of the binary trace data.  */
4366       trace_frames_offset = bytes;
4367
4368       /* If we don't have a blocksize, we can't interpret the
4369          traceframes.  */
4370       if (trace_regblock_size == 0)
4371         error (_("No register block size recorded in trace file"));
4372     }
4373   if (ex.reason < 0)
4374     {
4375       /* Remove the partially set up target.  */
4376       unpush_target (&tfile_ops);
4377       throw_exception (ex);
4378     }
4379
4380   if (ts->traceframe_count <= 0)
4381     warning (_("No traceframes present in this file."));
4382
4383   /* Add the file's tracepoints and variables into the current mix.  */
4384
4385   /* Get trace state variables first, they may be checked when parsing
4386      uploaded commands.  */
4387   merge_uploaded_trace_state_variables (&uploaded_tsvs);
4388
4389   merge_uploaded_tracepoints (&uploaded_tps);
4390 }
4391
4392 /* Interpret the given line from the definitions part of the trace
4393    file.  */
4394
4395 static void
4396 tfile_interp_line (char *line, struct uploaded_tp **utpp,
4397                    struct uploaded_tsv **utsvp)
4398 {
4399   char *p = line;
4400
4401   if (strncmp (p, "R ", strlen ("R ")) == 0)
4402     {
4403       p += strlen ("R ");
4404       trace_regblock_size = strtol (p, &p, 16);
4405     }
4406   else if (strncmp (p, "status ", strlen ("status ")) == 0)
4407     {
4408       p += strlen ("status ");
4409       parse_trace_status (p, current_trace_status ());
4410     }
4411   else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
4412     {
4413       p += strlen ("tp ");
4414       parse_tracepoint_definition (p, utpp);
4415     }
4416   else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
4417     {
4418       p += strlen ("tsv ");
4419       parse_tsv_definition (p, utsvp);
4420     }
4421   else
4422     warning (_("Ignoring trace file definition \"%s\""), line);
4423 }
4424
4425 /* Parse the part of trace status syntax that is shared between
4426    the remote protocol and the trace file reader.  */
4427
4428 void
4429 parse_trace_status (char *line, struct trace_status *ts)
4430 {
4431   char *p = line, *p1, *p2, *p3, *p_temp;
4432   int end;
4433   ULONGEST val;
4434
4435   ts->running_known = 1;
4436   ts->running = (*p++ == '1');
4437   ts->stop_reason = trace_stop_reason_unknown;
4438   xfree (ts->stop_desc);
4439   ts->stop_desc = NULL;
4440   ts->traceframe_count = -1;
4441   ts->traceframes_created = -1;
4442   ts->buffer_free = -1;
4443   ts->buffer_size = -1;
4444   ts->disconnected_tracing = 0;
4445   ts->circular_buffer = 0;
4446   xfree (ts->user_name);
4447   ts->user_name = NULL;
4448   xfree (ts->notes);
4449   ts->notes = NULL;
4450   ts->start_time = ts->stop_time = 0;
4451
4452   while (*p++)
4453     {
4454       p1 = strchr (p, ':');
4455       if (p1 == NULL)
4456         error (_("Malformed trace status, at %s\n\
4457 Status line: '%s'\n"), p, line);
4458       p3 = strchr (p, ';');
4459       if (p3 == NULL)
4460         p3 = p + strlen (p);
4461       if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
4462         {
4463           p = unpack_varlen_hex (++p1, &val);
4464           ts->stop_reason = trace_buffer_full;
4465         }
4466       else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
4467         {
4468           p = unpack_varlen_hex (++p1, &val);
4469           ts->stop_reason = trace_never_run;
4470         }
4471       else if (strncmp (p, stop_reason_names[tracepoint_passcount],
4472                         p1 - p) == 0)
4473         {
4474           p = unpack_varlen_hex (++p1, &val);
4475           ts->stop_reason = tracepoint_passcount;
4476           ts->stopping_tracepoint = val;
4477         }
4478       else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
4479         {
4480           p2 = strchr (++p1, ':');
4481           if (!p2 || p2 > p3)
4482             {
4483               /*older style*/
4484               p2 = p1;
4485             }
4486           else if (p2 != p1)
4487             {
4488               ts->stop_desc = xmalloc (strlen (line));
4489               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
4490               ts->stop_desc[end] = '\0';
4491             }
4492           else
4493             ts->stop_desc = xstrdup ("");
4494
4495           p = unpack_varlen_hex (++p2, &val);
4496           ts->stop_reason = tstop_command;
4497         }
4498       else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
4499         {
4500           p = unpack_varlen_hex (++p1, &val);
4501           ts->stop_reason = trace_disconnected;
4502         }
4503       else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
4504         {
4505           p2 = strchr (++p1, ':');
4506           if (p2 != p1)
4507             {
4508               ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
4509               end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
4510               ts->stop_desc[end] = '\0';
4511             }
4512           else
4513             ts->stop_desc = xstrdup ("");
4514
4515           p = unpack_varlen_hex (++p2, &val);
4516           ts->stopping_tracepoint = val;
4517           ts->stop_reason = tracepoint_error;
4518         }
4519       else if (strncmp (p, "tframes", p1 - p) == 0)
4520         {
4521           p = unpack_varlen_hex (++p1, &val);
4522           ts->traceframe_count = val;
4523         }
4524       else if (strncmp (p, "tcreated", p1 - p) == 0)
4525         {
4526           p = unpack_varlen_hex (++p1, &val);
4527           ts->traceframes_created = val;
4528         }
4529       else if (strncmp (p, "tfree", p1 - p) == 0)
4530         {
4531           p = unpack_varlen_hex (++p1, &val);
4532           ts->buffer_free = val;
4533         }
4534       else if (strncmp (p, "tsize", p1 - p) == 0)
4535         {
4536           p = unpack_varlen_hex (++p1, &val);
4537           ts->buffer_size = val;
4538         }
4539       else if (strncmp (p, "disconn", p1 - p) == 0)
4540         {
4541           p = unpack_varlen_hex (++p1, &val);
4542           ts->disconnected_tracing = val;
4543         }
4544       else if (strncmp (p, "circular", p1 - p) == 0)
4545         {
4546           p = unpack_varlen_hex (++p1, &val);
4547           ts->circular_buffer = val;
4548         }
4549       else if (strncmp (p, "starttime", p1 - p) == 0)
4550         {
4551           p = unpack_varlen_hex (++p1, &val);
4552           ts->start_time = val;
4553         }
4554       else if (strncmp (p, "stoptime", p1 - p) == 0)
4555         {
4556           p = unpack_varlen_hex (++p1, &val);
4557           ts->stop_time = val;
4558         }
4559       else if (strncmp (p, "username", p1 - p) == 0)
4560         {
4561           ++p1;
4562           ts->user_name = xmalloc (strlen (p) / 2);
4563           end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1)  / 2);
4564           ts->user_name[end] = '\0';
4565           p = p3;
4566         }
4567       else if (strncmp (p, "notes", p1 - p) == 0)
4568         {
4569           ++p1;
4570           ts->notes = xmalloc (strlen (p) / 2);
4571           end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
4572           ts->notes[end] = '\0';
4573           p = p3;
4574         }
4575       else
4576         {
4577           /* Silently skip unknown optional info.  */
4578           p_temp = strchr (p1 + 1, ';');
4579           if (p_temp)
4580             p = p_temp;
4581           else
4582             /* Must be at the end.  */
4583             break;
4584         }
4585     }
4586 }
4587
4588 void
4589 parse_tracepoint_status (char *p, struct breakpoint *bp,
4590                          struct uploaded_tp *utp)
4591 {
4592   ULONGEST uval;
4593   struct tracepoint *tp = (struct tracepoint *) bp;
4594
4595   p = unpack_varlen_hex (p, &uval);
4596   if (tp)
4597     tp->base.hit_count += uval;
4598   else
4599     utp->hit_count += uval;
4600   p = unpack_varlen_hex (p + 1, &uval);
4601   if (tp)
4602     tp->traceframe_usage += uval;
4603   else
4604     utp->traceframe_usage += uval;
4605   /* Ignore any extra, allowing for future extensions.  */
4606 }
4607
4608 /* Given a line of text defining a part of a tracepoint, parse it into
4609    an "uploaded tracepoint".  */
4610
4611 void
4612 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
4613 {
4614   char *p;
4615   char piece;
4616   ULONGEST num, addr, step, pass, orig_size, xlen, start;
4617   int enabled, end;
4618   enum bptype type;
4619   char *cond, *srctype, *buf;
4620   struct uploaded_tp *utp = NULL;
4621
4622   p = line;
4623   /* Both tracepoint and action definitions start with the same number
4624      and address sequence.  */
4625   piece = *p++;
4626   p = unpack_varlen_hex (p, &num);
4627   p++;  /* skip a colon */
4628   p = unpack_varlen_hex (p, &addr);
4629   p++;  /* skip a colon */
4630   if (piece == 'T')
4631     {
4632       enabled = (*p++ == 'E');
4633       p++;  /* skip a colon */
4634       p = unpack_varlen_hex (p, &step);
4635       p++;  /* skip a colon */
4636       p = unpack_varlen_hex (p, &pass);
4637       type = bp_tracepoint;
4638       cond = NULL;
4639       /* Thumb through optional fields.  */
4640       while (*p == ':')
4641         {
4642           p++;  /* skip a colon */
4643           if (*p == 'F')
4644             {
4645               type = bp_fast_tracepoint;
4646               p++;
4647               p = unpack_varlen_hex (p, &orig_size);
4648             }
4649           else if (*p == 'S')
4650             {
4651               type = bp_static_tracepoint;
4652               p++;
4653             }
4654           else if (*p == 'X')
4655             {
4656               p++;
4657               p = unpack_varlen_hex (p, &xlen);
4658               p++;  /* skip a comma */
4659               cond = (char *) xmalloc (2 * xlen + 1);
4660               strncpy (cond, p, 2 * xlen);
4661               cond[2 * xlen] = '\0';
4662               p += 2 * xlen;
4663             }
4664           else
4665             warning (_("Unrecognized char '%c' in tracepoint "
4666                        "definition, skipping rest"), *p);
4667         }
4668       utp = get_uploaded_tp (num, addr, utpp);
4669       utp->type = type;
4670       utp->enabled = enabled;
4671       utp->step = step;
4672       utp->pass = pass;
4673       utp->cond = cond;
4674     }
4675   else if (piece == 'A')
4676     {
4677       utp = get_uploaded_tp (num, addr, utpp);
4678       VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
4679     }
4680   else if (piece == 'S')
4681     {
4682       utp = get_uploaded_tp (num, addr, utpp);
4683       VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
4684     }
4685   else if (piece == 'Z')
4686     {
4687       /* Parse a chunk of source form definition.  */
4688       utp = get_uploaded_tp (num, addr, utpp);
4689       srctype = p;
4690       p = strchr (p, ':');
4691       p++;  /* skip a colon */
4692       p = unpack_varlen_hex (p, &start);
4693       p++;  /* skip a colon */
4694       p = unpack_varlen_hex (p, &xlen);
4695       p++;  /* skip a colon */
4696
4697       buf = alloca (strlen (line));
4698
4699       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4700       buf[end] = '\0';
4701
4702       if (strncmp (srctype, "at:", strlen ("at:")) == 0)
4703         utp->at_string = xstrdup (buf);
4704       else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
4705         utp->cond_string = xstrdup (buf);
4706       else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
4707         VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
4708     }
4709   else if (piece == 'V')
4710     {
4711       utp = get_uploaded_tp (num, addr, utpp);
4712
4713       parse_tracepoint_status (p, NULL, utp);
4714     }
4715   else
4716     {
4717       /* Don't error out, the target might be sending us optional
4718          info that we don't care about.  */
4719       warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
4720     }
4721 }
4722
4723 /* Convert a textual description of a trace state variable into an
4724    uploaded object.  */
4725
4726 void
4727 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
4728 {
4729   char *p, *buf;
4730   ULONGEST num, initval, builtin;
4731   int end;
4732   struct uploaded_tsv *utsv = NULL;
4733
4734   buf = alloca (strlen (line));
4735
4736   p = line;
4737   p = unpack_varlen_hex (p, &num);
4738   p++; /* skip a colon */
4739   p = unpack_varlen_hex (p, &initval);
4740   p++; /* skip a colon */
4741   p = unpack_varlen_hex (p, &builtin);
4742   p++; /* skip a colon */
4743   end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4744   buf[end] = '\0';
4745
4746   utsv = get_uploaded_tsv (num, utsvp);
4747   utsv->initial_value = initval;
4748   utsv->builtin = builtin;
4749   utsv->name = xstrdup (buf);
4750 }
4751
4752 /* Close the trace file and generally clean up.  */
4753
4754 static void
4755 tfile_close (void)
4756 {
4757   int pid;
4758
4759   if (trace_fd < 0)
4760     return;
4761
4762   close (trace_fd);
4763   trace_fd = -1;
4764   xfree (trace_filename);
4765   trace_filename = NULL;
4766
4767   trace_reset_local_state ();
4768 }
4769
4770 static void
4771 tfile_files_info (struct target_ops *t)
4772 {
4773   printf_filtered ("\t`%s'\n", trace_filename);
4774 }
4775
4776 /* The trace status for a file is that tracing can never be run.  */
4777
4778 static int
4779 tfile_get_trace_status (struct trace_status *ts)
4780 {
4781   /* Other bits of trace status were collected as part of opening the
4782      trace files, so nothing to do here.  */
4783
4784   return -1;
4785 }
4786
4787 static void
4788 tfile_get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp)
4789 {
4790   /* Other bits of trace status were collected as part of opening the
4791      trace files, so nothing to do here.  */
4792 }
4793
4794 /* Given the position of a traceframe in the file, figure out what
4795    address the frame was collected at.  This would normally be the
4796    value of a collected PC register, but if not available, we
4797    improvise.  */
4798
4799 static CORE_ADDR
4800 tfile_get_traceframe_address (off_t tframe_offset)
4801 {
4802   CORE_ADDR addr = 0;
4803   short tpnum;
4804   struct tracepoint *tp;
4805   off_t saved_offset = cur_offset;
4806
4807   /* FIXME dig pc out of collected registers.  */
4808
4809   /* Fall back to using tracepoint address.  */
4810   lseek (trace_fd, tframe_offset, SEEK_SET);
4811   tfile_read ((gdb_byte *) &tpnum, 2);
4812   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4813                                           gdbarch_byte_order
4814                                               (target_gdbarch ()));
4815
4816   tp = get_tracepoint_by_number_on_target (tpnum);
4817   /* FIXME this is a poor heuristic if multiple locations.  */
4818   if (tp && tp->base.loc)
4819     addr = tp->base.loc->address;
4820
4821   /* Restore our seek position.  */
4822   cur_offset = saved_offset;
4823   lseek (trace_fd, cur_offset, SEEK_SET);
4824   return addr;
4825 }
4826
4827 /* Given a type of search and some parameters, scan the collection of
4828    traceframes in the file looking for a match.  When found, return
4829    both the traceframe and tracepoint number, otherwise -1 for
4830    each.  */
4831
4832 static int
4833 tfile_trace_find (enum trace_find_type type, int num,
4834                   CORE_ADDR addr1, CORE_ADDR addr2, int *tpp)
4835 {
4836   short tpnum;
4837   int tfnum = 0, found = 0;
4838   unsigned int data_size;
4839   struct tracepoint *tp;
4840   off_t offset, tframe_offset;
4841   CORE_ADDR tfaddr;
4842
4843   if (num == -1)
4844     {
4845       if (tpp)
4846         *tpp = -1;
4847       return -1;
4848     }
4849
4850   lseek (trace_fd, trace_frames_offset, SEEK_SET);
4851   offset = trace_frames_offset;
4852   while (1)
4853     {
4854       tframe_offset = offset;
4855       tfile_read ((gdb_byte *) &tpnum, 2);
4856       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4857                                               gdbarch_byte_order
4858                                                   (target_gdbarch ()));
4859       offset += 2;
4860       if (tpnum == 0)
4861         break;
4862       tfile_read ((gdb_byte *) &data_size, 4);
4863       data_size = (unsigned int) extract_unsigned_integer
4864                                      ((gdb_byte *) &data_size, 4,
4865                                       gdbarch_byte_order (target_gdbarch ()));
4866       offset += 4;
4867
4868       if (type == tfind_number)
4869         {
4870           /* Looking for a specific trace frame.  */
4871           if (tfnum == num)
4872             found = 1;
4873         }
4874       else
4875         {
4876           /* Start from the _next_ trace frame.  */
4877           if (tfnum > traceframe_number)
4878             {
4879               switch (type)
4880                 {
4881                 case tfind_pc:
4882                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4883                   if (tfaddr == addr1)
4884                     found = 1;
4885                   break;
4886                 case tfind_tp:
4887                   tp = get_tracepoint (num);
4888                   if (tp && tpnum == tp->number_on_target)
4889                     found = 1;
4890                   break;
4891                 case tfind_range:
4892                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4893                   if (addr1 <= tfaddr && tfaddr <= addr2)
4894                     found = 1;
4895                   break;
4896                 case tfind_outside:
4897                   tfaddr = tfile_get_traceframe_address (tframe_offset);
4898                   if (!(addr1 <= tfaddr && tfaddr <= addr2))
4899                     found = 1;
4900                   break;
4901                 default:
4902                   internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4903                 }
4904             }
4905         }
4906
4907       if (found)
4908         {
4909           if (tpp)
4910             *tpp = tpnum;
4911           cur_offset = offset;
4912           cur_data_size = data_size;
4913
4914           return tfnum;
4915         }
4916       /* Skip past the traceframe's data.  */
4917       lseek (trace_fd, data_size, SEEK_CUR);
4918       offset += data_size;
4919       /* Update our own count of traceframes.  */
4920       ++tfnum;
4921     }
4922   /* Did not find what we were looking for.  */
4923   if (tpp)
4924     *tpp = -1;
4925   return -1;
4926 }
4927
4928 /* Prototype of the callback passed to tframe_walk_blocks.  */
4929 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4930
4931 /* Callback for traceframe_walk_blocks, used to find a given block
4932    type in a traceframe.  */
4933
4934 static int
4935 match_blocktype (char blocktype, void *data)
4936 {
4937   char *wantedp = data;
4938
4939   if (*wantedp == blocktype)
4940     return 1;
4941
4942   return 0;
4943 }
4944
4945 /* Walk over all traceframe block starting at POS offset from
4946    CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4947    unmodified.  If CALLBACK returns true, this returns the position in
4948    the traceframe where the block is found, relative to the start of
4949    the traceframe (cur_offset).  Returns -1 if no callback call
4950    returned true, indicating that all blocks have been walked.  */
4951
4952 static int
4953 traceframe_walk_blocks (walk_blocks_callback_func callback,
4954                         int pos, void *data)
4955 {
4956   /* Iterate through a traceframe's blocks, looking for a block of the
4957      requested type.  */
4958
4959   lseek (trace_fd, cur_offset + pos, SEEK_SET);
4960   while (pos < cur_data_size)
4961     {
4962       unsigned short mlen;
4963       char block_type;
4964
4965       tfile_read ((gdb_byte *) &block_type, 1);
4966
4967       ++pos;
4968
4969       if ((*callback) (block_type, data))
4970         return pos;
4971
4972       switch (block_type)
4973         {
4974         case 'R':
4975           lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4976           pos += trace_regblock_size;
4977           break;
4978         case 'M':
4979           lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4980           tfile_read ((gdb_byte *) &mlen, 2);
4981           mlen = (unsigned short)
4982                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4983                                           gdbarch_byte_order
4984                                               (target_gdbarch ()));
4985           lseek (trace_fd, mlen, SEEK_CUR);
4986           pos += (8 + 2 + mlen);
4987           break;
4988         case 'V':
4989           lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4990           pos += (4 + 8);
4991           break;
4992         default:
4993           error (_("Unknown block type '%c' (0x%x) in trace frame"),
4994                  block_type, block_type);
4995           break;
4996         }
4997     }
4998
4999   return -1;
5000 }
5001
5002 /* Convenience wrapper around traceframe_walk_blocks.  Looks for the
5003    position offset of a block of type TYPE_WANTED in the current trace
5004    frame, starting at POS.  Returns -1 if no such block was found.  */
5005
5006 static int
5007 traceframe_find_block_type (char type_wanted, int pos)
5008 {
5009   return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
5010 }
5011
5012 /* Look for a block of saved registers in the traceframe, and get the
5013    requested register from it.  */
5014
5015 static void
5016 tfile_fetch_registers (struct target_ops *ops,
5017                        struct regcache *regcache, int regno)
5018 {
5019   struct gdbarch *gdbarch = get_regcache_arch (regcache);
5020   int offset, regn, regsize, pc_regno;
5021   gdb_byte *regs;
5022
5023   /* An uninitialized reg size says we're not going to be
5024      successful at getting register blocks.  */
5025   if (!trace_regblock_size)
5026     return;
5027
5028   regs = alloca (trace_regblock_size);
5029
5030   if (traceframe_find_block_type ('R', 0) >= 0)
5031     {
5032       tfile_read (regs, trace_regblock_size);
5033
5034       /* Assume the block is laid out in GDB register number order,
5035          each register with the size that it has in GDB.  */
5036       offset = 0;
5037       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
5038         {
5039           regsize = register_size (gdbarch, regn);
5040           /* Make sure we stay within block bounds.  */
5041           if (offset + regsize >= trace_regblock_size)
5042             break;
5043           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
5044             {
5045               if (regno == regn)
5046                 {
5047                   regcache_raw_supply (regcache, regno, regs + offset);
5048                   break;
5049                 }
5050               else if (regno == -1)
5051                 {
5052                   regcache_raw_supply (regcache, regn, regs + offset);
5053                 }
5054             }
5055           offset += regsize;
5056         }
5057       return;
5058     }
5059
5060   /* We get here if no register data has been found.  Mark registers
5061      as unavailable.  */
5062   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
5063     regcache_raw_supply (regcache, regn, NULL);
5064
5065   /* We can often usefully guess that the PC is going to be the same
5066      as the address of the tracepoint.  */
5067   pc_regno = gdbarch_pc_regnum (gdbarch);
5068   if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
5069     {
5070       struct tracepoint *tp = get_tracepoint (tracepoint_number);
5071
5072       if (tp && tp->base.loc)
5073         {
5074           /* But don't try to guess if tracepoint is multi-location...  */
5075           if (tp->base.loc->next)
5076             {
5077               warning (_("Tracepoint %d has multiple "
5078                          "locations, cannot infer $pc"),
5079                        tp->base.number);
5080               return;
5081             }
5082           /* ... or does while-stepping.  */
5083           if (tp->step_count > 0)
5084             {
5085               warning (_("Tracepoint %d does while-stepping, "
5086                          "cannot infer $pc"),
5087                        tp->base.number);
5088               return;
5089             }
5090
5091           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
5092                                   gdbarch_byte_order (gdbarch),
5093                                   tp->base.loc->address);
5094           regcache_raw_supply (regcache, pc_regno, regs);
5095         }
5096     }
5097 }
5098
5099 static LONGEST
5100 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
5101                     const char *annex, gdb_byte *readbuf,
5102                     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
5103 {
5104   /* We're only doing regular memory for now.  */
5105   if (object != TARGET_OBJECT_MEMORY)
5106     return -1;
5107
5108   if (readbuf == NULL)
5109     error (_("tfile_xfer_partial: trace file is read-only"));
5110
5111  if (traceframe_number != -1)
5112     {
5113       int pos = 0;
5114
5115       /* Iterate through the traceframe's blocks, looking for
5116          memory.  */
5117       while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
5118         {
5119           ULONGEST maddr, amt;
5120           unsigned short mlen;
5121           enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch ());
5122
5123           tfile_read ((gdb_byte *) &maddr, 8);
5124           maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5125                                             byte_order);
5126           tfile_read ((gdb_byte *) &mlen, 2);
5127           mlen = (unsigned short)
5128             extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
5129
5130           /* If the block includes the first part of the desired
5131              range, return as much it has; GDB will re-request the
5132              remainder, which might be in a different block of this
5133              trace frame.  */
5134           if (maddr <= offset && offset < (maddr + mlen))
5135             {
5136               amt = (maddr + mlen) - offset;
5137               if (amt > len)
5138                 amt = len;
5139
5140               if (maddr != offset)
5141                 lseek (trace_fd, offset - maddr, SEEK_CUR);
5142               tfile_read (readbuf, amt);
5143               return amt;
5144             }
5145
5146           /* Skip over this block.  */
5147           pos += (8 + 2 + mlen);
5148         }
5149     }
5150
5151   /* It's unduly pedantic to refuse to look at the executable for
5152      read-only pieces; so do the equivalent of readonly regions aka
5153      QTro packet.  */
5154   /* FIXME account for relocation at some point.  */
5155   if (exec_bfd)
5156     {
5157       asection *s;
5158       bfd_size_type size;
5159       bfd_vma vma;
5160
5161       for (s = exec_bfd->sections; s; s = s->next)
5162         {
5163           if ((s->flags & SEC_LOAD) == 0
5164               || (s->flags & SEC_READONLY) == 0)
5165             continue;
5166
5167           vma = s->vma;
5168           size = bfd_get_section_size (s);
5169           if (vma <= offset && offset < (vma + size))
5170             {
5171               ULONGEST amt;
5172
5173               amt = (vma + size) - offset;
5174               if (amt > len)
5175                 amt = len;
5176
5177               amt = bfd_get_section_contents (exec_bfd, s,
5178                                               readbuf, offset - vma, amt);
5179               return amt;
5180             }
5181         }
5182     }
5183
5184   /* Indicate failure to find the requested memory block.  */
5185   return -1;
5186 }
5187
5188 /* Iterate through the blocks of a trace frame, looking for a 'V'
5189    block with a matching tsv number.  */
5190
5191 static int
5192 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
5193 {
5194   int pos;
5195   int found = 0;
5196
5197   /* Iterate over blocks in current frame and find the last 'V'
5198      block in which tsv number is TSVNUM.  In one trace frame, there
5199      may be multiple 'V' blocks created for a given trace variable,
5200      and the last matched 'V' block contains the updated value.  */
5201   pos = 0;
5202   while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
5203     {
5204       int vnum;
5205
5206       tfile_read ((gdb_byte *) &vnum, 4);
5207       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
5208                                            gdbarch_byte_order
5209                                            (target_gdbarch ()));
5210       if (tsvnum == vnum)
5211         {
5212           tfile_read ((gdb_byte *) val, 8);
5213           *val = extract_signed_integer ((gdb_byte *) val, 8,
5214                                          gdbarch_byte_order
5215                                          (target_gdbarch ()));
5216           found = 1;
5217         }
5218       pos += (4 + 8);
5219     }
5220
5221   return found;
5222 }
5223
5224 static int
5225 tfile_has_all_memory (struct target_ops *ops)
5226 {
5227   return 1;
5228 }
5229
5230 static int
5231 tfile_has_memory (struct target_ops *ops)
5232 {
5233   return 1;
5234 }
5235
5236 static int
5237 tfile_has_stack (struct target_ops *ops)
5238 {
5239   return traceframe_number != -1;
5240 }
5241
5242 static int
5243 tfile_has_registers (struct target_ops *ops)
5244 {
5245   return traceframe_number != -1;
5246 }
5247
5248 /* Callback for traceframe_walk_blocks.  Builds a traceframe_info
5249    object for the tfile target's current traceframe.  */
5250
5251 static int
5252 build_traceframe_info (char blocktype, void *data)
5253 {
5254   struct traceframe_info *info = data;
5255
5256   switch (blocktype)
5257     {
5258     case 'M':
5259       {
5260         struct mem_range *r;
5261         ULONGEST maddr;
5262         unsigned short mlen;
5263
5264         tfile_read ((gdb_byte *) &maddr, 8);
5265         maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
5266                                           gdbarch_byte_order
5267                                           (target_gdbarch ()));
5268         tfile_read ((gdb_byte *) &mlen, 2);
5269         mlen = (unsigned short)
5270                 extract_unsigned_integer ((gdb_byte *) &mlen,
5271                                           2, gdbarch_byte_order
5272                                           (target_gdbarch ()));
5273
5274         r = VEC_safe_push (mem_range_s, info->memory, NULL);
5275
5276         r->start = maddr;
5277         r->length = mlen;
5278         break;
5279       }
5280     case 'V':
5281       {
5282         int vnum;
5283
5284         tfile_read ((gdb_byte *) &vnum, 4);
5285         VEC_safe_push (int, info->tvars, vnum);
5286       }
5287     case 'R':
5288     case 'S':
5289       {
5290         break;
5291       }
5292     default:
5293       warning (_("Unhandled trace block type (%d) '%c ' "
5294                  "while building trace frame info."),
5295                blocktype, blocktype);
5296       break;
5297     }
5298
5299   return 0;
5300 }
5301
5302 static struct traceframe_info *
5303 tfile_traceframe_info (void)
5304 {
5305   struct traceframe_info *info = XCNEW (struct traceframe_info);
5306
5307   traceframe_walk_blocks (build_traceframe_info, 0, info);
5308   return info;
5309 }
5310
5311 static void
5312 init_tfile_ops (void)
5313 {
5314   tfile_ops.to_shortname = "tfile";
5315   tfile_ops.to_longname = "Local trace dump file";
5316   tfile_ops.to_doc
5317     = "Use a trace file as a target.  Specify the filename of the trace file.";
5318   tfile_ops.to_open = tfile_open;
5319   tfile_ops.to_close = tfile_close;
5320   tfile_ops.to_fetch_registers = tfile_fetch_registers;
5321   tfile_ops.to_xfer_partial = tfile_xfer_partial;
5322   tfile_ops.to_files_info = tfile_files_info;
5323   tfile_ops.to_get_trace_status = tfile_get_trace_status;
5324   tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
5325   tfile_ops.to_trace_find = tfile_trace_find;
5326   tfile_ops.to_get_trace_state_variable_value
5327     = tfile_get_trace_state_variable_value;
5328   tfile_ops.to_stratum = process_stratum;
5329   tfile_ops.to_has_all_memory = tfile_has_all_memory;
5330   tfile_ops.to_has_memory = tfile_has_memory;
5331   tfile_ops.to_has_stack = tfile_has_stack;
5332   tfile_ops.to_has_registers = tfile_has_registers;
5333   tfile_ops.to_traceframe_info = tfile_traceframe_info;
5334   tfile_ops.to_magic = OPS_MAGIC;
5335 }
5336
5337 void
5338 free_current_marker (void *arg)
5339 {
5340   struct static_tracepoint_marker **marker_p = arg;
5341
5342   if (*marker_p != NULL)
5343     {
5344       release_static_tracepoint_marker (*marker_p);
5345       xfree (*marker_p);
5346     }
5347   else
5348     *marker_p = NULL;
5349 }
5350
5351 /* Given a line of text defining a static tracepoint marker, parse it
5352    into a "static tracepoint marker" object.  Throws an error is
5353    parsing fails.  If PP is non-null, it points to one past the end of
5354    the parsed marker definition.  */
5355
5356 void
5357 parse_static_tracepoint_marker_definition (char *line, char **pp,
5358                                            struct static_tracepoint_marker *marker)
5359 {
5360   char *p, *endp;
5361   ULONGEST addr;
5362   int end;
5363
5364   p = line;
5365   p = unpack_varlen_hex (p, &addr);
5366   p++;  /* skip a colon */
5367
5368   marker->gdbarch = target_gdbarch ();
5369   marker->address = (CORE_ADDR) addr;
5370
5371   endp = strchr (p, ':');
5372   if (endp == NULL)
5373     error (_("bad marker definition: %s"), line);
5374
5375   marker->str_id = xmalloc (endp - p + 1);
5376   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
5377   marker->str_id[end] = '\0';
5378
5379   p += 2 * end;
5380   p++;  /* skip a colon */
5381
5382   marker->extra = xmalloc (strlen (p) + 1);
5383   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
5384   marker->extra[end] = '\0';
5385
5386   if (pp)
5387     *pp = p;
5388 }
5389
5390 /* Release a static tracepoint marker's contents.  Note that the
5391    object itself isn't released here.  There objects are usually on
5392    the stack.  */
5393
5394 void
5395 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
5396 {
5397   xfree (marker->str_id);
5398   marker->str_id = NULL;
5399 }
5400
5401 /* Print MARKER to gdb_stdout.  */
5402
5403 static void
5404 print_one_static_tracepoint_marker (int count,
5405                                     struct static_tracepoint_marker *marker)
5406 {
5407   struct command_line *l;
5408   struct symbol *sym;
5409
5410   char wrap_indent[80];
5411   char extra_field_indent[80];
5412   struct ui_out *uiout = current_uiout;
5413   struct cleanup *bkpt_chain;
5414   VEC(breakpoint_p) *tracepoints;
5415
5416   struct symtab_and_line sal;
5417
5418   init_sal (&sal);
5419
5420   sal.pc = marker->address;
5421
5422   tracepoints = static_tracepoints_here (marker->address);
5423
5424   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
5425
5426   /* A counter field to help readability.  This is not a stable
5427      identifier!  */
5428   ui_out_field_int (uiout, "count", count);
5429
5430   ui_out_field_string (uiout, "marker-id", marker->str_id);
5431
5432   ui_out_field_fmt (uiout, "enabled", "%c",
5433                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
5434   ui_out_spaces (uiout, 2);
5435
5436   strcpy (wrap_indent, "                                   ");
5437
5438   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
5439     strcat (wrap_indent, "           ");
5440   else
5441     strcat (wrap_indent, "                   ");
5442
5443   strcpy (extra_field_indent, "         ");
5444
5445   ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
5446
5447   sal = find_pc_line (marker->address, 0);
5448   sym = find_pc_sect_function (marker->address, NULL);
5449   if (sym)
5450     {
5451       ui_out_text (uiout, "in ");
5452       ui_out_field_string (uiout, "func",
5453                            SYMBOL_PRINT_NAME (sym));
5454       ui_out_wrap_hint (uiout, wrap_indent);
5455       ui_out_text (uiout, " at ");
5456     }
5457   else
5458     ui_out_field_skip (uiout, "func");
5459
5460   if (sal.symtab != NULL)
5461     {
5462       ui_out_field_string (uiout, "file",
5463                            symtab_to_filename_for_display (sal.symtab));
5464       ui_out_text (uiout, ":");
5465
5466       if (ui_out_is_mi_like_p (uiout))
5467         {
5468           const char *fullname = symtab_to_fullname (sal.symtab);
5469
5470           ui_out_field_string (uiout, "fullname", fullname);
5471         }
5472       else
5473         ui_out_field_skip (uiout, "fullname");
5474
5475       ui_out_field_int (uiout, "line", sal.line);
5476     }
5477   else
5478     {
5479       ui_out_field_skip (uiout, "fullname");
5480       ui_out_field_skip (uiout, "line");
5481     }
5482
5483   ui_out_text (uiout, "\n");
5484   ui_out_text (uiout, extra_field_indent);
5485   ui_out_text (uiout, _("Data: \""));
5486   ui_out_field_string (uiout, "extra-data", marker->extra);
5487   ui_out_text (uiout, "\"\n");
5488
5489   if (!VEC_empty (breakpoint_p, tracepoints))
5490     {
5491       struct cleanup *cleanup_chain;
5492       int ix;
5493       struct breakpoint *b;
5494
5495       cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
5496                                                            "tracepoints-at");
5497
5498       ui_out_text (uiout, extra_field_indent);
5499       ui_out_text (uiout, _("Probed by static tracepoints: "));
5500       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
5501         {
5502           if (ix > 0)
5503             ui_out_text (uiout, ", ");
5504           ui_out_text (uiout, "#");
5505           ui_out_field_int (uiout, "tracepoint-id", b->number);
5506         }
5507
5508       do_cleanups (cleanup_chain);
5509
5510       if (ui_out_is_mi_like_p (uiout))
5511         ui_out_field_int (uiout, "number-of-tracepoints",
5512                           VEC_length(breakpoint_p, tracepoints));
5513       else
5514         ui_out_text (uiout, "\n");
5515     }
5516   VEC_free (breakpoint_p, tracepoints);
5517
5518   do_cleanups (bkpt_chain);
5519 }
5520
5521 static void
5522 info_static_tracepoint_markers_command (char *arg, int from_tty)
5523 {
5524   VEC(static_tracepoint_marker_p) *markers;
5525   struct cleanup *old_chain;
5526   struct static_tracepoint_marker *marker;
5527   struct ui_out *uiout = current_uiout;
5528   int i;
5529
5530   /* We don't have to check target_can_use_agent and agent's capability on
5531      static tracepoint here, in order to be compatible with older GDBserver.
5532      We don't check USE_AGENT is true or not, because static tracepoints
5533      don't work without in-process agent, so we don't bother users to type
5534      `set agent on' when to use static tracepoint.  */
5535
5536   old_chain
5537     = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
5538                                            "StaticTracepointMarkersTable");
5539
5540   ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
5541
5542   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
5543
5544   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
5545   if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
5546     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
5547   else
5548     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
5549   ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
5550
5551   ui_out_table_body (uiout);
5552
5553   markers = target_static_tracepoint_markers_by_strid (NULL);
5554   make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
5555
5556   for (i = 0;
5557        VEC_iterate (static_tracepoint_marker_p,
5558                     markers, i, marker);
5559        i++)
5560     {
5561       print_one_static_tracepoint_marker (i + 1, marker);
5562       release_static_tracepoint_marker (marker);
5563     }
5564
5565   do_cleanups (old_chain);
5566 }
5567
5568 /* The $_sdata convenience variable is a bit special.  We don't know
5569    for sure type of the value until we actually have a chance to fetch
5570    the data --- the size of the object depends on what has been
5571    collected.  We solve this by making $_sdata be an internalvar that
5572    creates a new value on access.  */
5573
5574 /* Return a new value with the correct type for the sdata object of
5575    the current trace frame.  Return a void value if there's no object
5576    available.  */
5577
5578 static struct value *
5579 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
5580                   void *ignore)
5581 {
5582   LONGEST size;
5583   gdb_byte *buf;
5584
5585   /* We need to read the whole object before we know its size.  */
5586   size = target_read_alloc (&current_target,
5587                             TARGET_OBJECT_STATIC_TRACE_DATA,
5588                             NULL, &buf);
5589   if (size >= 0)
5590     {
5591       struct value *v;
5592       struct type *type;
5593
5594       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
5595                                size);
5596       v = allocate_value (type);
5597       memcpy (value_contents_raw (v), buf, size);
5598       xfree (buf);
5599       return v;
5600     }
5601   else
5602     return allocate_value (builtin_type (gdbarch)->builtin_void);
5603 }
5604
5605 #if !defined(HAVE_LIBEXPAT)
5606
5607 struct traceframe_info *
5608 parse_traceframe_info (const char *tframe_info)
5609 {
5610   static int have_warned;
5611
5612   if (!have_warned)
5613     {
5614       have_warned = 1;
5615       warning (_("Can not parse XML trace frame info; XML support "
5616                  "was disabled at compile time"));
5617     }
5618
5619   return NULL;
5620 }
5621
5622 #else /* HAVE_LIBEXPAT */
5623
5624 #include "xml-support.h"
5625
5626 /* Handle the start of a <memory> element.  */
5627
5628 static void
5629 traceframe_info_start_memory (struct gdb_xml_parser *parser,
5630                               const struct gdb_xml_element *element,
5631                               void *user_data, VEC(gdb_xml_value_s) *attributes)
5632 {
5633   struct traceframe_info *info = user_data;
5634   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
5635   ULONGEST *start_p, *length_p;
5636
5637   start_p = xml_find_attribute (attributes, "start")->value;
5638   length_p = xml_find_attribute (attributes, "length")->value;
5639
5640   r->start = *start_p;
5641   r->length = *length_p;
5642 }
5643
5644 /* Handle the start of a <tvar> element.  */
5645
5646 static void
5647 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
5648                              const struct gdb_xml_element *element,
5649                              void *user_data,
5650                              VEC(gdb_xml_value_s) *attributes)
5651 {
5652   struct traceframe_info *info = user_data;
5653   const char *id_attrib = xml_find_attribute (attributes, "id")->value;
5654   int id = gdb_xml_parse_ulongest (parser, id_attrib);
5655
5656   VEC_safe_push (int, info->tvars, id);
5657 }
5658
5659 /* Discard the constructed trace frame info (if an error occurs).  */
5660
5661 static void
5662 free_result (void *p)
5663 {
5664   struct traceframe_info *result = p;
5665
5666   free_traceframe_info (result);
5667 }
5668
5669 /* The allowed elements and attributes for an XML memory map.  */
5670
5671 static const struct gdb_xml_attribute memory_attributes[] = {
5672   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5673   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
5674   { NULL, GDB_XML_AF_NONE, NULL, NULL }
5675 };
5676
5677 static const struct gdb_xml_attribute tvar_attributes[] = {
5678   { "id", GDB_XML_AF_NONE, NULL, NULL },
5679   { NULL, GDB_XML_AF_NONE, NULL, NULL }
5680 };
5681
5682 static const struct gdb_xml_element traceframe_info_children[] = {
5683   { "memory", memory_attributes, NULL,
5684     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5685     traceframe_info_start_memory, NULL },
5686   { "tvar", tvar_attributes, NULL,
5687     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5688     traceframe_info_start_tvar, NULL },
5689   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5690 };
5691
5692 static const struct gdb_xml_element traceframe_info_elements[] = {
5693   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5694     NULL, NULL },
5695   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5696 };
5697
5698 /* Parse a traceframe-info XML document.  */
5699
5700 struct traceframe_info *
5701 parse_traceframe_info (const char *tframe_info)
5702 {
5703   struct traceframe_info *result;
5704   struct cleanup *back_to;
5705
5706   result = XCNEW (struct traceframe_info);
5707   back_to = make_cleanup (free_result, result);
5708
5709   if (gdb_xml_parse_quick (_("trace frame info"),
5710                            "traceframe-info.dtd", traceframe_info_elements,
5711                            tframe_info, result) == 0)
5712     {
5713       /* Parsed successfully, keep the result.  */
5714       discard_cleanups (back_to);
5715
5716       return result;
5717     }
5718
5719   do_cleanups (back_to);
5720   return NULL;
5721 }
5722
5723 #endif /* HAVE_LIBEXPAT */
5724
5725 /* Returns the traceframe_info object for the current traceframe.
5726    This is where we avoid re-fetching the object from the target if we
5727    already have it cached.  */
5728
5729 struct traceframe_info *
5730 get_traceframe_info (void)
5731 {
5732   if (traceframe_info == NULL)
5733     traceframe_info = target_traceframe_info ();
5734
5735   return traceframe_info;
5736 }
5737
5738 /* If the target supports the query, return in RESULT the set of
5739    collected memory in the current traceframe, found within the LEN
5740    bytes range starting at MEMADDR.  Returns true if the target
5741    supports the query, otherwise returns false, and RESULT is left
5742    undefined.  */
5743
5744 int
5745 traceframe_available_memory (VEC(mem_range_s) **result,
5746                              CORE_ADDR memaddr, ULONGEST len)
5747 {
5748   struct traceframe_info *info = get_traceframe_info ();
5749
5750   if (info != NULL)
5751     {
5752       struct mem_range *r;
5753       int i;
5754
5755       *result = NULL;
5756
5757       for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5758         if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5759           {
5760             ULONGEST lo1, hi1, lo2, hi2;
5761             struct mem_range *nr;
5762
5763             lo1 = memaddr;
5764             hi1 = memaddr + len;
5765
5766             lo2 = r->start;
5767             hi2 = r->start + r->length;
5768
5769             nr = VEC_safe_push (mem_range_s, *result, NULL);
5770
5771             nr->start = max (lo1, lo2);
5772             nr->length = min (hi1, hi2) - nr->start;
5773           }
5774
5775       normalize_mem_ranges (*result);
5776       return 1;
5777     }
5778
5779   return 0;
5780 }
5781
5782 /* Implementation of `sdata' variable.  */
5783
5784 static const struct internalvar_funcs sdata_funcs =
5785 {
5786   sdata_make_value,
5787   NULL,
5788   NULL
5789 };
5790
5791 /* module initialization */
5792 void
5793 _initialize_tracepoint (void)
5794 {
5795   struct cmd_list_element *c;
5796
5797   /* Explicitly create without lookup, since that tries to create a
5798      value with a void typed value, and when we get here, gdbarch
5799      isn't initialized yet.  At this point, we're quite sure there
5800      isn't another convenience variable of the same name.  */
5801   create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
5802
5803   traceframe_number = -1;
5804   tracepoint_number = -1;
5805
5806   add_info ("scope", scope_info,
5807             _("List the variables local to a scope"));
5808
5809   add_cmd ("tracepoints", class_trace, NULL,
5810            _("Tracing of program execution without stopping the program."),
5811            &cmdlist);
5812
5813   add_com ("tdump", class_trace, trace_dump_command,
5814            _("Print everything collected at the current tracepoint."));
5815
5816   add_com ("tsave", class_trace, trace_save_command, _("\
5817 Save the trace data to a file.\n\
5818 Use the '-ctf' option to save the data to CTF format.\n\
5819 Use the '-r' option to direct the target to save directly to the file,\n\
5820 using its own filesystem."));
5821
5822   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5823 Define a trace state variable.\n\
5824 Argument is a $-prefixed name, optionally followed\n\
5825 by '=' and an expression that sets the initial value\n\
5826 at the start of tracing."));
5827   set_cmd_completer (c, expression_completer);
5828
5829   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5830 Delete one or more trace state variables.\n\
5831 Arguments are the names of the variables to delete.\n\
5832 If no arguments are supplied, delete all variables."), &deletelist);
5833   /* FIXME add a trace variable completer.  */
5834
5835   add_info ("tvariables", tvariables_info, _("\
5836 Status of trace state variables and their values.\n\
5837 "));
5838
5839   add_info ("static-tracepoint-markers",
5840             info_static_tracepoint_markers_command, _("\
5841 List target static tracepoints markers.\n\
5842 "));
5843
5844   add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5845 Select a trace frame;\n\
5846 No argument means forward by one frame; '-' means backward by one frame."),
5847                   &tfindlist, "tfind ", 1, &cmdlist);
5848
5849   add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5850 Select a trace frame whose PC is outside the given range (exclusive).\n\
5851 Usage: tfind outside addr1, addr2"),
5852            &tfindlist);
5853
5854   add_cmd ("range", class_trace, trace_find_range_command, _("\
5855 Select a trace frame whose PC is in the given range (inclusive).\n\
5856 Usage: tfind range addr1,addr2"),
5857            &tfindlist);
5858
5859   add_cmd ("line", class_trace, trace_find_line_command, _("\
5860 Select a trace frame by source line.\n\
5861 Argument can be a line number (with optional source file),\n\
5862 a function name, or '*' followed by an address.\n\
5863 Default argument is 'the next source line that was traced'."),
5864            &tfindlist);
5865
5866   add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5867 Select a trace frame by tracepoint number.\n\
5868 Default is the tracepoint for the current trace frame."),
5869            &tfindlist);
5870
5871   add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5872 Select a trace frame by PC.\n\
5873 Default is the current PC, or the PC of the current trace frame."),
5874            &tfindlist);
5875
5876   add_cmd ("end", class_trace, trace_find_end_command, _("\
5877 De-select any trace frame and resume 'live' debugging."),
5878            &tfindlist);
5879
5880   add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
5881
5882   add_cmd ("start", class_trace, trace_find_start_command,
5883            _("Select the first trace frame in the trace buffer."),
5884            &tfindlist);
5885
5886   add_com ("tstatus", class_trace, trace_status_command,
5887            _("Display the status of the current trace data collection."));
5888
5889   add_com ("tstop", class_trace, trace_stop_command, _("\
5890 Stop trace data collection.\n\
5891 Usage: tstop [ <notes> ... ]\n\
5892 Any arguments supplied are recorded with the trace as a stop reason and\n\
5893 reported by tstatus (if the target supports trace notes)."));
5894
5895   add_com ("tstart", class_trace, trace_start_command, _("\
5896 Start trace data collection.\n\
5897 Usage: tstart [ <notes> ... ]\n\
5898 Any arguments supplied are recorded with the trace as a note and\n\
5899 reported by tstatus (if the target supports trace notes)."));
5900
5901   add_com ("end", class_trace, end_actions_pseudocommand, _("\
5902 Ends a list of commands or actions.\n\
5903 Several GDB commands allow you to enter a list of commands or actions.\n\
5904 Entering \"end\" on a line by itself is the normal way to terminate\n\
5905 such a list.\n\n\
5906 Note: the \"end\" command cannot be used at the gdb prompt."));
5907
5908   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5909 Specify single-stepping behavior at a tracepoint.\n\
5910 Argument is number of instructions to trace in single-step mode\n\
5911 following the tracepoint.  This command is normally followed by\n\
5912 one or more \"collect\" commands, to specify what to collect\n\
5913 while single-stepping.\n\n\
5914 Note: this command can only be used in a tracepoint \"actions\" list."));
5915
5916   add_com_alias ("ws", "while-stepping", class_alias, 0);
5917   add_com_alias ("stepping", "while-stepping", class_alias, 0);
5918
5919   add_com ("collect", class_trace, collect_pseudocommand, _("\
5920 Specify one or more data items to be collected at a tracepoint.\n\
5921 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
5922 collect all data (variables, registers) referenced by that expression.\n\
5923 Also accepts the following special arguments:\n\
5924     $regs   -- all registers.\n\
5925     $args   -- all function arguments.\n\
5926     $locals -- all variables local to the block/function scope.\n\
5927     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5928 Note: this command can only be used in a tracepoint \"actions\" list."));
5929
5930   add_com ("teval", class_trace, teval_pseudocommand, _("\
5931 Specify one or more expressions to be evaluated at a tracepoint.\n\
5932 Accepts a comma-separated list of (one or more) expressions.\n\
5933 The result of each evaluation will be discarded.\n\
5934 Note: this command can only be used in a tracepoint \"actions\" list."));
5935
5936   add_com ("actions", class_trace, trace_actions_command, _("\
5937 Specify the actions to be taken at a tracepoint.\n\
5938 Tracepoint actions may include collecting of specified data,\n\
5939 single-stepping, or enabling/disabling other tracepoints,\n\
5940 depending on target's capabilities."));
5941
5942   default_collect = xstrdup ("");
5943   add_setshow_string_cmd ("default-collect", class_trace,
5944                           &default_collect, _("\
5945 Set the list of expressions to collect by default"), _("\
5946 Show the list of expressions to collect by default"), NULL,
5947                           NULL, NULL,
5948                           &setlist, &showlist);
5949
5950   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5951                            &disconnected_tracing, _("\
5952 Set whether tracing continues after GDB disconnects."), _("\
5953 Show whether tracing continues after GDB disconnects."), _("\
5954 Use this to continue a tracing run even if GDB disconnects\n\
5955 or detaches from the target.  You can reconnect later and look at\n\
5956 trace data collected in the meantime."),
5957                            set_disconnected_tracing,
5958                            NULL,
5959                            &setlist,
5960                            &showlist);
5961
5962   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5963                            &circular_trace_buffer, _("\
5964 Set target's use of circular trace buffer."), _("\
5965 Show target's use of circular trace buffer."), _("\
5966 Use this to make the trace buffer into a circular buffer,\n\
5967 which will discard traceframes (oldest first) instead of filling\n\
5968 up and stopping the trace run."),
5969                            set_circular_trace_buffer,
5970                            NULL,
5971                            &setlist,
5972                            &showlist);
5973
5974   add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
5975                                        &trace_buffer_size, _("\
5976 Set requested size of trace buffer."), _("\
5977 Show requested size of trace buffer."), _("\
5978 Use this to choose a size for the trace buffer.  Some targets\n\
5979 may have fixed or limited buffer sizes.  Specifying \"unlimited\" or -1\n\
5980 disables any attempt to set the buffer size and lets the target choose."),
5981                                        set_trace_buffer_size, NULL,
5982                                        &setlist, &showlist);
5983
5984   add_setshow_string_cmd ("trace-user", class_trace,
5985                           &trace_user, _("\
5986 Set the user name to use for current and future trace runs"), _("\
5987 Show the user name to use for current and future trace runs"), NULL,
5988                           set_trace_user, NULL,
5989                           &setlist, &showlist);
5990
5991   add_setshow_string_cmd ("trace-notes", class_trace,
5992                           &trace_notes, _("\
5993 Set notes string to use for current and future trace runs"), _("\
5994 Show the notes string to use for current and future trace runs"), NULL,
5995                           set_trace_notes, NULL,
5996                           &setlist, &showlist);
5997
5998   add_setshow_string_cmd ("trace-stop-notes", class_trace,
5999                           &trace_stop_notes, _("\
6000 Set notes string to use for future tstop commands"), _("\
6001 Show the notes string to use for future tstop commands"), NULL,
6002                           set_trace_stop_notes, NULL,
6003                           &setlist, &showlist);
6004
6005   init_tfile_ops ();
6006
6007   add_target_with_completer (&tfile_ops, filename_completer);
6008 }