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