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