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