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