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