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