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