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