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