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