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