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