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