the "ambiguous linespec" series
[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[20];
3486   int try_num = 0;
3487   struct trace_state_variable *tsv;
3488
3489   if (utsv->name)
3490     {
3491       namebase = utsv->name;
3492       sprintf (buf, "%s", namebase);
3493     }
3494   else
3495     {
3496       namebase = "__tsv";
3497       sprintf (buf, "%s_%d", namebase, try_num++);
3498     }
3499
3500   /* Fish for a name that is not in use.  */
3501   /* (should check against all internal vars?)  */
3502   while (find_trace_state_variable (buf))
3503     sprintf (buf, "%s_%d", namebase, try_num++);
3504
3505   /* We have an available name, create the variable.  */
3506   tsv = create_trace_state_variable (buf);
3507   tsv->initial_value = utsv->initial_value;
3508   tsv->builtin = utsv->builtin;
3509
3510   return tsv;
3511 }
3512
3513 /* Given a list of uploaded trace state variables, try to match them
3514    up with existing variables, or create additional ones.  */
3515
3516 void
3517 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3518 {
3519   int ix;
3520   struct uploaded_tsv *utsv;
3521   struct trace_state_variable *tsv;
3522   int highest;
3523
3524   /* Most likely some numbers will have to be reassigned as part of
3525      the merge, so clear them all in anticipation.  */
3526   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3527     tsv->number = 0;
3528
3529   for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3530     {
3531       tsv = find_matching_tsv (utsv);
3532       if (tsv)
3533         {
3534           if (info_verbose)
3535             printf_filtered (_("Assuming trace state variable $%s "
3536                                "is same as target's variable %d.\n"),
3537                              tsv->name, utsv->number);
3538         }
3539       else
3540         {
3541           tsv = create_tsv_from_upload (utsv);
3542           if (info_verbose)
3543             printf_filtered (_("Created trace state variable "
3544                                "$%s for target's variable %d.\n"),
3545                              tsv->name, utsv->number);
3546         }
3547       /* Give precedence to numberings that come from the target.  */
3548       if (tsv)
3549         tsv->number = utsv->number;
3550     }
3551
3552   /* Renumber everything that didn't get a target-assigned number.  */
3553   highest = 0;
3554   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3555     if (tsv->number > highest)
3556       highest = tsv->number;
3557
3558   ++highest;
3559   for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3560     if (tsv->number == 0)
3561       tsv->number = highest++;
3562
3563   free_uploaded_tsvs (uploaded_tsvs);
3564 }
3565
3566 /* target tfile command */
3567
3568 struct target_ops tfile_ops;
3569
3570 /* Fill in tfile_ops with its defined operations and properties.  */
3571
3572 #define TRACE_HEADER_SIZE 8
3573
3574 char *trace_filename;
3575 int trace_fd = -1;
3576 off_t trace_frames_offset;
3577 off_t cur_offset;
3578 int cur_traceframe_number;
3579 int cur_data_size;
3580 int trace_regblock_size;
3581
3582 static void tfile_interp_line (char *line,
3583                                struct uploaded_tp **utpp,
3584                                struct uploaded_tsv **utsvp);
3585
3586 /* Read SIZE bytes into READBUF from the trace frame, starting at
3587    TRACE_FD's current position.  Note that this call `read'
3588    underneath, hence it advances the file's seek position.  Throws an
3589    error if the `read' syscall fails, or less than SIZE bytes are
3590    read.  */
3591
3592 static void
3593 tfile_read (gdb_byte *readbuf, int size)
3594 {
3595   int gotten;
3596
3597   gotten = read (trace_fd, readbuf, size);
3598   if (gotten < 0)
3599     perror_with_name (trace_filename);
3600   else if (gotten < size)
3601     error (_("Premature end of file while reading trace file"));
3602 }
3603
3604 static void
3605 tfile_open (char *filename, int from_tty)
3606 {
3607   volatile struct gdb_exception ex;
3608   char *temp;
3609   struct cleanup *old_chain;
3610   int flags;
3611   int scratch_chan;
3612   char header[TRACE_HEADER_SIZE];
3613   char linebuf[1000]; /* Should be max remote packet size or so.  */
3614   char byte;
3615   int bytes, i;
3616   struct trace_status *ts;
3617   struct uploaded_tp *uploaded_tps = NULL;
3618   struct uploaded_tsv *uploaded_tsvs = NULL;
3619
3620   target_preopen (from_tty);
3621   if (!filename)
3622     error (_("No trace file specified."));
3623
3624   filename = tilde_expand (filename);
3625   if (!IS_ABSOLUTE_PATH(filename))
3626     {
3627       temp = concat (current_directory, "/", filename, (char *) NULL);
3628       xfree (filename);
3629       filename = temp;
3630     }
3631
3632   old_chain = make_cleanup (xfree, filename);
3633
3634   flags = O_BINARY | O_LARGEFILE;
3635   flags |= O_RDONLY;
3636   scratch_chan = open (filename, flags, 0);
3637   if (scratch_chan < 0)
3638     perror_with_name (filename);
3639
3640   /* Looks semi-reasonable.  Toss the old trace file and work on the new.  */
3641
3642   discard_cleanups (old_chain); /* Don't free filename any more.  */
3643   unpush_target (&tfile_ops);
3644
3645   trace_filename = xstrdup (filename);
3646   trace_fd = scratch_chan;
3647
3648   bytes = 0;
3649   /* Read the file header and test for validity.  */
3650   tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
3651
3652   bytes += TRACE_HEADER_SIZE;
3653   if (!(header[0] == 0x7f
3654         && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3655     error (_("File is not a valid trace file."));
3656
3657   push_target (&tfile_ops);
3658
3659   trace_regblock_size = 0;
3660   ts = current_trace_status ();
3661   /* We know we're working with a file.  */
3662   ts->from_file = 1;
3663   /* Set defaults in case there is no status line.  */
3664   ts->running_known = 0;
3665   ts->stop_reason = trace_stop_reason_unknown;
3666   ts->traceframe_count = -1;
3667   ts->buffer_free = 0;
3668   ts->disconnected_tracing = 0;
3669   ts->circular_buffer = 0;
3670
3671   cur_traceframe_number = -1;
3672
3673   TRY_CATCH (ex, RETURN_MASK_ALL)
3674     {
3675       /* Read through a section of newline-terminated lines that
3676          define things like tracepoints.  */
3677       i = 0;
3678       while (1)
3679         {
3680           tfile_read (&byte, 1);
3681
3682           ++bytes;
3683           if (byte == '\n')
3684             {
3685               /* Empty line marks end of the definition section.  */
3686               if (i == 0)
3687                 break;
3688               linebuf[i] = '\0';
3689               i = 0;
3690               tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3691             }
3692           else
3693             linebuf[i++] = byte;
3694           if (i >= 1000)
3695             error (_("Excessively long lines in trace file"));
3696         }
3697
3698       /* Record the starting offset of the binary trace data.  */
3699       trace_frames_offset = bytes;
3700
3701       /* If we don't have a blocksize, we can't interpret the
3702          traceframes.  */
3703       if (trace_regblock_size == 0)
3704         error (_("No register block size recorded in trace file"));
3705     }
3706   if (ex.reason < 0)
3707     {
3708       /* Pop the partially set up target.  */
3709       pop_target ();
3710       throw_exception (ex);
3711     }
3712
3713   inferior_appeared (current_inferior (), TFILE_PID);
3714   inferior_ptid = pid_to_ptid (TFILE_PID);
3715   add_thread_silent (inferior_ptid);
3716
3717   if (ts->traceframe_count <= 0)
3718     warning (_("No traceframes present in this file."));
3719
3720   /* Add the file's tracepoints and variables into the current mix.  */
3721
3722   /* Get trace state variables first, they may be checked when parsing
3723      uploaded commands.  */
3724   merge_uploaded_trace_state_variables (&uploaded_tsvs);
3725
3726   merge_uploaded_tracepoints (&uploaded_tps);
3727
3728   post_create_inferior (&tfile_ops, from_tty);
3729 }
3730
3731 /* Interpret the given line from the definitions part of the trace
3732    file.  */
3733
3734 static void
3735 tfile_interp_line (char *line,
3736                    struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3737 {
3738   char *p = line;
3739
3740   if (strncmp (p, "R ", strlen ("R ")) == 0)
3741     {
3742       p += strlen ("R ");
3743       trace_regblock_size = strtol (p, &p, 16);
3744     }
3745   else if (strncmp (p, "status ", strlen ("status ")) == 0)
3746     {
3747       p += strlen ("status ");
3748       parse_trace_status (p, current_trace_status ());
3749     }
3750   else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3751     {
3752       p += strlen ("tp ");
3753       parse_tracepoint_definition (p, utpp);
3754     }
3755   else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3756     {
3757       p += strlen ("tsv ");
3758       parse_tsv_definition (p, utsvp);
3759     }
3760   else
3761     warning (_("Ignoring trace file definition \"%s\""), line);
3762 }
3763
3764 /* Parse the part of trace status syntax that is shared between
3765    the remote protocol and the trace file reader.  */
3766
3767 void
3768 parse_trace_status (char *line, struct trace_status *ts)
3769 {
3770   char *p = line, *p1, *p2, *p3, *p_temp;
3771   int end;
3772   ULONGEST val;
3773
3774   ts->running_known = 1;
3775   ts->running = (*p++ == '1');
3776   ts->stop_reason = trace_stop_reason_unknown;
3777   xfree (ts->stop_desc);
3778   ts->stop_desc = NULL;
3779   ts->traceframe_count = -1;
3780   ts->traceframes_created = -1;
3781   ts->buffer_free = -1;
3782   ts->buffer_size = -1;
3783   ts->disconnected_tracing = 0;
3784   ts->circular_buffer = 0;
3785   xfree (ts->user_name);
3786   ts->user_name = NULL;
3787   xfree (ts->notes);
3788   ts->notes = NULL;
3789   ts->start_time = ts->stop_time = 0;
3790
3791   while (*p++)
3792     {
3793       p1 = strchr (p, ':');
3794       if (p1 == NULL)
3795         error (_("Malformed trace status, at %s\n\
3796 Status line: '%s'\n"), p, line);
3797       p3 = strchr (p, ';');
3798       if (p3 == NULL)
3799         p3 = p + strlen (p);
3800       if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3801         {
3802           p = unpack_varlen_hex (++p1, &val);
3803           ts->stop_reason = trace_buffer_full;
3804         }
3805       else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3806         {
3807           p = unpack_varlen_hex (++p1, &val);
3808           ts->stop_reason = trace_never_run;
3809         }
3810       else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3811                         p1 - p) == 0)
3812         {
3813           p = unpack_varlen_hex (++p1, &val);
3814           ts->stop_reason = tracepoint_passcount;
3815           ts->stopping_tracepoint = val;
3816         }
3817       else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3818         {
3819           p2 = strchr (++p1, ':');
3820           if (!p2 || p2 > p3)
3821             {
3822               /*older style*/
3823               p2 = p1;
3824             }
3825           else if (p2 != p1)
3826             {
3827               ts->stop_desc = xmalloc (strlen (line));
3828               end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3829               ts->stop_desc[end] = '\0';
3830             }
3831           else
3832             ts->stop_desc = xstrdup ("");
3833
3834           p = unpack_varlen_hex (++p2, &val);
3835           ts->stop_reason = tstop_command;
3836         }
3837       else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3838         {
3839           p = unpack_varlen_hex (++p1, &val);
3840           ts->stop_reason = trace_disconnected;
3841         }
3842       else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3843         {
3844           p2 = strchr (++p1, ':');
3845           if (p2 != p1)
3846             {
3847               ts->stop_desc = xmalloc ((p2 - p1) / 2 + 1);
3848               end = hex2bin (p1, ts->stop_desc, (p2 - p1) / 2);
3849               ts->stop_desc[end] = '\0';
3850             }
3851           else
3852             ts->stop_desc = xstrdup ("");
3853
3854           p = unpack_varlen_hex (++p2, &val);
3855           ts->stopping_tracepoint = val;
3856           ts->stop_reason = tracepoint_error;
3857         }
3858       else if (strncmp (p, "tframes", p1 - p) == 0)
3859         {
3860           p = unpack_varlen_hex (++p1, &val);
3861           ts->traceframe_count = val;
3862         }
3863       else if (strncmp (p, "tcreated", p1 - p) == 0)
3864         {
3865           p = unpack_varlen_hex (++p1, &val);
3866           ts->traceframes_created = val;
3867         }
3868       else if (strncmp (p, "tfree", p1 - p) == 0)
3869         {
3870           p = unpack_varlen_hex (++p1, &val);
3871           ts->buffer_free = val;
3872         }
3873       else if (strncmp (p, "tsize", p1 - p) == 0)
3874         {
3875           p = unpack_varlen_hex (++p1, &val);
3876           ts->buffer_size = val;
3877         }
3878       else if (strncmp (p, "disconn", p1 - p) == 0)
3879         {
3880           p = unpack_varlen_hex (++p1, &val);
3881           ts->disconnected_tracing = val;
3882         }
3883       else if (strncmp (p, "circular", p1 - p) == 0)
3884         {
3885           p = unpack_varlen_hex (++p1, &val);
3886           ts->circular_buffer = val;
3887         }
3888       else if (strncmp (p, "starttime", p1 - p) == 0)
3889         {
3890           p = unpack_varlen_hex (++p1, &val);
3891           ts->start_time = val;
3892         }
3893       else if (strncmp (p, "stoptime", p1 - p) == 0)
3894         {
3895           p = unpack_varlen_hex (++p1, &val);
3896           ts->stop_time = val;
3897         }
3898       else if (strncmp (p, "username", p1 - p) == 0)
3899         {
3900           ++p1;
3901           ts->user_name = xmalloc (strlen (p) / 2);
3902           end = hex2bin (p1, ts->user_name, (p3 - p1)  / 2);
3903           ts->user_name[end] = '\0';
3904           p = p3;
3905         }
3906       else if (strncmp (p, "notes", p1 - p) == 0)
3907         {
3908           ++p1;
3909           ts->notes = xmalloc (strlen (p) / 2);
3910           end = hex2bin (p1, ts->notes, (p3 - p1) / 2);
3911           ts->notes[end] = '\0';
3912           p = p3;
3913         }
3914       else
3915         {
3916           /* Silently skip unknown optional info.  */
3917           p_temp = strchr (p1 + 1, ';');
3918           if (p_temp)
3919             p = p_temp;
3920           else
3921             /* Must be at the end.  */
3922             break;
3923         }
3924     }
3925 }
3926
3927 void
3928 parse_tracepoint_status (char *p, struct breakpoint *bp,
3929                          struct uploaded_tp *utp)
3930 {
3931   ULONGEST uval;
3932   struct tracepoint *tp = (struct tracepoint *) bp;
3933
3934   p = unpack_varlen_hex (p, &uval);
3935   if (tp)
3936     tp->base.hit_count += uval;
3937   else
3938     utp->hit_count += uval;
3939   p = unpack_varlen_hex (p + 1, &uval);
3940   if (tp)
3941     tp->traceframe_usage += uval;
3942   else
3943     utp->traceframe_usage += uval;
3944   /* Ignore any extra, allowing for future extensions.  */
3945 }
3946
3947 /* Given a line of text defining a part of a tracepoint, parse it into
3948    an "uploaded tracepoint".  */
3949
3950 void
3951 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3952 {
3953   char *p;
3954   char piece;
3955   ULONGEST num, addr, step, pass, orig_size, xlen, start;
3956   int enabled, end;
3957   enum bptype type;
3958   char *cond, *srctype, *buf;
3959   struct uploaded_tp *utp = NULL;
3960
3961   p = line;
3962   /* Both tracepoint and action definitions start with the same number
3963      and address sequence.  */
3964   piece = *p++;
3965   p = unpack_varlen_hex (p, &num);
3966   p++;  /* skip a colon */
3967   p = unpack_varlen_hex (p, &addr);
3968   p++;  /* skip a colon */
3969   if (piece == 'T')
3970     {
3971       enabled = (*p++ == 'E');
3972       p++;  /* skip a colon */
3973       p = unpack_varlen_hex (p, &step);
3974       p++;  /* skip a colon */
3975       p = unpack_varlen_hex (p, &pass);
3976       type = bp_tracepoint;
3977       cond = NULL;
3978       /* Thumb through optional fields.  */
3979       while (*p == ':')
3980         {
3981           p++;  /* skip a colon */
3982           if (*p == 'F')
3983             {
3984               type = bp_fast_tracepoint;
3985               p++;
3986               p = unpack_varlen_hex (p, &orig_size);
3987             }
3988           else if (*p == 'S')
3989             {
3990               type = bp_static_tracepoint;
3991               p++;
3992             }
3993           else if (*p == 'X')
3994             {
3995               p++;
3996               p = unpack_varlen_hex (p, &xlen);
3997               p++;  /* skip a comma */
3998               cond = (char *) xmalloc (2 * xlen + 1);
3999               strncpy (cond, p, 2 * xlen);
4000               cond[2 * xlen] = '\0';
4001               p += 2 * xlen;
4002             }
4003           else
4004             warning (_("Unrecognized char '%c' in tracepoint "
4005                        "definition, skipping rest"), *p);
4006         }
4007       utp = get_uploaded_tp (num, addr, utpp);
4008       utp->type = type;
4009       utp->enabled = enabled;
4010       utp->step = step;
4011       utp->pass = pass;
4012       utp->cond = cond;
4013     }
4014   else if (piece == 'A')
4015     {
4016       utp = get_uploaded_tp (num, addr, utpp);
4017       VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
4018     }
4019   else if (piece == 'S')
4020     {
4021       utp = get_uploaded_tp (num, addr, utpp);
4022       VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
4023     }
4024   else if (piece == 'Z')
4025     {
4026       /* Parse a chunk of source form definition.  */
4027       utp = get_uploaded_tp (num, addr, utpp);
4028       srctype = p;
4029       p = strchr (p, ':');
4030       p++;  /* skip a colon */
4031       p = unpack_varlen_hex (p, &start);
4032       p++;  /* skip a colon */
4033       p = unpack_varlen_hex (p, &xlen);
4034       p++;  /* skip a colon */
4035
4036       buf = alloca (strlen (line));
4037
4038       end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4039       buf[end] = '\0';
4040
4041       if (strncmp (srctype, "at:", strlen ("at:")) == 0)
4042         utp->at_string = xstrdup (buf);
4043       else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
4044         utp->cond_string = xstrdup (buf);
4045       else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
4046         VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
4047     }
4048   else if (piece == 'V')
4049     {
4050       utp = get_uploaded_tp (num, addr, utpp);
4051
4052       parse_tracepoint_status (p, NULL, utp);
4053     }
4054   else
4055     {
4056       /* Don't error out, the target might be sending us optional
4057          info that we don't care about.  */
4058       warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
4059     }
4060 }
4061
4062 /* Convert a textual description of a trace state variable into an
4063    uploaded object.  */
4064
4065 void
4066 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
4067 {
4068   char *p, *buf;
4069   ULONGEST num, initval, builtin;
4070   int end;
4071   struct uploaded_tsv *utsv = NULL;
4072
4073   buf = alloca (strlen (line));
4074
4075   p = line;
4076   p = unpack_varlen_hex (p, &num);
4077   p++; /* skip a colon */
4078   p = unpack_varlen_hex (p, &initval);
4079   p++; /* skip a colon */
4080   p = unpack_varlen_hex (p, &builtin);
4081   p++; /* skip a colon */
4082   end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
4083   buf[end] = '\0';
4084
4085   utsv = get_uploaded_tsv (num, utsvp);
4086   utsv->initial_value = initval;
4087   utsv->builtin = builtin;
4088   utsv->name = xstrdup (buf);
4089 }
4090
4091 /* Close the trace file and generally clean up.  */
4092
4093 static void
4094 tfile_close (int quitting)
4095 {
4096   int pid;
4097
4098   if (trace_fd < 0)
4099     return;
4100
4101   pid = ptid_get_pid (inferior_ptid);
4102   inferior_ptid = null_ptid;    /* Avoid confusion from thread stuff.  */
4103   exit_inferior_silent (pid);
4104
4105   close (trace_fd);
4106   trace_fd = -1;
4107   xfree (trace_filename);
4108   trace_filename = NULL;
4109 }
4110
4111 static void
4112 tfile_files_info (struct target_ops *t)
4113 {
4114   /* (it would be useful to mention the name of the file).  */
4115   printf_filtered ("Looking at a trace file.\n");
4116 }
4117
4118 /* The trace status for a file is that tracing can never be run.  */
4119
4120 static int
4121 tfile_get_trace_status (struct trace_status *ts)
4122 {
4123   /* Other bits of trace status were collected as part of opening the
4124      trace files, so nothing to do here.  */
4125
4126   return -1;
4127 }
4128
4129 static void
4130 tfile_get_tracepoint_status (struct breakpoint *tp, struct uploaded_tp *utp)
4131 {
4132   /* Other bits of trace status were collected as part of opening the
4133      trace files, so nothing to do here.  */
4134 }
4135
4136 /* Given the position of a traceframe in the file, figure out what
4137    address the frame was collected at.  This would normally be the
4138    value of a collected PC register, but if not available, we
4139    improvise.  */
4140
4141 static ULONGEST
4142 tfile_get_traceframe_address (off_t tframe_offset)
4143 {
4144   ULONGEST addr = 0;
4145   short tpnum;
4146   struct tracepoint *tp;
4147   off_t saved_offset = cur_offset;
4148
4149   /* FIXME dig pc out of collected registers.  */
4150
4151   /* Fall back to using tracepoint address.  */
4152   lseek (trace_fd, tframe_offset, SEEK_SET);
4153   tfile_read ((gdb_byte *) &tpnum, 2);
4154   tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4155                                           gdbarch_byte_order
4156                                               (target_gdbarch));
4157
4158   tp = get_tracepoint_by_number_on_target (tpnum);
4159   /* FIXME this is a poor heuristic if multiple locations.  */
4160   if (tp && tp->base.loc)
4161     addr = tp->base.loc->address;
4162
4163   /* Restore our seek position.  */
4164   cur_offset = saved_offset;
4165   lseek (trace_fd, cur_offset, SEEK_SET);
4166   return addr;
4167 }
4168
4169 /* Make tfile's selected traceframe match GDB's selected
4170    traceframe.  */
4171
4172 static void
4173 set_tfile_traceframe (void)
4174 {
4175   int newnum;
4176
4177   if (cur_traceframe_number == get_traceframe_number ())
4178     return;
4179
4180   /* Avoid recursion, tfile_trace_find calls us again.  */
4181   cur_traceframe_number = get_traceframe_number ();
4182
4183   newnum = target_trace_find (tfind_number,
4184                               get_traceframe_number (), 0, 0, NULL);
4185
4186   /* Should not happen.  If it does, all bets are off.  */
4187   if (newnum != get_traceframe_number ())
4188     warning (_("could not set tfile's traceframe"));
4189 }
4190
4191 /* Given a type of search and some parameters, scan the collection of
4192    traceframes in the file looking for a match.  When found, return
4193    both the traceframe and tracepoint number, otherwise -1 for
4194    each.  */
4195
4196 static int
4197 tfile_trace_find (enum trace_find_type type, int num,
4198                   ULONGEST addr1, ULONGEST addr2, int *tpp)
4199 {
4200   short tpnum;
4201   int tfnum = 0, found = 0;
4202   unsigned int data_size;
4203   struct tracepoint *tp;
4204   off_t offset, tframe_offset;
4205   ULONGEST tfaddr;
4206
4207   /* Lookups other than by absolute frame number depend on the current
4208      trace selected, so make sure it is correct on the tfile end
4209      first.  */
4210   if (type != tfind_number)
4211     set_tfile_traceframe ();
4212   else if (num == -1)
4213     {
4214       if (tpp)
4215         *tpp = -1;
4216       return -1;
4217     }
4218
4219   lseek (trace_fd, trace_frames_offset, SEEK_SET);
4220   offset = trace_frames_offset;
4221   while (1)
4222     {
4223       tframe_offset = offset;
4224       tfile_read ((gdb_byte *) &tpnum, 2);
4225       tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
4226                                               gdbarch_byte_order
4227                                                   (target_gdbarch));
4228       offset += 2;
4229       if (tpnum == 0)
4230         break;
4231       tfile_read ((gdb_byte *) &data_size, 4);
4232       data_size = (unsigned int) extract_unsigned_integer
4233                                      ((gdb_byte *) &data_size, 4,
4234                                       gdbarch_byte_order (target_gdbarch));
4235       offset += 4;
4236       switch (type)
4237         {
4238         case tfind_number:
4239           if (tfnum == num)
4240             found = 1;
4241           break;
4242         case tfind_pc:
4243           tfaddr = tfile_get_traceframe_address (tframe_offset);
4244           if (tfaddr == addr1)
4245             found = 1;
4246           break;
4247         case tfind_tp:
4248           tp = get_tracepoint (num);
4249           if (tp && tpnum == tp->number_on_target)
4250             found = 1;
4251           break;
4252         case tfind_range:
4253           tfaddr = tfile_get_traceframe_address (tframe_offset);
4254           if (addr1 <= tfaddr && tfaddr <= addr2)
4255             found = 1;
4256           break;
4257         case tfind_outside:
4258           tfaddr = tfile_get_traceframe_address (tframe_offset);
4259           if (!(addr1 <= tfaddr && tfaddr <= addr2))
4260             found = 1;
4261           break;
4262         default:
4263           internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4264         }
4265       if (found)
4266         {
4267           if (tpp)
4268             *tpp = tpnum;
4269           cur_offset = offset;
4270           cur_data_size = data_size;
4271           cur_traceframe_number = tfnum;
4272           return tfnum;
4273         }
4274       /* Skip past the traceframe's data.  */
4275       lseek (trace_fd, data_size, SEEK_CUR);
4276       offset += data_size;
4277       /* Update our own count of traceframes.  */
4278       ++tfnum;
4279     }
4280   /* Did not find what we were looking for.  */
4281   if (tpp)
4282     *tpp = -1;
4283   return -1;
4284 }
4285
4286 /* Prototype of the callback passed to tframe_walk_blocks.  */
4287 typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4288
4289 /* Callback for traceframe_walk_blocks, used to find a given block
4290    type in a traceframe.  */
4291
4292 static int
4293 match_blocktype (char blocktype, void *data)
4294 {
4295   char *wantedp = data;
4296
4297   if (*wantedp == blocktype)
4298     return 1;
4299
4300   return 0;
4301 }
4302
4303 /* Walk over all traceframe block starting at POS offset from
4304    CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4305    unmodified.  If CALLBACK returns true, this returns the position in
4306    the traceframe where the block is found, relative to the start of
4307    the traceframe (cur_offset).  Returns -1 if no callback call
4308    returned true, indicating that all blocks have been walked.  */
4309
4310 static int
4311 traceframe_walk_blocks (walk_blocks_callback_func callback,
4312                         int pos, void *data)
4313 {
4314   /* Iterate through a traceframe's blocks, looking for a block of the
4315      requested type.  */
4316
4317   lseek (trace_fd, cur_offset + pos, SEEK_SET);
4318   while (pos < cur_data_size)
4319     {
4320       unsigned short mlen;
4321       char block_type;
4322
4323       tfile_read (&block_type, 1);
4324
4325       ++pos;
4326
4327       if ((*callback) (block_type, data))
4328         return pos;
4329
4330       switch (block_type)
4331         {
4332         case 'R':
4333           lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4334           pos += trace_regblock_size;
4335           break;
4336         case 'M':
4337           lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4338           tfile_read ((gdb_byte *) &mlen, 2);
4339           mlen = (unsigned short)
4340                 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4341                                           gdbarch_byte_order
4342                                               (target_gdbarch));
4343           lseek (trace_fd, mlen, SEEK_CUR);
4344           pos += (8 + 2 + mlen);
4345           break;
4346         case 'V':
4347           lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4348           pos += (4 + 8);
4349           break;
4350         default:
4351           error (_("Unknown block type '%c' (0x%x) in trace frame"),
4352                  block_type, block_type);
4353           break;
4354         }
4355     }
4356
4357   return -1;
4358 }
4359
4360 /* Convenience wrapper around traceframe_walk_blocks.  Looks for the
4361    position offset of a block of type TYPE_WANTED in the current trace
4362    frame, starting at POS.  Returns -1 if no such block was found.  */
4363
4364 static int
4365 traceframe_find_block_type (char type_wanted, int pos)
4366 {
4367   return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4368 }
4369
4370 /* Look for a block of saved registers in the traceframe, and get the
4371    requested register from it.  */
4372
4373 static void
4374 tfile_fetch_registers (struct target_ops *ops,
4375                        struct regcache *regcache, int regno)
4376 {
4377   struct gdbarch *gdbarch = get_regcache_arch (regcache);
4378   char block_type;
4379   int pos, offset, regn, regsize, pc_regno;
4380   unsigned short mlen;
4381   char *regs;
4382
4383   /* An uninitialized reg size says we're not going to be
4384      successful at getting register blocks.  */
4385   if (!trace_regblock_size)
4386     return;
4387
4388   set_tfile_traceframe ();
4389
4390   regs = alloca (trace_regblock_size);
4391
4392   if (traceframe_find_block_type ('R', 0) >= 0)
4393     {
4394       tfile_read (regs, trace_regblock_size);
4395
4396       /* Assume the block is laid out in GDB register number order,
4397          each register with the size that it has in GDB.  */
4398       offset = 0;
4399       for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4400         {
4401           regsize = register_size (gdbarch, regn);
4402           /* Make sure we stay within block bounds.  */
4403           if (offset + regsize >= trace_regblock_size)
4404             break;
4405           if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
4406             {
4407               if (regno == regn)
4408                 {
4409                   regcache_raw_supply (regcache, regno, regs + offset);
4410                   break;
4411                 }
4412               else if (regno == -1)
4413                 {
4414                   regcache_raw_supply (regcache, regn, regs + offset);
4415                 }
4416             }
4417           offset += regsize;
4418         }
4419       return;
4420     }
4421
4422   /* We get here if no register data has been found.  Mark registers
4423      as unavailable.  */
4424   for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4425     regcache_raw_supply (regcache, regn, NULL);
4426
4427   /* We can often usefully guess that the PC is going to be the same
4428      as the address of the tracepoint.  */
4429   pc_regno = gdbarch_pc_regnum (gdbarch);
4430   if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4431     {
4432       struct tracepoint *tp = get_tracepoint (tracepoint_number);
4433
4434       if (tp && tp->base.loc)
4435         {
4436           /* But don't try to guess if tracepoint is multi-location...  */
4437           if (tp->base.loc->next)
4438             {
4439               warning (_("Tracepoint %d has multiple "
4440                          "locations, cannot infer $pc"),
4441                        tp->base.number);
4442               return;
4443             }
4444           /* ... or does while-stepping.  */
4445           if (tp->step_count > 0)
4446             {
4447               warning (_("Tracepoint %d does while-stepping, "
4448                          "cannot infer $pc"),
4449                        tp->base.number);
4450               return;
4451             }
4452
4453           store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4454                                   gdbarch_byte_order (gdbarch),
4455                                   tp->base.loc->address);
4456           regcache_raw_supply (regcache, pc_regno, regs);
4457         }
4458     }
4459 }
4460
4461 static LONGEST
4462 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4463                     const char *annex, gdb_byte *readbuf,
4464                     const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4465 {
4466   /* We're only doing regular memory for now.  */
4467   if (object != TARGET_OBJECT_MEMORY)
4468     return -1;
4469
4470   if (readbuf == NULL)
4471     error (_("tfile_xfer_partial: trace file is read-only"));
4472
4473   set_tfile_traceframe ();
4474
4475  if (traceframe_number != -1)
4476     {
4477       int pos = 0;
4478
4479       /* Iterate through the traceframe's blocks, looking for
4480          memory.  */
4481       while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
4482         {
4483           ULONGEST maddr, amt;
4484           unsigned short mlen;
4485           enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
4486
4487           tfile_read ((gdb_byte *) &maddr, 8);
4488           maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4489                                             byte_order);
4490           tfile_read ((gdb_byte *) &mlen, 2);
4491           mlen = (unsigned short)
4492             extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4493
4494           /* If the block includes the first part of the desired
4495              range, return as much it has; GDB will re-request the
4496              remainder, which might be in a different block of this
4497              trace frame.  */
4498           if (maddr <= offset && offset < (maddr + mlen))
4499             {
4500               amt = (maddr + mlen) - offset;
4501               if (amt > len)
4502                 amt = len;
4503
4504               tfile_read (readbuf, amt);
4505               return amt;
4506             }
4507
4508           /* Skip over this block.  */
4509           pos += (8 + 2 + mlen);
4510         }
4511     }
4512
4513   /* It's unduly pedantic to refuse to look at the executable for
4514      read-only pieces; so do the equivalent of readonly regions aka
4515      QTro packet.  */
4516   /* FIXME account for relocation at some point.  */
4517   if (exec_bfd)
4518     {
4519       asection *s;
4520       bfd_size_type size;
4521       bfd_vma vma;
4522
4523       for (s = exec_bfd->sections; s; s = s->next)
4524         {
4525           if ((s->flags & SEC_LOAD) == 0
4526               || (s->flags & SEC_READONLY) == 0)
4527             continue;
4528
4529           vma = s->vma;
4530           size = bfd_get_section_size (s);
4531           if (vma <= offset && offset < (vma + size))
4532             {
4533               ULONGEST amt;
4534
4535               amt = (vma + size) - offset;
4536               if (amt > len)
4537                 amt = len;
4538
4539               amt = bfd_get_section_contents (exec_bfd, s,
4540                                               readbuf, offset - vma, amt);
4541               return amt;
4542             }
4543         }
4544     }
4545
4546   /* Indicate failure to find the requested memory block.  */
4547   return -1;
4548 }
4549
4550 /* Iterate through the blocks of a trace frame, looking for a 'V'
4551    block with a matching tsv number.  */
4552
4553 static int
4554 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4555 {
4556   int pos;
4557
4558   set_tfile_traceframe ();
4559
4560   pos = 0;
4561   while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
4562     {
4563       int vnum;
4564
4565       tfile_read ((gdb_byte *) &vnum, 4);
4566       vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
4567                                            gdbarch_byte_order
4568                                            (target_gdbarch));
4569       if (tsvnum == vnum)
4570         {
4571           tfile_read ((gdb_byte *) val, 8);
4572           *val = extract_signed_integer ((gdb_byte *) val, 8,
4573                                          gdbarch_byte_order
4574                                          (target_gdbarch));
4575           return 1;
4576         }
4577       pos += (4 + 8);
4578     }
4579
4580   /* Didn't find anything.  */
4581   return 0;
4582 }
4583
4584 static int
4585 tfile_has_all_memory (struct target_ops *ops)
4586 {
4587   return 1;
4588 }
4589
4590 static int
4591 tfile_has_memory (struct target_ops *ops)
4592 {
4593   return 1;
4594 }
4595
4596 static int
4597 tfile_has_stack (struct target_ops *ops)
4598 {
4599   return traceframe_number != -1;
4600 }
4601
4602 static int
4603 tfile_has_registers (struct target_ops *ops)
4604 {
4605   return traceframe_number != -1;
4606 }
4607
4608 static int
4609 tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4610 {
4611   return 1;
4612 }
4613
4614 /* Callback for traceframe_walk_blocks.  Builds a traceframe_info
4615    object for the tfile target's current traceframe.  */
4616
4617 static int
4618 build_traceframe_info (char blocktype, void *data)
4619 {
4620   struct traceframe_info *info = data;
4621
4622   switch (blocktype)
4623     {
4624     case 'M':
4625       {
4626         struct mem_range *r;
4627         ULONGEST maddr;
4628         unsigned short mlen;
4629
4630         tfile_read ((gdb_byte *) &maddr, 8);
4631         tfile_read ((gdb_byte *) &mlen, 2);
4632
4633         r = VEC_safe_push (mem_range_s, info->memory, NULL);
4634
4635         r->start = maddr;
4636         r->length = mlen;
4637         break;
4638       }
4639     case 'V':
4640     case 'R':
4641     case 'S':
4642       {
4643         break;
4644       }
4645     default:
4646       warning (_("Unhandled trace block type (%d) '%c ' "
4647                  "while building trace frame info."),
4648                blocktype, blocktype);
4649       break;
4650     }
4651
4652   return 0;
4653 }
4654
4655 static struct traceframe_info *
4656 tfile_traceframe_info (void)
4657 {
4658   struct traceframe_info *info = XCNEW (struct traceframe_info);
4659
4660   traceframe_walk_blocks (build_traceframe_info, 0, info);
4661   return info;
4662 }
4663
4664 static void
4665 init_tfile_ops (void)
4666 {
4667   tfile_ops.to_shortname = "tfile";
4668   tfile_ops.to_longname = "Local trace dump file";
4669   tfile_ops.to_doc
4670     = "Use a trace file as a target.  Specify the filename of the trace file.";
4671   tfile_ops.to_open = tfile_open;
4672   tfile_ops.to_close = tfile_close;
4673   tfile_ops.to_fetch_registers = tfile_fetch_registers;
4674   tfile_ops.to_xfer_partial = tfile_xfer_partial;
4675   tfile_ops.to_files_info = tfile_files_info;
4676   tfile_ops.to_get_trace_status = tfile_get_trace_status;
4677   tfile_ops.to_get_tracepoint_status = tfile_get_tracepoint_status;
4678   tfile_ops.to_trace_find = tfile_trace_find;
4679   tfile_ops.to_get_trace_state_variable_value
4680     = tfile_get_trace_state_variable_value;
4681   tfile_ops.to_stratum = process_stratum;
4682   tfile_ops.to_has_all_memory = tfile_has_all_memory;
4683   tfile_ops.to_has_memory = tfile_has_memory;
4684   tfile_ops.to_has_stack = tfile_has_stack;
4685   tfile_ops.to_has_registers = tfile_has_registers;
4686   tfile_ops.to_traceframe_info = tfile_traceframe_info;
4687   tfile_ops.to_thread_alive = tfile_thread_alive;
4688   tfile_ops.to_magic = OPS_MAGIC;
4689 }
4690
4691 /* Given a line of text defining a static tracepoint marker, parse it
4692    into a "static tracepoint marker" object.  Throws an error is
4693    parsing fails.  If PP is non-null, it points to one past the end of
4694    the parsed marker definition.  */
4695
4696 void
4697 parse_static_tracepoint_marker_definition (char *line, char **pp,
4698                                            struct static_tracepoint_marker *marker)
4699 {
4700   char *p, *endp;
4701   ULONGEST addr;
4702   int end;
4703
4704   p = line;
4705   p = unpack_varlen_hex (p, &addr);
4706   p++;  /* skip a colon */
4707
4708   marker->gdbarch = target_gdbarch;
4709   marker->address = (CORE_ADDR) addr;
4710
4711   endp = strchr (p, ':');
4712   if (endp == NULL)
4713     error (_("bad marker definition: %s"), line);
4714
4715   marker->str_id = xmalloc (endp - p + 1);
4716   end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4717   marker->str_id[end] = '\0';
4718
4719   p += 2 * end;
4720   p++;  /* skip a colon */
4721
4722   marker->extra = xmalloc (strlen (p) + 1);
4723   end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4724   marker->extra[end] = '\0';
4725
4726   if (pp)
4727     *pp = p;
4728 }
4729
4730 /* Release a static tracepoint marker's contents.  Note that the
4731    object itself isn't released here.  There objects are usually on
4732    the stack.  */
4733
4734 void
4735 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4736 {
4737   xfree (marker->str_id);
4738   marker->str_id = NULL;
4739 }
4740
4741 /* Print MARKER to gdb_stdout.  */
4742
4743 static void
4744 print_one_static_tracepoint_marker (int count,
4745                                     struct static_tracepoint_marker *marker)
4746 {
4747   struct command_line *l;
4748   struct symbol *sym;
4749
4750   char wrap_indent[80];
4751   char extra_field_indent[80];
4752   struct ui_out *uiout = current_uiout;
4753   struct ui_stream *stb = ui_out_stream_new (uiout);
4754   struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4755   struct cleanup *bkpt_chain;
4756   VEC(breakpoint_p) *tracepoints;
4757
4758   struct symtab_and_line sal;
4759
4760   init_sal (&sal);
4761
4762   sal.pc = marker->address;
4763
4764   tracepoints = static_tracepoints_here (marker->address);
4765
4766   bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4767
4768   /* A counter field to help readability.  This is not a stable
4769      identifier!  */
4770   ui_out_field_int (uiout, "count", count);
4771
4772   ui_out_field_string (uiout, "marker-id", marker->str_id);
4773
4774   ui_out_field_fmt (uiout, "enabled", "%c",
4775                     !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4776   ui_out_spaces (uiout, 2);
4777
4778   strcpy (wrap_indent, "                                   ");
4779
4780   if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4781     strcat (wrap_indent, "           ");
4782   else
4783     strcat (wrap_indent, "                   ");
4784
4785   strcpy (extra_field_indent, "         ");
4786
4787   ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4788
4789   sal = find_pc_line (marker->address, 0);
4790   sym = find_pc_sect_function (marker->address, NULL);
4791   if (sym)
4792     {
4793       ui_out_text (uiout, "in ");
4794       ui_out_field_string (uiout, "func",
4795                            SYMBOL_PRINT_NAME (sym));
4796       ui_out_wrap_hint (uiout, wrap_indent);
4797       ui_out_text (uiout, " at ");
4798     }
4799   else
4800     ui_out_field_skip (uiout, "func");
4801
4802   if (sal.symtab != NULL)
4803     {
4804       ui_out_field_string (uiout, "file", sal.symtab->filename);
4805       ui_out_text (uiout, ":");
4806
4807       if (ui_out_is_mi_like_p (uiout))
4808         {
4809           char *fullname = symtab_to_fullname (sal.symtab);
4810
4811           if (fullname)
4812             ui_out_field_string (uiout, "fullname", fullname);
4813         }
4814       else
4815         ui_out_field_skip (uiout, "fullname");
4816
4817       ui_out_field_int (uiout, "line", sal.line);
4818     }
4819   else
4820     {
4821       ui_out_field_skip (uiout, "fullname");
4822       ui_out_field_skip (uiout, "line");
4823     }
4824
4825   ui_out_text (uiout, "\n");
4826   ui_out_text (uiout, extra_field_indent);
4827   ui_out_text (uiout, _("Data: \""));
4828   ui_out_field_string (uiout, "extra-data", marker->extra);
4829   ui_out_text (uiout, "\"\n");
4830
4831   if (!VEC_empty (breakpoint_p, tracepoints))
4832     {
4833       struct cleanup *cleanup_chain;
4834       int ix;
4835       struct breakpoint *b;
4836
4837       cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4838                                                            "tracepoints-at");
4839
4840       ui_out_text (uiout, extra_field_indent);
4841       ui_out_text (uiout, _("Probed by static tracepoints: "));
4842       for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4843         {
4844           if (ix > 0)
4845             ui_out_text (uiout, ", ");
4846           ui_out_text (uiout, "#");
4847           ui_out_field_int (uiout, "tracepoint-id", b->number);
4848         }
4849
4850       do_cleanups (cleanup_chain);
4851
4852       if (ui_out_is_mi_like_p (uiout))
4853         ui_out_field_int (uiout, "number-of-tracepoints",
4854                           VEC_length(breakpoint_p, tracepoints));
4855       else
4856         ui_out_text (uiout, "\n");
4857     }
4858   VEC_free (breakpoint_p, tracepoints);
4859
4860   do_cleanups (bkpt_chain);
4861   do_cleanups (old_chain);
4862 }
4863
4864 static void
4865 info_static_tracepoint_markers_command (char *arg, int from_tty)
4866 {
4867   VEC(static_tracepoint_marker_p) *markers;
4868   struct cleanup *old_chain;
4869   struct static_tracepoint_marker *marker;
4870   struct ui_out *uiout = current_uiout;
4871   int i;
4872
4873   old_chain
4874     = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4875                                            "StaticTracepointMarkersTable");
4876
4877   ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4878
4879   ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4880
4881   ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4882   if (gdbarch_addr_bit (target_gdbarch) <= 32)
4883     ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4884   else
4885     ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4886   ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4887
4888   ui_out_table_body (uiout);
4889
4890   markers = target_static_tracepoint_markers_by_strid (NULL);
4891   make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4892
4893   for (i = 0;
4894        VEC_iterate (static_tracepoint_marker_p,
4895                     markers, i, marker);
4896        i++)
4897     {
4898       print_one_static_tracepoint_marker (i + 1, marker);
4899       release_static_tracepoint_marker (marker);
4900     }
4901
4902   do_cleanups (old_chain);
4903 }
4904
4905 /* The $_sdata convenience variable is a bit special.  We don't know
4906    for sure type of the value until we actually have a chance to fetch
4907    the data --- the size of the object depends on what has been
4908    collected.  We solve this by making $_sdata be an internalvar that
4909    creates a new value on access.  */
4910
4911 /* Return a new value with the correct type for the sdata object of
4912    the current trace frame.  Return a void value if there's no object
4913    available.  */
4914
4915 static struct value *
4916 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4917 {
4918   LONGEST size;
4919   gdb_byte *buf;
4920
4921   /* We need to read the whole object before we know its size.  */
4922   size = target_read_alloc (&current_target,
4923                             TARGET_OBJECT_STATIC_TRACE_DATA,
4924                             NULL, &buf);
4925   if (size >= 0)
4926     {
4927       struct value *v;
4928       struct type *type;
4929
4930       type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4931                                size);
4932       v = allocate_value (type);
4933       memcpy (value_contents_raw (v), buf, size);
4934       xfree (buf);
4935       return v;
4936     }
4937   else
4938     return allocate_value (builtin_type (gdbarch)->builtin_void);
4939 }
4940
4941 #if !defined(HAVE_LIBEXPAT)
4942
4943 struct traceframe_info *
4944 parse_traceframe_info (const char *tframe_info)
4945 {
4946   static int have_warned;
4947
4948   if (!have_warned)
4949     {
4950       have_warned = 1;
4951       warning (_("Can not parse XML trace frame info; XML support "
4952                  "was disabled at compile time"));
4953     }
4954
4955   return NULL;
4956 }
4957
4958 #else /* HAVE_LIBEXPAT */
4959
4960 #include "xml-support.h"
4961
4962 /* Handle the start of a <memory> element.  */
4963
4964 static void
4965 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4966                               const struct gdb_xml_element *element,
4967                               void *user_data, VEC(gdb_xml_value_s) *attributes)
4968 {
4969   struct traceframe_info *info = user_data;
4970   struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4971   ULONGEST *start_p, *length_p;
4972
4973   start_p = xml_find_attribute (attributes, "start")->value;
4974   length_p = xml_find_attribute (attributes, "length")->value;
4975
4976   r->start = *start_p;
4977   r->length = *length_p;
4978 }
4979
4980 /* Discard the constructed trace frame info (if an error occurs).  */
4981
4982 static void
4983 free_result (void *p)
4984 {
4985   struct traceframe_info *result = p;
4986
4987   free_traceframe_info (result);
4988 }
4989
4990 /* The allowed elements and attributes for an XML memory map.  */
4991
4992 static const struct gdb_xml_attribute memory_attributes[] = {
4993   { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4994   { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4995   { NULL, GDB_XML_AF_NONE, NULL, NULL }
4996 };
4997
4998 static const struct gdb_xml_element traceframe_info_children[] = {
4999   { "memory", memory_attributes, NULL,
5000     GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
5001     traceframe_info_start_memory, NULL },
5002   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5003 };
5004
5005 static const struct gdb_xml_element traceframe_info_elements[] = {
5006   { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
5007     NULL, NULL },
5008   { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
5009 };
5010
5011 /* Parse a traceframe-info XML document.  */
5012
5013 struct traceframe_info *
5014 parse_traceframe_info (const char *tframe_info)
5015 {
5016   struct traceframe_info *result;
5017   struct cleanup *back_to;
5018
5019   result = XCNEW (struct traceframe_info);
5020   back_to = make_cleanup (free_result, result);
5021
5022   if (gdb_xml_parse_quick (_("trace frame info"),
5023                            "traceframe-info.dtd", traceframe_info_elements,
5024                            tframe_info, result) == 0)
5025     {
5026       /* Parsed successfully, keep the result.  */
5027       discard_cleanups (back_to);
5028
5029       return result;
5030     }
5031
5032   do_cleanups (back_to);
5033   return NULL;
5034 }
5035
5036 #endif /* HAVE_LIBEXPAT */
5037
5038 /* Returns the traceframe_info object for the current traceframe.
5039    This is where we avoid re-fetching the object from the target if we
5040    already have it cached.  */
5041
5042 struct traceframe_info *
5043 get_traceframe_info (void)
5044 {
5045   if (traceframe_info == NULL)
5046     traceframe_info = target_traceframe_info ();
5047
5048   return traceframe_info;
5049 }
5050
5051 /* If the target supports the query, return in RESULT the set of
5052    collected memory in the current traceframe, found within the LEN
5053    bytes range starting at MEMADDR.  Returns true if the target
5054    supports the query, otherwise returns false, and RESULT is left
5055    undefined.  */
5056
5057 int
5058 traceframe_available_memory (VEC(mem_range_s) **result,
5059                              CORE_ADDR memaddr, ULONGEST len)
5060 {
5061   struct traceframe_info *info = get_traceframe_info ();
5062
5063   if (info != NULL)
5064     {
5065       struct mem_range *r;
5066       int i;
5067
5068       *result = NULL;
5069
5070       for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
5071         if (mem_ranges_overlap (r->start, r->length, memaddr, len))
5072           {
5073             ULONGEST lo1, hi1, lo2, hi2;
5074             struct mem_range *nr;
5075
5076             lo1 = memaddr;
5077             hi1 = memaddr + len;
5078
5079             lo2 = r->start;
5080             hi2 = r->start + r->length;
5081
5082             nr = VEC_safe_push (mem_range_s, *result, NULL);
5083
5084             nr->start = max (lo1, lo2);
5085             nr->length = min (hi1, hi2) - nr->start;
5086           }
5087
5088       normalize_mem_ranges (*result);
5089       return 1;
5090     }
5091
5092   return 0;
5093 }
5094
5095 /* module initialization */
5096 void
5097 _initialize_tracepoint (void)
5098 {
5099   struct cmd_list_element *c;
5100
5101   /* Explicitly create without lookup, since that tries to create a
5102      value with a void typed value, and when we get here, gdbarch
5103      isn't initialized yet.  At this point, we're quite sure there
5104      isn't another convenience variable of the same name.  */
5105   create_internalvar_type_lazy ("_sdata", sdata_make_value);
5106
5107   traceframe_number = -1;
5108   tracepoint_number = -1;
5109
5110   if (tracepoint_list.list == NULL)
5111     {
5112       tracepoint_list.listsize = 128;
5113       tracepoint_list.list = xmalloc
5114         (tracepoint_list.listsize * sizeof (struct memrange));
5115     }
5116   if (tracepoint_list.aexpr_list == NULL)
5117     {
5118       tracepoint_list.aexpr_listsize = 128;
5119       tracepoint_list.aexpr_list = xmalloc
5120         (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
5121     }
5122
5123   if (stepping_list.list == NULL)
5124     {
5125       stepping_list.listsize = 128;
5126       stepping_list.list = xmalloc
5127         (stepping_list.listsize * sizeof (struct memrange));
5128     }
5129
5130   if (stepping_list.aexpr_list == NULL)
5131     {
5132       stepping_list.aexpr_listsize = 128;
5133       stepping_list.aexpr_list = xmalloc
5134         (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
5135     }
5136
5137   add_info ("scope", scope_info,
5138             _("List the variables local to a scope"));
5139
5140   add_cmd ("tracepoints", class_trace, NULL,
5141            _("Tracing of program execution without stopping the program."),
5142            &cmdlist);
5143
5144   add_com ("tdump", class_trace, trace_dump_command,
5145            _("Print everything collected at the current tracepoint."));
5146
5147   add_com ("tsave", class_trace, trace_save_command, _("\
5148 Save the trace data to a file.\n\
5149 Use the '-r' option to direct the target to save directly to the file,\n\
5150 using its own filesystem."));
5151
5152   c = add_com ("tvariable", class_trace, trace_variable_command,_("\
5153 Define a trace state variable.\n\
5154 Argument is a $-prefixed name, optionally followed\n\
5155 by '=' and an expression that sets the initial value\n\
5156 at the start of tracing."));
5157   set_cmd_completer (c, expression_completer);
5158
5159   add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
5160 Delete one or more trace state variables.\n\
5161 Arguments are the names of the variables to delete.\n\
5162 If no arguments are supplied, delete all variables."), &deletelist);
5163   /* FIXME add a trace variable completer.  */
5164
5165   add_info ("tvariables", tvariables_info, _("\
5166 Status of trace state variables and their values.\n\
5167 "));
5168
5169   add_info ("static-tracepoint-markers",
5170             info_static_tracepoint_markers_command, _("\
5171 List target static tracepoints markers.\n\
5172 "));
5173
5174   add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
5175 Select a trace frame;\n\
5176 No argument means forward by one frame; '-' means backward by one frame."),
5177                   &tfindlist, "tfind ", 1, &cmdlist);
5178
5179   add_cmd ("outside", class_trace, trace_find_outside_command, _("\
5180 Select a trace frame whose PC is outside the given range (exclusive).\n\
5181 Usage: tfind outside addr1, addr2"),
5182            &tfindlist);
5183
5184   add_cmd ("range", class_trace, trace_find_range_command, _("\
5185 Select a trace frame whose PC is in the given range (inclusive).\n\
5186 Usage: tfind range addr1,addr2"),
5187            &tfindlist);
5188
5189   add_cmd ("line", class_trace, trace_find_line_command, _("\
5190 Select a trace frame by source line.\n\
5191 Argument can be a line number (with optional source file),\n\
5192 a function name, or '*' followed by an address.\n\
5193 Default argument is 'the next source line that was traced'."),
5194            &tfindlist);
5195
5196   add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
5197 Select a trace frame by tracepoint number.\n\
5198 Default is the tracepoint for the current trace frame."),
5199            &tfindlist);
5200
5201   add_cmd ("pc", class_trace, trace_find_pc_command, _("\
5202 Select a trace frame by PC.\n\
5203 Default is the current PC, or the PC of the current trace frame."),
5204            &tfindlist);
5205
5206   add_cmd ("end", class_trace, trace_find_end_command, _("\
5207 Synonym for 'none'.\n\
5208 De-select any trace frame and resume 'live' debugging."),
5209            &tfindlist);
5210
5211   add_cmd ("none", class_trace, trace_find_none_command,
5212            _("De-select any trace frame and resume 'live' debugging."),
5213            &tfindlist);
5214
5215   add_cmd ("start", class_trace, trace_find_start_command,
5216            _("Select the first trace frame in the trace buffer."),
5217            &tfindlist);
5218
5219   add_com ("tstatus", class_trace, trace_status_command,
5220            _("Display the status of the current trace data collection."));
5221
5222   add_com ("tstop", class_trace, trace_stop_command, _("\
5223 Stop trace data collection.\n\
5224 Usage: tstop [ <notes> ... ]\n\
5225 Any arguments supplied are recorded with the trace as a stop reason and\n\
5226 reported by tstatus (if the target supports trace notes)."));
5227
5228   add_com ("tstart", class_trace, trace_start_command, _("\
5229 Start trace data collection.\n\
5230 Usage: tstart [ <notes> ... ]\n\
5231 Any arguments supplied are recorded with the trace as a note and\n\
5232 reported by tstatus (if the target supports trace notes)."));
5233
5234   add_com ("end", class_trace, end_actions_pseudocommand, _("\
5235 Ends a list of commands or actions.\n\
5236 Several GDB commands allow you to enter a list of commands or actions.\n\
5237 Entering \"end\" on a line by itself is the normal way to terminate\n\
5238 such a list.\n\n\
5239 Note: the \"end\" command cannot be used at the gdb prompt."));
5240
5241   add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
5242 Specify single-stepping behavior at a tracepoint.\n\
5243 Argument is number of instructions to trace in single-step mode\n\
5244 following the tracepoint.  This command is normally followed by\n\
5245 one or more \"collect\" commands, to specify what to collect\n\
5246 while single-stepping.\n\n\
5247 Note: this command can only be used in a tracepoint \"actions\" list."));
5248
5249   add_com_alias ("ws", "while-stepping", class_alias, 0);
5250   add_com_alias ("stepping", "while-stepping", class_alias, 0);
5251
5252   add_com ("collect", class_trace, collect_pseudocommand, _("\
5253 Specify one or more data items to be collected at a tracepoint.\n\
5254 Accepts a comma-separated list of (one or more) expressions.  GDB will\n\
5255 collect all data (variables, registers) referenced by that expression.\n\
5256 Also accepts the following special arguments:\n\
5257     $regs   -- all registers.\n\
5258     $args   -- all function arguments.\n\
5259     $locals -- all variables local to the block/function scope.\n\
5260     $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
5261 Note: this command can only be used in a tracepoint \"actions\" list."));
5262
5263   add_com ("teval", class_trace, teval_pseudocommand, _("\
5264 Specify one or more expressions to be evaluated at a tracepoint.\n\
5265 Accepts a comma-separated list of (one or more) expressions.\n\
5266 The result of each evaluation will be discarded.\n\
5267 Note: this command can only be used in a tracepoint \"actions\" list."));
5268
5269   add_com ("actions", class_trace, trace_actions_command, _("\
5270 Specify the actions to be taken at a tracepoint.\n\
5271 Tracepoint actions may include collecting of specified data,\n\
5272 single-stepping, or enabling/disabling other tracepoints,\n\
5273 depending on target's capabilities."));
5274
5275   default_collect = xstrdup ("");
5276   add_setshow_string_cmd ("default-collect", class_trace,
5277                           &default_collect, _("\
5278 Set the list of expressions to collect by default"), _("\
5279 Show the list of expressions to collect by default"), NULL,
5280                           NULL, NULL,
5281                           &setlist, &showlist);
5282
5283   add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5284                            &disconnected_tracing, _("\
5285 Set whether tracing continues after GDB disconnects."), _("\
5286 Show whether tracing continues after GDB disconnects."), _("\
5287 Use this to continue a tracing run even if GDB disconnects\n\
5288 or detaches from the target.  You can reconnect later and look at\n\
5289 trace data collected in the meantime."),
5290                            set_disconnected_tracing,
5291                            NULL,
5292                            &setlist,
5293                            &showlist);
5294
5295   add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5296                            &circular_trace_buffer, _("\
5297 Set target's use of circular trace buffer."), _("\
5298 Show target's use of circular trace buffer."), _("\
5299 Use this to make the trace buffer into a circular buffer,\n\
5300 which will discard traceframes (oldest first) instead of filling\n\
5301 up and stopping the trace run."),
5302                            set_circular_trace_buffer,
5303                            NULL,
5304                            &setlist,
5305                            &showlist);
5306
5307   add_setshow_string_cmd ("trace-user", class_trace,
5308                           &trace_user, _("\
5309 Set the user name to use for current and future trace runs"), _("\
5310 Show the user name to use for current and future trace runs"), NULL,
5311                           set_trace_user, NULL,
5312                           &setlist, &showlist);
5313
5314   add_setshow_string_cmd ("trace-notes", class_trace,
5315                           &trace_notes, _("\
5316 Set notes string to use for current and future trace runs"), _("\
5317 Show the notes string to use for current and future trace runs"), NULL,
5318                           set_trace_notes, NULL,
5319                           &setlist, &showlist);
5320
5321   add_setshow_string_cmd ("trace-stop-notes", class_trace,
5322                           &trace_stop_notes, _("\
5323 Set notes string to use for future tstop commands"), _("\
5324 Show the notes string to use for future tstop commands"), NULL,
5325                           set_trace_stop_notes, NULL,
5326                           &setlist, &showlist);
5327
5328   init_tfile_ops ();
5329
5330   add_target (&tfile_ops);
5331 }