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