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