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