update copyright year range in GDB files
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3 Copyright (C) 1997-2017 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 "target-dcache.h"
30 #include "language.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 "remote.h"
48 #include "source.h"
49 #include "ax.h"
50 #include "ax-gdb.h"
51 #include "memrange.h"
52 #include "cli/cli-utils.h"
53 #include "probe.h"
54 #include "ctf.h"
55 #include "filestuff.h"
56 #include "rsp-low.h"
57 #include "tracefile.h"
58 #include "location.h"
59 #include <algorithm>
60
61 /* readline include files */
62 #include "readline/readline.h"
63 #include "readline/history.h"
64
65 /* readline defines this. */
66 #undef savestring
67
68 #include <unistd.h>
69
70 /* Maximum length of an agent aexpression.
71 This accounts for the fact that packets are limited to 400 bytes
72 (which includes everything -- including the checksum), and assumes
73 the worst case of maximum length for each of the pieces of a
74 continuation packet.
75
76 NOTE: expressions get mem2hex'ed otherwise this would be twice as
77 large. (400 - 31)/2 == 184 */
78 #define MAX_AGENT_EXPR_LEN 184
79
80 /* A hook used to notify the UI of tracepoint operations. */
81
82 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
83 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
84
85 /*
86 Tracepoint.c:
87
88 This module defines the following debugger commands:
89 trace : set a tracepoint on a function, line, or address.
90 info trace : list all debugger-defined tracepoints.
91 delete trace : delete one or more tracepoints.
92 enable trace : enable one or more tracepoints.
93 disable trace : disable one or more tracepoints.
94 actions : specify actions to be taken at a tracepoint.
95 passcount : specify a pass count for a tracepoint.
96 tstart : start a trace experiment.
97 tstop : stop a trace experiment.
98 tstatus : query the status of a trace experiment.
99 tfind : find a trace frame in the trace buffer.
100 tdump : print everything collected at the current tracepoint.
101 save-tracepoints : write tracepoint setup into a file.
102
103 This module defines the following user-visible debugger variables:
104 $trace_frame : sequence number of trace frame currently being debugged.
105 $trace_line : source line of trace frame currently being debugged.
106 $trace_file : source file of trace frame currently being debugged.
107 $tracepoint : tracepoint number of trace frame currently being debugged.
108 */
109
110
111 /* ======= Important global variables: ======= */
112
113 /* The list of all trace state variables. We don't retain pointers to
114 any of these for any reason - API is by name or number only - so it
115 works to have a vector of objects. */
116
117 typedef struct trace_state_variable tsv_s;
118 DEF_VEC_O(tsv_s);
119
120 static VEC(tsv_s) *tvariables;
121
122 /* The next integer to assign to a variable. */
123
124 static int next_tsv_number = 1;
125
126 /* Number of last traceframe collected. */
127 static int traceframe_number;
128
129 /* Tracepoint for last traceframe collected. */
130 static int tracepoint_number;
131
132 /* The traceframe info of the current traceframe. NULL if we haven't
133 yet attempted to fetch it, or if the target does not support
134 fetching this object, or if we're not inspecting a traceframe
135 presently. */
136 static struct traceframe_info *traceframe_info;
137
138 /* Tracing command lists. */
139 static struct cmd_list_element *tfindlist;
140
141 /* List of expressions to collect by default at each tracepoint hit. */
142 char *default_collect = "";
143
144 static int disconnected_tracing;
145
146 /* This variable controls whether we ask the target for a linear or
147 circular trace buffer. */
148
149 static int circular_trace_buffer;
150
151 /* This variable is the requested trace buffer size, or -1 to indicate
152 that we don't care and leave it up to the target to set a size. */
153
154 static int trace_buffer_size = -1;
155
156 /* Textual notes applying to the current and/or future trace runs. */
157
158 char *trace_user = NULL;
159
160 /* Textual notes applying to the current and/or future trace runs. */
161
162 char *trace_notes = NULL;
163
164 /* Textual notes applying to the stopping of a trace. */
165
166 char *trace_stop_notes = NULL;
167
168 /* ======= Important command functions: ======= */
169 static void actions_command (char *, int);
170 static void tstart_command (char *, int);
171 static void tstop_command (char *, int);
172 static void tstatus_command (char *, int);
173 static void tfind_command (char *, int);
174 static void tfind_pc_command (char *, int);
175 static void tfind_tracepoint_command (char *, int);
176 static void tfind_line_command (char *, int);
177 static void tfind_range_command (char *, int);
178 static void tfind_outside_command (char *, int);
179 static void tdump_command (char *, int);
180
181 /* support routines */
182
183 struct collection_list;
184 static char *mem2hex (gdb_byte *, char *, int);
185
186 static struct command_line *
187 all_tracepoint_actions_and_cleanup (struct breakpoint *t);
188
189 extern void _initialize_tracepoint (void);
190
191 static struct trace_status trace_status;
192
193 const char *stop_reason_names[] = {
194 "tunknown",
195 "tnotrun",
196 "tstop",
197 "tfull",
198 "tdisconnected",
199 "tpasscount",
200 "terror"
201 };
202
203 struct trace_status *
204 current_trace_status (void)
205 {
206 return &trace_status;
207 }
208
209 /* Destroy INFO. */
210
211 static void
212 free_traceframe_info (struct traceframe_info *info)
213 {
214 if (info != NULL)
215 {
216 VEC_free (mem_range_s, info->memory);
217 VEC_free (int, info->tvars);
218
219 xfree (info);
220 }
221 }
222
223 /* Free and clear the traceframe info cache of the current
224 traceframe. */
225
226 static void
227 clear_traceframe_info (void)
228 {
229 free_traceframe_info (traceframe_info);
230 traceframe_info = NULL;
231 }
232
233 /* Set traceframe number to NUM. */
234 static void
235 set_traceframe_num (int num)
236 {
237 traceframe_number = num;
238 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
239 }
240
241 /* Set tracepoint number to NUM. */
242 static void
243 set_tracepoint_num (int num)
244 {
245 tracepoint_number = num;
246 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
247 }
248
249 /* Set externally visible debug variables for querying/printing
250 the traceframe context (line, function, file). */
251
252 static void
253 set_traceframe_context (struct frame_info *trace_frame)
254 {
255 CORE_ADDR trace_pc;
256 struct symbol *traceframe_fun;
257 struct symtab_and_line traceframe_sal;
258
259 /* Save as globals for internal use. */
260 if (trace_frame != NULL
261 && get_frame_pc_if_available (trace_frame, &trace_pc))
262 {
263 traceframe_sal = find_pc_line (trace_pc, 0);
264 traceframe_fun = find_pc_function (trace_pc);
265
266 /* Save linenumber as "$trace_line", a debugger variable visible to
267 users. */
268 set_internalvar_integer (lookup_internalvar ("trace_line"),
269 traceframe_sal.line);
270 }
271 else
272 {
273 init_sal (&traceframe_sal);
274 traceframe_fun = NULL;
275 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
276 }
277
278 /* Save func name as "$trace_func", a debugger variable visible to
279 users. */
280 if (traceframe_fun == NULL
281 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
282 clear_internalvar (lookup_internalvar ("trace_func"));
283 else
284 set_internalvar_string (lookup_internalvar ("trace_func"),
285 SYMBOL_LINKAGE_NAME (traceframe_fun));
286
287 /* Save file name as "$trace_file", a debugger variable visible to
288 users. */
289 if (traceframe_sal.symtab == NULL)
290 clear_internalvar (lookup_internalvar ("trace_file"));
291 else
292 set_internalvar_string (lookup_internalvar ("trace_file"),
293 symtab_to_filename_for_display (traceframe_sal.symtab));
294 }
295
296 /* Create a new trace state variable with the given name. */
297
298 struct trace_state_variable *
299 create_trace_state_variable (const char *name)
300 {
301 struct trace_state_variable tsv;
302
303 memset (&tsv, 0, sizeof (tsv));
304 tsv.name = xstrdup (name);
305 tsv.number = next_tsv_number++;
306 return VEC_safe_push (tsv_s, tvariables, &tsv);
307 }
308
309 /* Look for a trace state variable of the given name. */
310
311 struct trace_state_variable *
312 find_trace_state_variable (const char *name)
313 {
314 struct trace_state_variable *tsv;
315 int ix;
316
317 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
318 if (strcmp (name, tsv->name) == 0)
319 return tsv;
320
321 return NULL;
322 }
323
324 /* Look for a trace state variable of the given number. Return NULL if
325 not found. */
326
327 struct trace_state_variable *
328 find_trace_state_variable_by_number (int number)
329 {
330 struct trace_state_variable *tsv;
331 int ix;
332
333 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
334 if (tsv->number == number)
335 return tsv;
336
337 return NULL;
338 }
339
340 static void
341 delete_trace_state_variable (const char *name)
342 {
343 struct trace_state_variable *tsv;
344 int ix;
345
346 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
347 if (strcmp (name, tsv->name) == 0)
348 {
349 observer_notify_tsv_deleted (tsv);
350
351 xfree ((void *)tsv->name);
352 VEC_unordered_remove (tsv_s, tvariables, ix);
353
354 return;
355 }
356
357 warning (_("No trace variable named \"$%s\", not deleting"), name);
358 }
359
360 /* Throws an error if NAME is not valid syntax for a trace state
361 variable's name. */
362
363 void
364 validate_trace_state_variable_name (const char *name)
365 {
366 const char *p;
367
368 if (*name == '\0')
369 error (_("Must supply a non-empty variable name"));
370
371 /* All digits in the name is reserved for value history
372 references. */
373 for (p = name; isdigit (*p); p++)
374 ;
375 if (*p == '\0')
376 error (_("$%s is not a valid trace state variable name"), name);
377
378 for (p = name; isalnum (*p) || *p == '_'; p++)
379 ;
380 if (*p != '\0')
381 error (_("$%s is not a valid trace state variable name"), name);
382 }
383
384 /* The 'tvariable' command collects a name and optional expression to
385 evaluate into an initial value. */
386
387 static void
388 trace_variable_command (char *args, int from_tty)
389 {
390 struct cleanup *old_chain;
391 LONGEST initval = 0;
392 struct trace_state_variable *tsv;
393 char *name, *p;
394
395 if (!args || !*args)
396 error_no_arg (_("Syntax is $NAME [ = EXPR ]"));
397
398 /* Only allow two syntaxes; "$name" and "$name=value". */
399 p = skip_spaces (args);
400
401 if (*p++ != '$')
402 error (_("Name of trace variable should start with '$'"));
403
404 name = p;
405 while (isalnum (*p) || *p == '_')
406 p++;
407 name = savestring (name, p - name);
408 old_chain = make_cleanup (xfree, name);
409
410 p = skip_spaces (p);
411 if (*p != '=' && *p != '\0')
412 error (_("Syntax must be $NAME [ = EXPR ]"));
413
414 validate_trace_state_variable_name (name);
415
416 if (*p == '=')
417 initval = value_as_long (parse_and_eval (++p));
418
419 /* If the variable already exists, just change its initial value. */
420 tsv = find_trace_state_variable (name);
421 if (tsv)
422 {
423 if (tsv->initial_value != initval)
424 {
425 tsv->initial_value = initval;
426 observer_notify_tsv_modified (tsv);
427 }
428 printf_filtered (_("Trace state variable $%s "
429 "now has initial value %s.\n"),
430 tsv->name, plongest (tsv->initial_value));
431 do_cleanups (old_chain);
432 return;
433 }
434
435 /* Create a new variable. */
436 tsv = create_trace_state_variable (name);
437 tsv->initial_value = initval;
438
439 observer_notify_tsv_created (tsv);
440
441 printf_filtered (_("Trace state variable $%s "
442 "created, with initial value %s.\n"),
443 tsv->name, plongest (tsv->initial_value));
444
445 do_cleanups (old_chain);
446 }
447
448 static void
449 delete_trace_variable_command (char *args, int from_tty)
450 {
451 int ix;
452 char **argv;
453 struct cleanup *back_to;
454
455 if (args == NULL)
456 {
457 if (query (_("Delete all trace state variables? ")))
458 VEC_free (tsv_s, tvariables);
459 dont_repeat ();
460 observer_notify_tsv_deleted (NULL);
461 return;
462 }
463
464 argv = gdb_buildargv (args);
465 back_to = make_cleanup_freeargv (argv);
466
467 for (ix = 0; argv[ix] != NULL; ix++)
468 {
469 if (*argv[ix] == '$')
470 delete_trace_state_variable (argv[ix] + 1);
471 else
472 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
473 }
474
475 do_cleanups (back_to);
476
477 dont_repeat ();
478 }
479
480 void
481 tvariables_info_1 (void)
482 {
483 struct trace_state_variable *tsv;
484 int ix;
485 int count = 0;
486 struct cleanup *back_to;
487 struct ui_out *uiout = current_uiout;
488
489 if (VEC_length (tsv_s, tvariables) == 0 && !uiout->is_mi_like_p ())
490 {
491 printf_filtered (_("No trace state variables.\n"));
492 return;
493 }
494
495 /* Try to acquire values from the target. */
496 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
497 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
498 &(tsv->value));
499
500 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
501 count, "trace-variables");
502 uiout->table_header (15, ui_left, "name", "Name");
503 uiout->table_header (11, ui_left, "initial", "Initial");
504 uiout->table_header (11, ui_left, "current", "Current");
505
506 uiout->table_body ();
507
508 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
509 {
510 struct cleanup *back_to2;
511 char *c;
512 char *name;
513
514 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
515
516 name = concat ("$", tsv->name, (char *) NULL);
517 make_cleanup (xfree, name);
518 uiout->field_string ("name", name);
519 uiout->field_string ("initial", plongest (tsv->initial_value));
520
521 if (tsv->value_known)
522 c = plongest (tsv->value);
523 else if (uiout->is_mi_like_p ())
524 /* For MI, we prefer not to use magic string constants, but rather
525 omit the field completely. The difference between unknown and
526 undefined does not seem important enough to represent. */
527 c = NULL;
528 else if (current_trace_status ()->running || traceframe_number >= 0)
529 /* The value is/was defined, but we don't have it. */
530 c = "<unknown>";
531 else
532 /* It is not meaningful to ask about the value. */
533 c = "<undefined>";
534 if (c)
535 uiout->field_string ("current", c);
536 uiout->text ("\n");
537
538 do_cleanups (back_to2);
539 }
540
541 do_cleanups (back_to);
542 }
543
544 /* List all the trace state variables. */
545
546 static void
547 tvariables_info (char *args, int from_tty)
548 {
549 tvariables_info_1 ();
550 }
551
552 /* Stash definitions of tsvs into the given file. */
553
554 void
555 save_trace_state_variables (struct ui_file *fp)
556 {
557 struct trace_state_variable *tsv;
558 int ix;
559
560 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
561 {
562 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
563 if (tsv->initial_value)
564 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
565 fprintf_unfiltered (fp, "\n");
566 }
567 }
568
569 /* ACTIONS functions: */
570
571 /* The three functions:
572 collect_pseudocommand,
573 while_stepping_pseudocommand, and
574 end_actions_pseudocommand
575 are placeholders for "commands" that are actually ONLY to be used
576 within a tracepoint action list. If the actual function is ever called,
577 it means that somebody issued the "command" at the top level,
578 which is always an error. */
579
580 static void
581 end_actions_pseudocommand (char *args, int from_tty)
582 {
583 error (_("This command cannot be used at the top level."));
584 }
585
586 static void
587 while_stepping_pseudocommand (char *args, int from_tty)
588 {
589 error (_("This command can only be used in a tracepoint actions list."));
590 }
591
592 static void
593 collect_pseudocommand (char *args, int from_tty)
594 {
595 error (_("This command can only be used in a tracepoint actions list."));
596 }
597
598 static void
599 teval_pseudocommand (char *args, int from_tty)
600 {
601 error (_("This command can only be used in a tracepoint actions list."));
602 }
603
604 /* Parse any collection options, such as /s for strings. */
605
606 const char *
607 decode_agent_options (const char *exp, int *trace_string)
608 {
609 struct value_print_options opts;
610
611 *trace_string = 0;
612
613 if (*exp != '/')
614 return exp;
615
616 /* Call this to borrow the print elements default for collection
617 size. */
618 get_user_print_options (&opts);
619
620 exp++;
621 if (*exp == 's')
622 {
623 if (target_supports_string_tracing ())
624 {
625 /* Allow an optional decimal number giving an explicit maximum
626 string length, defaulting it to the "print elements" value;
627 so "collect/s80 mystr" gets at most 80 bytes of string. */
628 *trace_string = opts.print_max;
629 exp++;
630 if (*exp >= '0' && *exp <= '9')
631 *trace_string = atoi (exp);
632 while (*exp >= '0' && *exp <= '9')
633 exp++;
634 }
635 else
636 error (_("Target does not support \"/s\" option for string tracing."));
637 }
638 else
639 error (_("Undefined collection format \"%c\"."), *exp);
640
641 exp = skip_spaces_const (exp);
642
643 return exp;
644 }
645
646 /* Enter a list of actions for a tracepoint. */
647 static void
648 actions_command (char *args, int from_tty)
649 {
650 struct tracepoint *t;
651 struct command_line *l;
652
653 t = get_tracepoint_by_number (&args, NULL);
654 if (t)
655 {
656 char *tmpbuf =
657 xstrprintf ("Enter actions for tracepoint %d, one per line.",
658 t->base.number);
659 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
660
661 l = read_command_lines (tmpbuf, from_tty, 1,
662 check_tracepoint_command, t);
663 do_cleanups (cleanups);
664 breakpoint_set_commands (&t->base, l);
665 }
666 /* else just return */
667 }
668
669 /* Report the results of checking the agent expression, as errors or
670 internal errors. */
671
672 static void
673 report_agent_reqs_errors (struct agent_expr *aexpr)
674 {
675 /* All of the "flaws" are serious bytecode generation issues that
676 should never occur. */
677 if (aexpr->flaw != agent_flaw_none)
678 internal_error (__FILE__, __LINE__, _("expression is malformed"));
679
680 /* If analysis shows a stack underflow, GDB must have done something
681 badly wrong in its bytecode generation. */
682 if (aexpr->min_height < 0)
683 internal_error (__FILE__, __LINE__,
684 _("expression has min height < 0"));
685
686 /* Issue this error if the stack is predicted to get too deep. The
687 limit is rather arbitrary; a better scheme might be for the
688 target to report how much stack it will have available. The
689 depth roughly corresponds to parenthesization, so a limit of 20
690 amounts to 20 levels of expression nesting, which is actually
691 a pretty big hairy expression. */
692 if (aexpr->max_height > 20)
693 error (_("Expression is too complicated."));
694 }
695
696 /* worker function */
697 void
698 validate_actionline (const char *line, struct breakpoint *b)
699 {
700 struct cmd_list_element *c;
701 struct cleanup *old_chain = NULL;
702 const char *tmp_p;
703 const char *p;
704 struct bp_location *loc;
705 struct tracepoint *t = (struct tracepoint *) b;
706
707 /* If EOF is typed, *line is NULL. */
708 if (line == NULL)
709 return;
710
711 p = skip_spaces_const (line);
712
713 /* Symbol lookup etc. */
714 if (*p == '\0') /* empty line: just prompt for another line. */
715 return;
716
717 if (*p == '#') /* comment line */
718 return;
719
720 c = lookup_cmd (&p, cmdlist, "", -1, 1);
721 if (c == 0)
722 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
723
724 if (cmd_cfunc_eq (c, collect_pseudocommand))
725 {
726 int trace_string = 0;
727
728 if (*p == '/')
729 p = decode_agent_options (p, &trace_string);
730
731 do
732 { /* Repeat over a comma-separated list. */
733 QUIT; /* Allow user to bail out with ^C. */
734 p = skip_spaces_const (p);
735
736 if (*p == '$') /* Look for special pseudo-symbols. */
737 {
738 if (0 == strncasecmp ("reg", p + 1, 3)
739 || 0 == strncasecmp ("arg", p + 1, 3)
740 || 0 == strncasecmp ("loc", p + 1, 3)
741 || 0 == strncasecmp ("_ret", p + 1, 4)
742 || 0 == strncasecmp ("_sdata", p + 1, 6))
743 {
744 p = strchr (p, ',');
745 continue;
746 }
747 /* else fall thru, treat p as an expression and parse it! */
748 }
749 tmp_p = p;
750 for (loc = t->base.loc; loc; loc = loc->next)
751 {
752 p = tmp_p;
753 expression_up exp = parse_exp_1 (&p, loc->address,
754 block_for_pc (loc->address), 1);
755
756 if (exp->elts[0].opcode == OP_VAR_VALUE)
757 {
758 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
759 {
760 error (_("constant `%s' (value %s) "
761 "will not be collected."),
762 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
763 plongest (SYMBOL_VALUE (exp->elts[2].symbol)));
764 }
765 else if (SYMBOL_CLASS (exp->elts[2].symbol)
766 == LOC_OPTIMIZED_OUT)
767 {
768 error (_("`%s' is optimized away "
769 "and cannot be collected."),
770 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
771 }
772 }
773
774 /* We have something to collect, make sure that the expr to
775 bytecode translator can handle it and that it's not too
776 long. */
777 agent_expr_up aexpr = gen_trace_for_expr (loc->address,
778 exp.get (),
779 trace_string);
780
781 if (aexpr->len > MAX_AGENT_EXPR_LEN)
782 error (_("Expression is too complicated."));
783
784 ax_reqs (aexpr.get ());
785
786 report_agent_reqs_errors (aexpr.get ());
787 }
788 }
789 while (p && *p++ == ',');
790 }
791
792 else if (cmd_cfunc_eq (c, teval_pseudocommand))
793 {
794 do
795 { /* Repeat over a comma-separated list. */
796 QUIT; /* Allow user to bail out with ^C. */
797 p = skip_spaces_const (p);
798
799 tmp_p = p;
800 for (loc = t->base.loc; loc; loc = loc->next)
801 {
802 p = tmp_p;
803
804 /* Only expressions are allowed for this action. */
805 expression_up exp = parse_exp_1 (&p, loc->address,
806 block_for_pc (loc->address), 1);
807
808 /* We have something to evaluate, make sure that the expr to
809 bytecode translator can handle it and that it's not too
810 long. */
811 agent_expr_up aexpr = gen_eval_for_expr (loc->address, exp.get ());
812
813 if (aexpr->len > MAX_AGENT_EXPR_LEN)
814 error (_("Expression is too complicated."));
815
816 ax_reqs (aexpr.get ());
817 report_agent_reqs_errors (aexpr.get ());
818 }
819 }
820 while (p && *p++ == ',');
821 }
822
823 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
824 {
825 char *endp;
826
827 p = skip_spaces_const (p);
828 t->step_count = strtol (p, &endp, 0);
829 if (endp == p || t->step_count == 0)
830 error (_("while-stepping step count `%s' is malformed."), line);
831 p = endp;
832 }
833
834 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
835 ;
836
837 else
838 error (_("`%s' is not a supported tracepoint action."), line);
839 }
840
841 enum {
842 memrange_absolute = -1
843 };
844
845 /* MEMRANGE functions: */
846
847 /* Compare memranges for std::sort. */
848
849 static bool
850 memrange_comp (const memrange &a, const memrange &b)
851 {
852 if (a.type == b.type)
853 {
854 if (a.type == memrange_absolute)
855 return (bfd_vma) a.start < (bfd_vma) b.start;
856 else
857 return a.start < b.start;
858 }
859
860 return a.type < b.type;
861 }
862
863 /* Sort the memrange list using std::sort, and merge adjacent memranges. */
864
865 static void
866 memrange_sortmerge (std::vector<memrange> &memranges)
867 {
868 if (!memranges.empty ())
869 {
870 int a, b;
871
872 std::sort (memranges.begin (), memranges.end (), memrange_comp);
873
874 for (a = 0, b = 1; b < memranges.size (); b++)
875 {
876 /* If memrange b overlaps or is adjacent to memrange a,
877 merge them. */
878 if (memranges[a].type == memranges[b].type
879 && memranges[b].start <= memranges[a].end)
880 {
881 if (memranges[b].end > memranges[a].end)
882 memranges[a].end = memranges[b].end;
883 continue; /* next b, same a */
884 }
885 a++; /* next a */
886 if (a != b)
887 memranges[a] = memranges[b];
888 }
889 memranges.resize (a + 1);
890 }
891 }
892
893 /* Add a register to a collection list. */
894
895 void
896 collection_list::add_register (unsigned int regno)
897 {
898 if (info_verbose)
899 printf_filtered ("collect register %d\n", regno);
900 if (regno >= (8 * sizeof (m_regs_mask)))
901 error (_("Internal: register number %d too large for tracepoint"),
902 regno);
903 m_regs_mask[regno / 8] |= 1 << (regno % 8);
904 }
905
906 /* Add a memrange to a collection list. */
907
908 void
909 collection_list::add_memrange (struct gdbarch *gdbarch,
910 int type, bfd_signed_vma base,
911 unsigned long len)
912 {
913 if (info_verbose)
914 printf_filtered ("(%d,%s,%ld)\n", type, paddress (gdbarch, base), len);
915
916 /* type: memrange_absolute == memory, other n == basereg */
917 /* base: addr if memory, offset if reg relative. */
918 /* len: we actually save end (base + len) for convenience */
919 m_memranges.emplace_back (type, base, base + len);
920
921 if (type != memrange_absolute) /* Better collect the base register! */
922 add_register (type);
923 }
924
925 /* Add a symbol to a collection list. */
926
927 void
928 collection_list::collect_symbol (struct symbol *sym,
929 struct gdbarch *gdbarch,
930 long frame_regno, long frame_offset,
931 CORE_ADDR scope,
932 int trace_string)
933 {
934 unsigned long len;
935 unsigned int reg;
936 bfd_signed_vma offset;
937 int treat_as_expr = 0;
938
939 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
940 switch (SYMBOL_CLASS (sym))
941 {
942 default:
943 printf_filtered ("%s: don't know symbol class %d\n",
944 SYMBOL_PRINT_NAME (sym),
945 SYMBOL_CLASS (sym));
946 break;
947 case LOC_CONST:
948 printf_filtered ("constant %s (value %s) will not be collected.\n",
949 SYMBOL_PRINT_NAME (sym), plongest (SYMBOL_VALUE (sym)));
950 break;
951 case LOC_STATIC:
952 offset = SYMBOL_VALUE_ADDRESS (sym);
953 if (info_verbose)
954 {
955 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
956 SYMBOL_PRINT_NAME (sym), len,
957 paddress (gdbarch, offset));
958 }
959 /* A struct may be a C++ class with static fields, go to general
960 expression handling. */
961 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
962 treat_as_expr = 1;
963 else
964 add_memrange (gdbarch, memrange_absolute, offset, len);
965 break;
966 case LOC_REGISTER:
967 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
968 if (info_verbose)
969 printf_filtered ("LOC_REG[parm] %s: ",
970 SYMBOL_PRINT_NAME (sym));
971 add_register (reg);
972 /* Check for doubles stored in two registers. */
973 /* FIXME: how about larger types stored in 3 or more regs? */
974 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
975 len > register_size (gdbarch, reg))
976 add_register (reg + 1);
977 break;
978 case LOC_REF_ARG:
979 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
980 printf_filtered (" (will not collect %s)\n",
981 SYMBOL_PRINT_NAME (sym));
982 break;
983 case LOC_ARG:
984 reg = frame_regno;
985 offset = frame_offset + SYMBOL_VALUE (sym);
986 if (info_verbose)
987 {
988 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
989 " from frame ptr reg %d\n",
990 SYMBOL_PRINT_NAME (sym), len,
991 paddress (gdbarch, offset), reg);
992 }
993 add_memrange (gdbarch, reg, offset, len);
994 break;
995 case LOC_REGPARM_ADDR:
996 reg = SYMBOL_VALUE (sym);
997 offset = 0;
998 if (info_verbose)
999 {
1000 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset %s"
1001 " from reg %d\n",
1002 SYMBOL_PRINT_NAME (sym), len,
1003 paddress (gdbarch, offset), reg);
1004 }
1005 add_memrange (gdbarch, reg, offset, len);
1006 break;
1007 case LOC_LOCAL:
1008 reg = frame_regno;
1009 offset = frame_offset + SYMBOL_VALUE (sym);
1010 if (info_verbose)
1011 {
1012 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset %s"
1013 " from frame ptr reg %d\n",
1014 SYMBOL_PRINT_NAME (sym), len,
1015 paddress (gdbarch, offset), reg);
1016 }
1017 add_memrange (gdbarch, reg, offset, len);
1018 break;
1019
1020 case LOC_UNRESOLVED:
1021 treat_as_expr = 1;
1022 break;
1023
1024 case LOC_OPTIMIZED_OUT:
1025 printf_filtered ("%s has been optimized out of existence.\n",
1026 SYMBOL_PRINT_NAME (sym));
1027 break;
1028
1029 case LOC_COMPUTED:
1030 treat_as_expr = 1;
1031 break;
1032 }
1033
1034 /* Expressions are the most general case. */
1035 if (treat_as_expr)
1036 {
1037 struct cleanup *old_chain1 = NULL;
1038
1039 agent_expr_up aexpr = gen_trace_for_var (scope, gdbarch,
1040 sym, trace_string);
1041
1042 /* It can happen that the symbol is recorded as a computed
1043 location, but it's been optimized away and doesn't actually
1044 have a location expression. */
1045 if (!aexpr)
1046 {
1047 printf_filtered ("%s has been optimized out of existence.\n",
1048 SYMBOL_PRINT_NAME (sym));
1049 return;
1050 }
1051
1052 ax_reqs (aexpr.get ());
1053
1054 report_agent_reqs_errors (aexpr.get ());
1055
1056 /* Take care of the registers. */
1057 if (aexpr->reg_mask_len > 0)
1058 {
1059 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1060 {
1061 QUIT; /* Allow user to bail out with ^C. */
1062 if (aexpr->reg_mask[ndx1] != 0)
1063 {
1064 /* Assume chars have 8 bits. */
1065 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1066 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1067 /* It's used -- record it. */
1068 add_register (ndx1 * 8 + ndx2);
1069 }
1070 }
1071 }
1072
1073 add_aexpr (std::move (aexpr));
1074 }
1075 }
1076
1077 /* Data to be passed around in the calls to the locals and args
1078 iterators. */
1079
1080 struct add_local_symbols_data
1081 {
1082 struct collection_list *collect;
1083 struct gdbarch *gdbarch;
1084 CORE_ADDR pc;
1085 long frame_regno;
1086 long frame_offset;
1087 int count;
1088 int trace_string;
1089 };
1090
1091 /* The callback for the locals and args iterators. */
1092
1093 static void
1094 do_collect_symbol (const char *print_name,
1095 struct symbol *sym,
1096 void *cb_data)
1097 {
1098 struct add_local_symbols_data *p = (struct add_local_symbols_data *) cb_data;
1099
1100 p->collect->collect_symbol (sym, p->gdbarch, p->frame_regno,
1101 p->frame_offset, p->pc, p->trace_string);
1102 p->count++;
1103
1104 p->collect->add_wholly_collected (print_name);
1105 }
1106
1107 void
1108 collection_list::add_wholly_collected (const char *print_name)
1109 {
1110 m_wholly_collected.push_back (print_name);
1111 }
1112
1113 /* Add all locals (or args) symbols to collection list. */
1114
1115 void
1116 collection_list::add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
1117 long frame_regno, long frame_offset, int type,
1118 int trace_string)
1119 {
1120 const struct block *block;
1121 struct add_local_symbols_data cb_data;
1122
1123 cb_data.collect = this;
1124 cb_data.gdbarch = gdbarch;
1125 cb_data.pc = pc;
1126 cb_data.frame_regno = frame_regno;
1127 cb_data.frame_offset = frame_offset;
1128 cb_data.count = 0;
1129 cb_data.trace_string = trace_string;
1130
1131 if (type == 'L')
1132 {
1133 block = block_for_pc (pc);
1134 if (block == NULL)
1135 {
1136 warning (_("Can't collect locals; "
1137 "no symbol table info available.\n"));
1138 return;
1139 }
1140
1141 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1142 if (cb_data.count == 0)
1143 warning (_("No locals found in scope."));
1144 }
1145 else
1146 {
1147 pc = get_pc_function_start (pc);
1148 block = block_for_pc (pc);
1149 if (block == NULL)
1150 {
1151 warning (_("Can't collect args; no symbol table info available."));
1152 return;
1153 }
1154
1155 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1156 if (cb_data.count == 0)
1157 warning (_("No args found in scope."));
1158 }
1159 }
1160
1161 void
1162 collection_list::add_static_trace_data ()
1163 {
1164 if (info_verbose)
1165 printf_filtered ("collect static trace data\n");
1166 m_strace_data = true;
1167 }
1168
1169 collection_list::collection_list ()
1170 : m_regs_mask (),
1171 m_strace_data (false)
1172 {
1173 m_memranges.reserve (128);
1174 m_aexprs.reserve (128);
1175 }
1176
1177 /* Reduce a collection list to string form (for gdb protocol). */
1178
1179 char **
1180 collection_list::stringify ()
1181 {
1182 char temp_buf[2048];
1183 int count;
1184 int ndx = 0;
1185 char *(*str_list)[];
1186 char *end;
1187 long i;
1188
1189 count = 1 + 1 + m_memranges.size () + m_aexprs.size () + 1;
1190 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1191
1192 if (m_strace_data)
1193 {
1194 if (info_verbose)
1195 printf_filtered ("\nCollecting static trace data\n");
1196 end = temp_buf;
1197 *end++ = 'L';
1198 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1199 ndx++;
1200 }
1201
1202 for (i = sizeof (m_regs_mask) - 1; i > 0; i--)
1203 if (m_regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
1204 break;
1205 if (m_regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
1206 {
1207 if (info_verbose)
1208 printf_filtered ("\nCollecting registers (mask): 0x");
1209 end = temp_buf;
1210 *end++ = 'R';
1211 for (; i >= 0; i--)
1212 {
1213 QUIT; /* Allow user to bail out with ^C. */
1214 if (info_verbose)
1215 printf_filtered ("%02X", m_regs_mask[i]);
1216 sprintf (end, "%02X", m_regs_mask[i]);
1217 end += 2;
1218 }
1219 (*str_list)[ndx] = xstrdup (temp_buf);
1220 ndx++;
1221 }
1222 if (info_verbose)
1223 printf_filtered ("\n");
1224 if (!m_memranges.empty () && info_verbose)
1225 printf_filtered ("Collecting memranges: \n");
1226 for (i = 0, count = 0, end = temp_buf; i < m_memranges.size (); i++)
1227 {
1228 QUIT; /* Allow user to bail out with ^C. */
1229 if (info_verbose)
1230 {
1231 printf_filtered ("(%d, %s, %ld)\n",
1232 m_memranges[i].type,
1233 paddress (target_gdbarch (),
1234 m_memranges[i].start),
1235 (long) (m_memranges[i].end
1236 - m_memranges[i].start));
1237 }
1238 if (count + 27 > MAX_AGENT_EXPR_LEN)
1239 {
1240 (*str_list)[ndx] = savestring (temp_buf, count);
1241 ndx++;
1242 count = 0;
1243 end = temp_buf;
1244 }
1245
1246 {
1247 bfd_signed_vma length
1248 = m_memranges[i].end - m_memranges[i].start;
1249
1250 /* The "%X" conversion specifier expects an unsigned argument,
1251 so passing -1 (memrange_absolute) to it directly gives you
1252 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1253 Special-case it. */
1254 if (m_memranges[i].type == memrange_absolute)
1255 sprintf (end, "M-1,%s,%lX", phex_nz (m_memranges[i].start, 0),
1256 (long) length);
1257 else
1258 sprintf (end, "M%X,%s,%lX", m_memranges[i].type,
1259 phex_nz (m_memranges[i].start, 0), (long) length);
1260 }
1261
1262 count += strlen (end);
1263 end = temp_buf + count;
1264 }
1265
1266 for (i = 0; i < m_aexprs.size (); i++)
1267 {
1268 QUIT; /* Allow user to bail out with ^C. */
1269 if ((count + 10 + 2 * m_aexprs[i]->len) > MAX_AGENT_EXPR_LEN)
1270 {
1271 (*str_list)[ndx] = savestring (temp_buf, count);
1272 ndx++;
1273 count = 0;
1274 end = temp_buf;
1275 }
1276 sprintf (end, "X%08X,", m_aexprs[i]->len);
1277 end += 10; /* 'X' + 8 hex digits + ',' */
1278 count += 10;
1279
1280 end = mem2hex (m_aexprs[i]->buf, end, m_aexprs[i]->len);
1281 count += 2 * m_aexprs[i]->len;
1282 }
1283
1284 if (count != 0)
1285 {
1286 (*str_list)[ndx] = savestring (temp_buf, count);
1287 ndx++;
1288 count = 0;
1289 end = temp_buf;
1290 }
1291 (*str_list)[ndx] = NULL;
1292
1293 if (ndx == 0)
1294 {
1295 xfree (str_list);
1296 return NULL;
1297 }
1298 else
1299 return *str_list;
1300 }
1301
1302 /* Add the printed expression EXP to *LIST. */
1303
1304 void
1305 collection_list::append_exp (struct expression *exp)
1306 {
1307 struct ui_file *tmp_stream = mem_fileopen ();
1308
1309 print_expression (exp, tmp_stream);
1310
1311 m_computed.push_back (ui_file_as_string (tmp_stream));
1312 ui_file_delete (tmp_stream);
1313 }
1314
1315 void
1316 collection_list::finish ()
1317 {
1318 memrange_sortmerge (m_memranges);
1319 }
1320
1321 static void
1322 encode_actions_1 (struct command_line *action,
1323 struct bp_location *tloc,
1324 int frame_reg,
1325 LONGEST frame_offset,
1326 struct collection_list *collect,
1327 struct collection_list *stepping_list)
1328 {
1329 const char *action_exp;
1330 int i;
1331 struct value *tempval;
1332 struct cmd_list_element *cmd;
1333
1334 for (; action; action = action->next)
1335 {
1336 QUIT; /* Allow user to bail out with ^C. */
1337 action_exp = action->line;
1338 action_exp = skip_spaces_const (action_exp);
1339
1340 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1341 if (cmd == 0)
1342 error (_("Bad action list item: %s"), action_exp);
1343
1344 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1345 {
1346 int trace_string = 0;
1347
1348 if (*action_exp == '/')
1349 action_exp = decode_agent_options (action_exp, &trace_string);
1350
1351 do
1352 { /* Repeat over a comma-separated list. */
1353 QUIT; /* Allow user to bail out with ^C. */
1354 action_exp = skip_spaces_const (action_exp);
1355
1356 if (0 == strncasecmp ("$reg", action_exp, 4))
1357 {
1358 for (i = 0; i < gdbarch_num_regs (target_gdbarch ()); i++)
1359 collect->add_register (i);
1360 action_exp = strchr (action_exp, ','); /* more? */
1361 }
1362 else if (0 == strncasecmp ("$arg", action_exp, 4))
1363 {
1364 collect->add_local_symbols (target_gdbarch (),
1365 tloc->address,
1366 frame_reg,
1367 frame_offset,
1368 'A',
1369 trace_string);
1370 action_exp = strchr (action_exp, ','); /* more? */
1371 }
1372 else if (0 == strncasecmp ("$loc", action_exp, 4))
1373 {
1374 collect->add_local_symbols (target_gdbarch (),
1375 tloc->address,
1376 frame_reg,
1377 frame_offset,
1378 'L',
1379 trace_string);
1380 action_exp = strchr (action_exp, ','); /* more? */
1381 }
1382 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1383 {
1384 agent_expr_up aexpr
1385 = gen_trace_for_return_address (tloc->address,
1386 target_gdbarch (),
1387 trace_string);
1388
1389 ax_reqs (aexpr.get ());
1390 report_agent_reqs_errors (aexpr.get ());
1391
1392 /* take care of the registers */
1393 if (aexpr->reg_mask_len > 0)
1394 {
1395 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1396 {
1397 QUIT; /* allow user to bail out with ^C */
1398 if (aexpr->reg_mask[ndx1] != 0)
1399 {
1400 /* assume chars have 8 bits */
1401 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1402 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1403 {
1404 /* It's used -- record it. */
1405 collect->add_register (ndx1 * 8 + ndx2);
1406 }
1407 }
1408 }
1409 }
1410
1411 collect->add_aexpr (std::move (aexpr));
1412 action_exp = strchr (action_exp, ','); /* more? */
1413 }
1414 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1415 {
1416 collect->add_static_trace_data ();
1417 action_exp = strchr (action_exp, ','); /* more? */
1418 }
1419 else
1420 {
1421 unsigned long addr;
1422 struct cleanup *old_chain1 = NULL;
1423
1424 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1425 block_for_pc (tloc->address),
1426 1);
1427
1428 switch (exp->elts[0].opcode)
1429 {
1430 case OP_REGISTER:
1431 {
1432 const char *name = &exp->elts[2].string;
1433
1434 i = user_reg_map_name_to_regnum (target_gdbarch (),
1435 name, strlen (name));
1436 if (i == -1)
1437 internal_error (__FILE__, __LINE__,
1438 _("Register $%s not available"),
1439 name);
1440 if (info_verbose)
1441 printf_filtered ("OP_REGISTER: ");
1442 collect->add_register (i);
1443 break;
1444 }
1445
1446 case UNOP_MEMVAL:
1447 /* Safe because we know it's a simple expression. */
1448 tempval = evaluate_expression (exp.get ());
1449 addr = value_address (tempval);
1450 /* Initialize the TYPE_LENGTH if it is a typedef. */
1451 check_typedef (exp->elts[1].type);
1452 collect->add_memrange (target_gdbarch (),
1453 memrange_absolute, addr,
1454 TYPE_LENGTH (exp->elts[1].type));
1455 collect->append_exp (exp.get ());
1456 break;
1457
1458 case OP_VAR_VALUE:
1459 {
1460 struct symbol *sym = exp->elts[2].symbol;
1461 char_ptr name = (char_ptr) SYMBOL_NATURAL_NAME (sym);
1462
1463 collect->collect_symbol (exp->elts[2].symbol,
1464 target_gdbarch (),
1465 frame_reg,
1466 frame_offset,
1467 tloc->address,
1468 trace_string);
1469 collect->add_wholly_collected (name);
1470 }
1471 break;
1472
1473 default: /* Full-fledged expression. */
1474 agent_expr_up aexpr = gen_trace_for_expr (tloc->address,
1475 exp.get (),
1476 trace_string);
1477
1478 ax_reqs (aexpr.get ());
1479
1480 report_agent_reqs_errors (aexpr.get ());
1481
1482 /* Take care of the registers. */
1483 if (aexpr->reg_mask_len > 0)
1484 {
1485 for (int ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
1486 {
1487 QUIT; /* Allow user to bail out with ^C. */
1488 if (aexpr->reg_mask[ndx1] != 0)
1489 {
1490 /* Assume chars have 8 bits. */
1491 for (int ndx2 = 0; ndx2 < 8; ndx2++)
1492 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
1493 {
1494 /* It's used -- record it. */
1495 collect->add_register (ndx1 * 8 + ndx2);
1496 }
1497 }
1498 }
1499 }
1500
1501 collect->add_aexpr (std::move (aexpr));
1502 collect->append_exp (exp.get ());
1503 break;
1504 } /* switch */
1505 } /* do */
1506 }
1507 while (action_exp && *action_exp++ == ',');
1508 } /* if */
1509 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1510 {
1511 do
1512 { /* Repeat over a comma-separated list. */
1513 QUIT; /* Allow user to bail out with ^C. */
1514 action_exp = skip_spaces_const (action_exp);
1515
1516 {
1517 struct cleanup *old_chain1 = NULL;
1518
1519 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1520 block_for_pc (tloc->address),
1521 1);
1522
1523 agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
1524 exp.get ());
1525
1526 ax_reqs (aexpr.get ());
1527 report_agent_reqs_errors (aexpr.get ());
1528
1529 /* Even though we're not officially collecting, add
1530 to the collect list anyway. */
1531 collect->add_aexpr (std::move (aexpr));
1532 } /* do */
1533 }
1534 while (action_exp && *action_exp++ == ',');
1535 } /* if */
1536 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1537 {
1538 /* We check against nested while-stepping when setting
1539 breakpoint action, so no way to run into nested
1540 here. */
1541 gdb_assert (stepping_list);
1542
1543 encode_actions_1 (action->body_list[0], tloc, frame_reg,
1544 frame_offset, stepping_list, NULL);
1545 }
1546 else
1547 error (_("Invalid tracepoint command '%s'"), action->line);
1548 } /* for */
1549 }
1550
1551 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1552 and STEPPING_LIST. */
1553
1554 void
1555 encode_actions (struct bp_location *tloc,
1556 struct collection_list *tracepoint_list,
1557 struct collection_list *stepping_list)
1558 {
1559 struct command_line *actions;
1560 int frame_reg;
1561 LONGEST frame_offset;
1562
1563 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1564 tloc->address, &frame_reg, &frame_offset);
1565
1566 actions = all_tracepoint_actions_and_cleanup (tloc->owner);
1567
1568 encode_actions_1 (actions, tloc, frame_reg, frame_offset,
1569 tracepoint_list, stepping_list);
1570
1571 tracepoint_list->finish ();
1572 stepping_list->finish ();
1573 }
1574
1575 /* Render all actions into gdb protocol. */
1576
1577 void
1578 encode_actions_rsp (struct bp_location *tloc, char ***tdp_actions,
1579 char ***stepping_actions)
1580 {
1581 struct collection_list tracepoint_list, stepping_list;
1582
1583 *tdp_actions = NULL;
1584 *stepping_actions = NULL;
1585
1586 encode_actions (tloc, &tracepoint_list, &stepping_list);
1587
1588 *tdp_actions = tracepoint_list.stringify ();
1589 *stepping_actions = stepping_list.stringify ();
1590 }
1591
1592 void
1593 collection_list::add_aexpr (agent_expr_up aexpr)
1594 {
1595 m_aexprs.push_back (std::move (aexpr));
1596 }
1597
1598 static void
1599 process_tracepoint_on_disconnect (void)
1600 {
1601 VEC(breakpoint_p) *tp_vec = NULL;
1602 int ix;
1603 struct breakpoint *b;
1604 int has_pending_p = 0;
1605
1606 /* Check whether we still have pending tracepoint. If we have, warn the
1607 user that pending tracepoint will no longer work. */
1608 tp_vec = all_tracepoints ();
1609 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1610 {
1611 if (b->loc == NULL)
1612 {
1613 has_pending_p = 1;
1614 break;
1615 }
1616 else
1617 {
1618 struct bp_location *loc1;
1619
1620 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1621 {
1622 if (loc1->shlib_disabled)
1623 {
1624 has_pending_p = 1;
1625 break;
1626 }
1627 }
1628
1629 if (has_pending_p)
1630 break;
1631 }
1632 }
1633 VEC_free (breakpoint_p, tp_vec);
1634
1635 if (has_pending_p)
1636 warning (_("Pending tracepoints will not be resolved while"
1637 " GDB is disconnected\n"));
1638 }
1639
1640 /* Reset local state of tracing. */
1641
1642 void
1643 trace_reset_local_state (void)
1644 {
1645 set_traceframe_num (-1);
1646 set_tracepoint_num (-1);
1647 set_traceframe_context (NULL);
1648 clear_traceframe_info ();
1649 }
1650
1651 void
1652 start_tracing (char *notes)
1653 {
1654 VEC(breakpoint_p) *tp_vec = NULL;
1655 int ix;
1656 struct breakpoint *b;
1657 struct trace_state_variable *tsv;
1658 int any_enabled = 0, num_to_download = 0;
1659 int ret;
1660
1661 tp_vec = all_tracepoints ();
1662
1663 /* No point in tracing without any tracepoints... */
1664 if (VEC_length (breakpoint_p, tp_vec) == 0)
1665 {
1666 VEC_free (breakpoint_p, tp_vec);
1667 error (_("No tracepoints defined, not starting trace"));
1668 }
1669
1670 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1671 {
1672 if (b->enable_state == bp_enabled)
1673 any_enabled = 1;
1674
1675 if ((b->type == bp_fast_tracepoint
1676 ? may_insert_fast_tracepoints
1677 : may_insert_tracepoints))
1678 ++num_to_download;
1679 else
1680 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1681 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1682 }
1683
1684 if (!any_enabled)
1685 {
1686 if (target_supports_enable_disable_tracepoint ())
1687 warning (_("No tracepoints enabled"));
1688 else
1689 {
1690 /* No point in tracing with only disabled tracepoints that
1691 cannot be re-enabled. */
1692 VEC_free (breakpoint_p, tp_vec);
1693 error (_("No tracepoints enabled, not starting trace"));
1694 }
1695 }
1696
1697 if (num_to_download <= 0)
1698 {
1699 VEC_free (breakpoint_p, tp_vec);
1700 error (_("No tracepoints that may be downloaded, not starting trace"));
1701 }
1702
1703 target_trace_init ();
1704
1705 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
1706 {
1707 struct tracepoint *t = (struct tracepoint *) b;
1708 struct bp_location *loc;
1709 int bp_location_downloaded = 0;
1710
1711 /* Clear `inserted' flag. */
1712 for (loc = b->loc; loc; loc = loc->next)
1713 loc->inserted = 0;
1714
1715 if ((b->type == bp_fast_tracepoint
1716 ? !may_insert_fast_tracepoints
1717 : !may_insert_tracepoints))
1718 continue;
1719
1720 t->number_on_target = 0;
1721
1722 for (loc = b->loc; loc; loc = loc->next)
1723 {
1724 /* Since tracepoint locations are never duplicated, `inserted'
1725 flag should be zero. */
1726 gdb_assert (!loc->inserted);
1727
1728 target_download_tracepoint (loc);
1729
1730 loc->inserted = 1;
1731 bp_location_downloaded = 1;
1732 }
1733
1734 t->number_on_target = b->number;
1735
1736 for (loc = b->loc; loc; loc = loc->next)
1737 if (loc->probe.probe != NULL
1738 && loc->probe.probe->pops->set_semaphore != NULL)
1739 loc->probe.probe->pops->set_semaphore (loc->probe.probe,
1740 loc->probe.objfile,
1741 loc->gdbarch);
1742
1743 if (bp_location_downloaded)
1744 observer_notify_breakpoint_modified (b);
1745 }
1746 VEC_free (breakpoint_p, tp_vec);
1747
1748 /* Send down all the trace state variables too. */
1749 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1750 {
1751 target_download_trace_state_variable (tsv);
1752 }
1753
1754 /* Tell target to treat text-like sections as transparent. */
1755 target_trace_set_readonly_regions ();
1756 /* Set some mode flags. */
1757 target_set_disconnected_tracing (disconnected_tracing);
1758 target_set_circular_trace_buffer (circular_trace_buffer);
1759 target_set_trace_buffer_size (trace_buffer_size);
1760
1761 if (!notes)
1762 notes = trace_notes;
1763 ret = target_set_trace_notes (trace_user, notes, NULL);
1764
1765 if (!ret && (trace_user || notes))
1766 warning (_("Target does not support trace user/notes, info ignored"));
1767
1768 /* Now insert traps and begin collecting data. */
1769 target_trace_start ();
1770
1771 /* Reset our local state. */
1772 trace_reset_local_state ();
1773 current_trace_status()->running = 1;
1774 }
1775
1776 /* The tstart command requests the target to start a new trace run.
1777 The command passes any arguments it has to the target verbatim, as
1778 an optional "trace note". This is useful as for instance a warning
1779 to other users if the trace runs disconnected, and you don't want
1780 anybody else messing with the target. */
1781
1782 static void
1783 tstart_command (char *args, int from_tty)
1784 {
1785 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1786
1787 if (current_trace_status ()->running)
1788 {
1789 if (from_tty
1790 && !query (_("A trace is running already. Start a new run? ")))
1791 error (_("New trace run not started."));
1792 }
1793
1794 start_tracing (args);
1795 }
1796
1797 /* The tstop command stops the tracing run. The command passes any
1798 supplied arguments to the target verbatim as a "stop note"; if the
1799 target supports trace notes, then it will be reported back as part
1800 of the trace run's status. */
1801
1802 static void
1803 tstop_command (char *args, int from_tty)
1804 {
1805 if (!current_trace_status ()->running)
1806 error (_("Trace is not running."));
1807
1808 stop_tracing (args);
1809 }
1810
1811 void
1812 stop_tracing (char *note)
1813 {
1814 int ret;
1815 VEC(breakpoint_p) *tp_vec = NULL;
1816 int ix;
1817 struct breakpoint *t;
1818
1819 target_trace_stop ();
1820
1821 tp_vec = all_tracepoints ();
1822 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1823 {
1824 struct bp_location *loc;
1825
1826 if ((t->type == bp_fast_tracepoint
1827 ? !may_insert_fast_tracepoints
1828 : !may_insert_tracepoints))
1829 continue;
1830
1831 for (loc = t->loc; loc; loc = loc->next)
1832 {
1833 /* GDB can be totally absent in some disconnected trace scenarios,
1834 but we don't really care if this semaphore goes out of sync.
1835 That's why we are decrementing it here, but not taking care
1836 in other places. */
1837 if (loc->probe.probe != NULL
1838 && loc->probe.probe->pops->clear_semaphore != NULL)
1839 loc->probe.probe->pops->clear_semaphore (loc->probe.probe,
1840 loc->probe.objfile,
1841 loc->gdbarch);
1842 }
1843 }
1844
1845 VEC_free (breakpoint_p, tp_vec);
1846
1847 if (!note)
1848 note = trace_stop_notes;
1849 ret = target_set_trace_notes (NULL, NULL, note);
1850
1851 if (!ret && note)
1852 warning (_("Target does not support trace notes, note ignored"));
1853
1854 /* Should change in response to reply? */
1855 current_trace_status ()->running = 0;
1856 }
1857
1858 /* tstatus command */
1859 static void
1860 tstatus_command (char *args, int from_tty)
1861 {
1862 struct trace_status *ts = current_trace_status ();
1863 int status, ix;
1864 VEC(breakpoint_p) *tp_vec = NULL;
1865 struct breakpoint *t;
1866
1867 status = target_get_trace_status (ts);
1868
1869 if (status == -1)
1870 {
1871 if (ts->filename != NULL)
1872 printf_filtered (_("Using a trace file.\n"));
1873 else
1874 {
1875 printf_filtered (_("Trace can not be run on this target.\n"));
1876 return;
1877 }
1878 }
1879
1880 if (!ts->running_known)
1881 {
1882 printf_filtered (_("Run/stop status is unknown.\n"));
1883 }
1884 else if (ts->running)
1885 {
1886 printf_filtered (_("Trace is running on the target.\n"));
1887 }
1888 else
1889 {
1890 switch (ts->stop_reason)
1891 {
1892 case trace_never_run:
1893 printf_filtered (_("No trace has been run on the target.\n"));
1894 break;
1895 case trace_stop_command:
1896 if (ts->stop_desc)
1897 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1898 ts->stop_desc);
1899 else
1900 printf_filtered (_("Trace stopped by a tstop command.\n"));
1901 break;
1902 case trace_buffer_full:
1903 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1904 break;
1905 case trace_disconnected:
1906 printf_filtered (_("Trace stopped because of disconnection.\n"));
1907 break;
1908 case tracepoint_passcount:
1909 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1910 ts->stopping_tracepoint);
1911 break;
1912 case tracepoint_error:
1913 if (ts->stopping_tracepoint)
1914 printf_filtered (_("Trace stopped by an "
1915 "error (%s, tracepoint %d).\n"),
1916 ts->stop_desc, ts->stopping_tracepoint);
1917 else
1918 printf_filtered (_("Trace stopped by an error (%s).\n"),
1919 ts->stop_desc);
1920 break;
1921 case trace_stop_reason_unknown:
1922 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1923 break;
1924 default:
1925 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1926 ts->stop_reason);
1927 break;
1928 }
1929 }
1930
1931 if (ts->traceframes_created >= 0
1932 && ts->traceframe_count != ts->traceframes_created)
1933 {
1934 printf_filtered (_("Buffer contains %d trace "
1935 "frames (of %d created total).\n"),
1936 ts->traceframe_count, ts->traceframes_created);
1937 }
1938 else if (ts->traceframe_count >= 0)
1939 {
1940 printf_filtered (_("Collected %d trace frames.\n"),
1941 ts->traceframe_count);
1942 }
1943
1944 if (ts->buffer_free >= 0)
1945 {
1946 if (ts->buffer_size >= 0)
1947 {
1948 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1949 ts->buffer_free, ts->buffer_size);
1950 if (ts->buffer_size > 0)
1951 printf_filtered (_(" (%d%% full)"),
1952 ((int) ((((long long) (ts->buffer_size
1953 - ts->buffer_free)) * 100)
1954 / ts->buffer_size)));
1955 printf_filtered (_(".\n"));
1956 }
1957 else
1958 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1959 ts->buffer_free);
1960 }
1961
1962 if (ts->disconnected_tracing)
1963 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1964 else
1965 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1966
1967 if (ts->circular_buffer)
1968 printf_filtered (_("Trace buffer is circular.\n"));
1969
1970 if (ts->user_name && strlen (ts->user_name) > 0)
1971 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
1972
1973 if (ts->notes && strlen (ts->notes) > 0)
1974 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
1975
1976 /* Now report on what we're doing with tfind. */
1977 if (traceframe_number >= 0)
1978 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1979 traceframe_number, tracepoint_number);
1980 else
1981 printf_filtered (_("Not looking at any trace frame.\n"));
1982
1983 /* Report start/stop times if supplied. */
1984 if (ts->start_time)
1985 {
1986 if (ts->stop_time)
1987 {
1988 LONGEST run_time = ts->stop_time - ts->start_time;
1989
1990 /* Reporting a run time is more readable than two long numbers. */
1991 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1992 (long int) (ts->start_time / 1000000),
1993 (long int) (ts->start_time % 1000000),
1994 (long int) (run_time / 1000000),
1995 (long int) (run_time % 1000000));
1996 }
1997 else
1998 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
1999 (long int) (ts->start_time / 1000000),
2000 (long int) (ts->start_time % 1000000));
2001 }
2002 else if (ts->stop_time)
2003 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
2004 (long int) (ts->stop_time / 1000000),
2005 (long int) (ts->stop_time % 1000000));
2006
2007 /* Now report any per-tracepoint status available. */
2008 tp_vec = all_tracepoints ();
2009
2010 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2011 target_get_tracepoint_status (t, NULL);
2012
2013 VEC_free (breakpoint_p, tp_vec);
2014 }
2015
2016 /* Report the trace status to uiout, in a way suitable for MI, and not
2017 suitable for CLI. If ON_STOP is true, suppress a few fields that
2018 are not meaningful in the -trace-stop response.
2019
2020 The implementation is essentially parallel to trace_status_command, but
2021 merging them will result in unreadable code. */
2022 void
2023 trace_status_mi (int on_stop)
2024 {
2025 struct ui_out *uiout = current_uiout;
2026 struct trace_status *ts = current_trace_status ();
2027 int status;
2028
2029 status = target_get_trace_status (ts);
2030
2031 if (status == -1 && ts->filename == NULL)
2032 {
2033 uiout->field_string ("supported", "0");
2034 return;
2035 }
2036
2037 if (ts->filename != NULL)
2038 uiout->field_string ("supported", "file");
2039 else if (!on_stop)
2040 uiout->field_string ("supported", "1");
2041
2042 if (ts->filename != NULL)
2043 uiout->field_string ("trace-file", ts->filename);
2044
2045 gdb_assert (ts->running_known);
2046
2047 if (ts->running)
2048 {
2049 uiout->field_string ("running", "1");
2050
2051 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
2052 Given that the frontend gets the status either on -trace-stop, or from
2053 -trace-status after re-connection, it does not seem like this
2054 information is necessary for anything. It is not necessary for either
2055 figuring the vital state of the target nor for navigation of trace
2056 frames. If the frontend wants to show the current state is some
2057 configure dialog, it can request the value when such dialog is
2058 invoked by the user. */
2059 }
2060 else
2061 {
2062 char *stop_reason = NULL;
2063 int stopping_tracepoint = -1;
2064
2065 if (!on_stop)
2066 uiout->field_string ("running", "0");
2067
2068 if (ts->stop_reason != trace_stop_reason_unknown)
2069 {
2070 switch (ts->stop_reason)
2071 {
2072 case trace_stop_command:
2073 stop_reason = "request";
2074 break;
2075 case trace_buffer_full:
2076 stop_reason = "overflow";
2077 break;
2078 case trace_disconnected:
2079 stop_reason = "disconnection";
2080 break;
2081 case tracepoint_passcount:
2082 stop_reason = "passcount";
2083 stopping_tracepoint = ts->stopping_tracepoint;
2084 break;
2085 case tracepoint_error:
2086 stop_reason = "error";
2087 stopping_tracepoint = ts->stopping_tracepoint;
2088 break;
2089 }
2090
2091 if (stop_reason)
2092 {
2093 uiout->field_string ("stop-reason", stop_reason);
2094 if (stopping_tracepoint != -1)
2095 uiout->field_int ("stopping-tracepoint",
2096 stopping_tracepoint);
2097 if (ts->stop_reason == tracepoint_error)
2098 uiout->field_string ("error-description",
2099 ts->stop_desc);
2100 }
2101 }
2102 }
2103
2104 if (ts->traceframe_count != -1)
2105 uiout->field_int ("frames", ts->traceframe_count);
2106 if (ts->traceframes_created != -1)
2107 uiout->field_int ("frames-created", ts->traceframes_created);
2108 if (ts->buffer_size != -1)
2109 uiout->field_int ("buffer-size", ts->buffer_size);
2110 if (ts->buffer_free != -1)
2111 uiout->field_int ("buffer-free", ts->buffer_free);
2112
2113 uiout->field_int ("disconnected", ts->disconnected_tracing);
2114 uiout->field_int ("circular", ts->circular_buffer);
2115
2116 uiout->field_string ("user-name", ts->user_name);
2117 uiout->field_string ("notes", ts->notes);
2118
2119 {
2120 char buf[100];
2121
2122 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2123 (long int) (ts->start_time / 1000000),
2124 (long int) (ts->start_time % 1000000));
2125 uiout->field_string ("start-time", buf);
2126 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2127 (long int) (ts->stop_time / 1000000),
2128 (long int) (ts->stop_time % 1000000));
2129 uiout->field_string ("stop-time", buf);
2130 }
2131 }
2132
2133 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the
2134 user if she really wants to detach. */
2135
2136 void
2137 query_if_trace_running (int from_tty)
2138 {
2139 if (!from_tty)
2140 return;
2141
2142 /* It can happen that the target that was tracing went away on its
2143 own, and we didn't notice. Get a status update, and if the
2144 current target doesn't even do tracing, then assume it's not
2145 running anymore. */
2146 if (target_get_trace_status (current_trace_status ()) < 0)
2147 current_trace_status ()->running = 0;
2148
2149 /* If running interactively, give the user the option to cancel and
2150 then decide what to do differently with the run. Scripts are
2151 just going to disconnect and let the target deal with it,
2152 according to how it's been instructed previously via
2153 disconnected-tracing. */
2154 if (current_trace_status ()->running)
2155 {
2156 process_tracepoint_on_disconnect ();
2157
2158 if (current_trace_status ()->disconnected_tracing)
2159 {
2160 if (!query (_("Trace is running and will "
2161 "continue after detach; detach anyway? ")))
2162 error (_("Not confirmed."));
2163 }
2164 else
2165 {
2166 if (!query (_("Trace is running but will "
2167 "stop on detach; detach anyway? ")))
2168 error (_("Not confirmed."));
2169 }
2170 }
2171 }
2172
2173 /* This function handles the details of what to do about an ongoing
2174 tracing run if the user has asked to detach or otherwise disconnect
2175 from the target. */
2176
2177 void
2178 disconnect_tracing (void)
2179 {
2180 /* Also we want to be out of tfind mode, otherwise things can get
2181 confusing upon reconnection. Just use these calls instead of
2182 full tfind_1 behavior because we're in the middle of detaching,
2183 and there's no point to updating current stack frame etc. */
2184 trace_reset_local_state ();
2185 }
2186
2187 /* Worker function for the various flavors of the tfind command. */
2188 void
2189 tfind_1 (enum trace_find_type type, int num,
2190 CORE_ADDR addr1, CORE_ADDR addr2,
2191 int from_tty)
2192 {
2193 int target_frameno = -1, target_tracept = -1;
2194 struct frame_id old_frame_id = null_frame_id;
2195 struct tracepoint *tp;
2196 struct ui_out *uiout = current_uiout;
2197
2198 /* Only try to get the current stack frame if we have a chance of
2199 succeeding. In particular, if we're trying to get a first trace
2200 frame while all threads are running, it's not going to succeed,
2201 so leave it with a default value and let the frame comparison
2202 below (correctly) decide to print out the source location of the
2203 trace frame. */
2204 if (!(type == tfind_number && num == -1)
2205 && (has_stack_frames () || traceframe_number >= 0))
2206 old_frame_id = get_frame_id (get_current_frame ());
2207
2208 target_frameno = target_trace_find (type, num, addr1, addr2,
2209 &target_tracept);
2210
2211 if (type == tfind_number
2212 && num == -1
2213 && target_frameno == -1)
2214 {
2215 /* We told the target to get out of tfind mode, and it did. */
2216 }
2217 else if (target_frameno == -1)
2218 {
2219 /* A request for a non-existent trace frame has failed.
2220 Our response will be different, depending on FROM_TTY:
2221
2222 If FROM_TTY is true, meaning that this command was
2223 typed interactively by the user, then give an error
2224 and DO NOT change the state of traceframe_number etc.
2225
2226 However if FROM_TTY is false, meaning that we're either
2227 in a script, a loop, or a user-defined command, then
2228 DON'T give an error, but DO change the state of
2229 traceframe_number etc. to invalid.
2230
2231 The rationalle is that if you typed the command, you
2232 might just have committed a typo or something, and you'd
2233 like to NOT lose your current debugging state. However
2234 if you're in a user-defined command or especially in a
2235 loop, then you need a way to detect that the command
2236 failed WITHOUT aborting. This allows you to write
2237 scripts that search thru the trace buffer until the end,
2238 and then continue on to do something else. */
2239
2240 if (from_tty)
2241 error (_("Target failed to find requested trace frame."));
2242 else
2243 {
2244 if (info_verbose)
2245 printf_filtered ("End of trace buffer.\n");
2246 #if 0 /* dubious now? */
2247 /* The following will not recurse, since it's
2248 special-cased. */
2249 tfind_command ("-1", from_tty);
2250 #endif
2251 }
2252 }
2253
2254 tp = get_tracepoint_by_number_on_target (target_tracept);
2255
2256 reinit_frame_cache ();
2257 target_dcache_invalidate ();
2258
2259 set_tracepoint_num (tp ? tp->base.number : target_tracept);
2260
2261 if (target_frameno != get_traceframe_number ())
2262 observer_notify_traceframe_changed (target_frameno, tracepoint_number);
2263
2264 set_current_traceframe (target_frameno);
2265
2266 if (target_frameno == -1)
2267 set_traceframe_context (NULL);
2268 else
2269 set_traceframe_context (get_current_frame ());
2270
2271 if (traceframe_number >= 0)
2272 {
2273 /* Use different branches for MI and CLI to make CLI messages
2274 i18n-eable. */
2275 if (uiout->is_mi_like_p ())
2276 {
2277 uiout->field_string ("found", "1");
2278 uiout->field_int ("tracepoint", tracepoint_number);
2279 uiout->field_int ("traceframe", traceframe_number);
2280 }
2281 else
2282 {
2283 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2284 traceframe_number, tracepoint_number);
2285 }
2286 }
2287 else
2288 {
2289 if (uiout->is_mi_like_p ())
2290 uiout->field_string ("found", "0");
2291 else if (type == tfind_number && num == -1)
2292 printf_unfiltered (_("No longer looking at any trace frame\n"));
2293 else /* This case may never occur, check. */
2294 printf_unfiltered (_("No trace frame found\n"));
2295 }
2296
2297 /* If we're in nonstop mode and getting out of looking at trace
2298 frames, there won't be any current frame to go back to and
2299 display. */
2300 if (from_tty
2301 && (has_stack_frames () || traceframe_number >= 0))
2302 {
2303 enum print_what print_what;
2304
2305 /* NOTE: in imitation of the step command, try to determine
2306 whether we have made a transition from one function to
2307 another. If so, we'll print the "stack frame" (ie. the new
2308 function and it's arguments) -- otherwise we'll just show the
2309 new source line. */
2310
2311 if (frame_id_eq (old_frame_id,
2312 get_frame_id (get_current_frame ())))
2313 print_what = SRC_LINE;
2314 else
2315 print_what = SRC_AND_LOC;
2316
2317 print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
2318 do_displays ();
2319 }
2320 }
2321
2322 /* Error on looking at traceframes while trace is running. */
2323
2324 void
2325 check_trace_running (struct trace_status *status)
2326 {
2327 if (status->running && status->filename == NULL)
2328 error (_("May not look at trace frames while trace is running."));
2329 }
2330
2331 /* trace_find_command takes a trace frame number n,
2332 sends "QTFrame:<n>" to the target,
2333 and accepts a reply that may contain several optional pieces
2334 of information: a frame number, a tracepoint number, and an
2335 indication of whether this is a trap frame or a stepping frame.
2336
2337 The minimal response is just "OK" (which indicates that the
2338 target does not give us a frame number or a tracepoint number).
2339 Instead of that, the target may send us a string containing
2340 any combination of:
2341 F<hexnum> (gives the selected frame number)
2342 T<hexnum> (gives the selected tracepoint number)
2343 */
2344
2345 /* tfind command */
2346 static void
2347 tfind_command (char *args, int from_tty)
2348 { /* This should only be called with a numeric argument. */
2349 int frameno = -1;
2350
2351 check_trace_running (current_trace_status ());
2352
2353 if (args == 0 || *args == 0)
2354 { /* TFIND with no args means find NEXT trace frame. */
2355 if (traceframe_number == -1)
2356 frameno = 0; /* "next" is first one. */
2357 else
2358 frameno = traceframe_number + 1;
2359 }
2360 else if (0 == strcmp (args, "-"))
2361 {
2362 if (traceframe_number == -1)
2363 error (_("not debugging trace buffer"));
2364 else if (from_tty && traceframe_number == 0)
2365 error (_("already at start of trace buffer"));
2366
2367 frameno = traceframe_number - 1;
2368 }
2369 /* A hack to work around eval's need for fp to have been collected. */
2370 else if (0 == strcmp (args, "-1"))
2371 frameno = -1;
2372 else
2373 frameno = parse_and_eval_long (args);
2374
2375 if (frameno < -1)
2376 error (_("invalid input (%d is less than zero)"), frameno);
2377
2378 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2379 }
2380
2381 /* tfind end */
2382 static void
2383 tfind_end_command (char *args, int from_tty)
2384 {
2385 tfind_command ("-1", from_tty);
2386 }
2387
2388 /* tfind start */
2389 static void
2390 tfind_start_command (char *args, int from_tty)
2391 {
2392 tfind_command ("0", from_tty);
2393 }
2394
2395 /* tfind pc command */
2396 static void
2397 tfind_pc_command (char *args, int from_tty)
2398 {
2399 CORE_ADDR pc;
2400
2401 check_trace_running (current_trace_status ());
2402
2403 if (args == 0 || *args == 0)
2404 pc = regcache_read_pc (get_current_regcache ());
2405 else
2406 pc = parse_and_eval_address (args);
2407
2408 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2409 }
2410
2411 /* tfind tracepoint command */
2412 static void
2413 tfind_tracepoint_command (char *args, int from_tty)
2414 {
2415 int tdp;
2416 struct tracepoint *tp;
2417
2418 check_trace_running (current_trace_status ());
2419
2420 if (args == 0 || *args == 0)
2421 {
2422 if (tracepoint_number == -1)
2423 error (_("No current tracepoint -- please supply an argument."));
2424 else
2425 tdp = tracepoint_number; /* Default is current TDP. */
2426 }
2427 else
2428 tdp = parse_and_eval_long (args);
2429
2430 /* If we have the tracepoint on hand, use the number that the
2431 target knows about (which may be different if we disconnected
2432 and reconnected). */
2433 tp = get_tracepoint (tdp);
2434 if (tp)
2435 tdp = tp->number_on_target;
2436
2437 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2438 }
2439
2440 /* TFIND LINE command:
2441
2442 This command will take a sourceline for argument, just like BREAK
2443 or TRACE (ie. anything that "decode_line_1" can handle).
2444
2445 With no argument, this command will find the next trace frame
2446 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2447
2448 static void
2449 tfind_line_command (char *args, int from_tty)
2450 {
2451 static CORE_ADDR start_pc, end_pc;
2452 struct symtabs_and_lines sals;
2453 struct symtab_and_line sal;
2454 struct cleanup *old_chain;
2455
2456 check_trace_running (current_trace_status ());
2457
2458 if (args == 0 || *args == 0)
2459 {
2460 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2461 sals.nelts = 1;
2462 sals.sals = XNEW (struct symtab_and_line);
2463 sals.sals[0] = sal;
2464 }
2465 else
2466 {
2467 sals = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2468 sal = sals.sals[0];
2469 }
2470
2471 old_chain = make_cleanup (xfree, sals.sals);
2472 if (sal.symtab == 0)
2473 error (_("No line number information available."));
2474
2475 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2476 {
2477 if (start_pc == end_pc)
2478 {
2479 printf_filtered ("Line %d of \"%s\"",
2480 sal.line,
2481 symtab_to_filename_for_display (sal.symtab));
2482 wrap_here (" ");
2483 printf_filtered (" is at address ");
2484 print_address (get_current_arch (), start_pc, gdb_stdout);
2485 wrap_here (" ");
2486 printf_filtered (" but contains no code.\n");
2487 sal = find_pc_line (start_pc, 0);
2488 if (sal.line > 0
2489 && find_line_pc_range (sal, &start_pc, &end_pc)
2490 && start_pc != end_pc)
2491 printf_filtered ("Attempting to find line %d instead.\n",
2492 sal.line);
2493 else
2494 error (_("Cannot find a good line."));
2495 }
2496 }
2497 else
2498 /* Is there any case in which we get here, and have an address
2499 which the user would want to see? If we have debugging
2500 symbols and no line numbers? */
2501 error (_("Line number %d is out of range for \"%s\"."),
2502 sal.line, symtab_to_filename_for_display (sal.symtab));
2503
2504 /* Find within range of stated line. */
2505 if (args && *args)
2506 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2507 else
2508 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2509 do_cleanups (old_chain);
2510 }
2511
2512 /* tfind range command */
2513 static void
2514 tfind_range_command (char *args, int from_tty)
2515 {
2516 static CORE_ADDR start, stop;
2517 char *tmp;
2518
2519 check_trace_running (current_trace_status ());
2520
2521 if (args == 0 || *args == 0)
2522 { /* XXX FIXME: what should default behavior be? */
2523 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2524 return;
2525 }
2526
2527 if (0 != (tmp = strchr (args, ',')))
2528 {
2529 *tmp++ = '\0'; /* Terminate start address. */
2530 tmp = skip_spaces (tmp);
2531 start = parse_and_eval_address (args);
2532 stop = parse_and_eval_address (tmp);
2533 }
2534 else
2535 { /* No explicit end address? */
2536 start = parse_and_eval_address (args);
2537 stop = start + 1; /* ??? */
2538 }
2539
2540 tfind_1 (tfind_range, 0, start, stop, from_tty);
2541 }
2542
2543 /* tfind outside command */
2544 static void
2545 tfind_outside_command (char *args, int from_tty)
2546 {
2547 CORE_ADDR start, stop;
2548 char *tmp;
2549
2550 if (current_trace_status ()->running
2551 && current_trace_status ()->filename == NULL)
2552 error (_("May not look at trace frames while trace is running."));
2553
2554 if (args == 0 || *args == 0)
2555 { /* XXX FIXME: what should default behavior be? */
2556 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2557 return;
2558 }
2559
2560 if (0 != (tmp = strchr (args, ',')))
2561 {
2562 *tmp++ = '\0'; /* Terminate start address. */
2563 tmp = skip_spaces (tmp);
2564 start = parse_and_eval_address (args);
2565 stop = parse_and_eval_address (tmp);
2566 }
2567 else
2568 { /* No explicit end address? */
2569 start = parse_and_eval_address (args);
2570 stop = start + 1; /* ??? */
2571 }
2572
2573 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2574 }
2575
2576 /* info scope command: list the locals for a scope. */
2577 static void
2578 scope_info (char *args, int from_tty)
2579 {
2580 struct symtabs_and_lines sals;
2581 struct symbol *sym;
2582 struct bound_minimal_symbol msym;
2583 const struct block *block;
2584 const char *symname;
2585 char *save_args = args;
2586 struct block_iterator iter;
2587 int j, count = 0;
2588 struct gdbarch *gdbarch;
2589 int regno;
2590 struct event_location *location;
2591 struct cleanup *back_to;
2592
2593 if (args == 0 || *args == 0)
2594 error (_("requires an argument (function, "
2595 "line or *addr) to define a scope"));
2596
2597 location = string_to_event_location (&args, current_language);
2598 back_to = make_cleanup_delete_event_location (location);
2599 sals = decode_line_1 (location, DECODE_LINE_FUNFIRSTLINE, NULL, NULL, 0);
2600 if (sals.nelts == 0)
2601 {
2602 /* Presumably decode_line_1 has already warned. */
2603 do_cleanups (back_to);
2604 return;
2605 }
2606
2607 /* Resolve line numbers to PC. */
2608 resolve_sal_pc (&sals.sals[0]);
2609 block = block_for_pc (sals.sals[0].pc);
2610
2611 while (block != 0)
2612 {
2613 QUIT; /* Allow user to bail out with ^C. */
2614 ALL_BLOCK_SYMBOLS (block, iter, sym)
2615 {
2616 QUIT; /* Allow user to bail out with ^C. */
2617 if (count == 0)
2618 printf_filtered ("Scope for %s:\n", save_args);
2619 count++;
2620
2621 symname = SYMBOL_PRINT_NAME (sym);
2622 if (symname == NULL || *symname == '\0')
2623 continue; /* Probably botched, certainly useless. */
2624
2625 gdbarch = symbol_arch (sym);
2626
2627 printf_filtered ("Symbol %s is ", symname);
2628
2629 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2630 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2631 BLOCK_START (block),
2632 gdb_stdout);
2633 else
2634 {
2635 switch (SYMBOL_CLASS (sym))
2636 {
2637 default:
2638 case LOC_UNDEF: /* Messed up symbol? */
2639 printf_filtered ("a bogus symbol, class %d.\n",
2640 SYMBOL_CLASS (sym));
2641 count--; /* Don't count this one. */
2642 continue;
2643 case LOC_CONST:
2644 printf_filtered ("a constant with value %s (%s)",
2645 plongest (SYMBOL_VALUE (sym)),
2646 hex_string (SYMBOL_VALUE (sym)));
2647 break;
2648 case LOC_CONST_BYTES:
2649 printf_filtered ("constant bytes: ");
2650 if (SYMBOL_TYPE (sym))
2651 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2652 fprintf_filtered (gdb_stdout, " %02x",
2653 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2654 break;
2655 case LOC_STATIC:
2656 printf_filtered ("in static storage at address ");
2657 printf_filtered ("%s", paddress (gdbarch,
2658 SYMBOL_VALUE_ADDRESS (sym)));
2659 break;
2660 case LOC_REGISTER:
2661 /* GDBARCH is the architecture associated with the objfile
2662 the symbol is defined in; the target architecture may be
2663 different, and may provide additional registers. However,
2664 we do not know the target architecture at this point.
2665 We assume the objfile architecture will contain all the
2666 standard registers that occur in debug info in that
2667 objfile. */
2668 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2669 gdbarch);
2670
2671 if (SYMBOL_IS_ARGUMENT (sym))
2672 printf_filtered ("an argument in register $%s",
2673 gdbarch_register_name (gdbarch, regno));
2674 else
2675 printf_filtered ("a local variable in register $%s",
2676 gdbarch_register_name (gdbarch, regno));
2677 break;
2678 case LOC_ARG:
2679 printf_filtered ("an argument at stack/frame offset %s",
2680 plongest (SYMBOL_VALUE (sym)));
2681 break;
2682 case LOC_LOCAL:
2683 printf_filtered ("a local variable at frame offset %s",
2684 plongest (SYMBOL_VALUE (sym)));
2685 break;
2686 case LOC_REF_ARG:
2687 printf_filtered ("a reference argument at offset %s",
2688 plongest (SYMBOL_VALUE (sym)));
2689 break;
2690 case LOC_REGPARM_ADDR:
2691 /* Note comment at LOC_REGISTER. */
2692 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2693 gdbarch);
2694 printf_filtered ("the address of an argument, in register $%s",
2695 gdbarch_register_name (gdbarch, regno));
2696 break;
2697 case LOC_TYPEDEF:
2698 printf_filtered ("a typedef.\n");
2699 continue;
2700 case LOC_LABEL:
2701 printf_filtered ("a label at address ");
2702 printf_filtered ("%s", paddress (gdbarch,
2703 SYMBOL_VALUE_ADDRESS (sym)));
2704 break;
2705 case LOC_BLOCK:
2706 printf_filtered ("a function at address ");
2707 printf_filtered ("%s",
2708 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2709 break;
2710 case LOC_UNRESOLVED:
2711 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2712 NULL, NULL);
2713 if (msym.minsym == NULL)
2714 printf_filtered ("Unresolved Static");
2715 else
2716 {
2717 printf_filtered ("static storage at address ");
2718 printf_filtered ("%s",
2719 paddress (gdbarch,
2720 BMSYMBOL_VALUE_ADDRESS (msym)));
2721 }
2722 break;
2723 case LOC_OPTIMIZED_OUT:
2724 printf_filtered ("optimized out.\n");
2725 continue;
2726 case LOC_COMPUTED:
2727 gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2728 }
2729 }
2730 if (SYMBOL_TYPE (sym))
2731 printf_filtered (", length %d.\n",
2732 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2733 }
2734 if (BLOCK_FUNCTION (block))
2735 break;
2736 else
2737 block = BLOCK_SUPERBLOCK (block);
2738 }
2739 if (count <= 0)
2740 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2741 save_args);
2742 do_cleanups (back_to);
2743 }
2744
2745 /* Helper for trace_dump_command. Dump the action list starting at
2746 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2747 actions of the body of a while-stepping action. STEPPING_FRAME is
2748 set if the current traceframe was determined to be a while-stepping
2749 traceframe. */
2750
2751 static void
2752 trace_dump_actions (struct command_line *action,
2753 int stepping_actions, int stepping_frame,
2754 int from_tty)
2755 {
2756 const char *action_exp, *next_comma;
2757
2758 for (; action != NULL; action = action->next)
2759 {
2760 struct cmd_list_element *cmd;
2761
2762 QUIT; /* Allow user to bail out with ^C. */
2763 action_exp = action->line;
2764 action_exp = skip_spaces_const (action_exp);
2765
2766 /* The collection actions to be done while stepping are
2767 bracketed by the commands "while-stepping" and "end". */
2768
2769 if (*action_exp == '#') /* comment line */
2770 continue;
2771
2772 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2773 if (cmd == 0)
2774 error (_("Bad action list item: %s"), action_exp);
2775
2776 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2777 {
2778 int i;
2779
2780 for (i = 0; i < action->body_count; ++i)
2781 trace_dump_actions (action->body_list[i],
2782 1, stepping_frame, from_tty);
2783 }
2784 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2785 {
2786 /* Display the collected data.
2787 For the trap frame, display only what was collected at
2788 the trap. Likewise for stepping frames, display only
2789 what was collected while stepping. This means that the
2790 two boolean variables, STEPPING_FRAME and
2791 STEPPING_ACTIONS should be equal. */
2792 if (stepping_frame == stepping_actions)
2793 {
2794 char *cmd = NULL;
2795 struct cleanup *old_chain
2796 = make_cleanup (free_current_contents, &cmd);
2797 int trace_string = 0;
2798
2799 if (*action_exp == '/')
2800 action_exp = decode_agent_options (action_exp, &trace_string);
2801
2802 do
2803 { /* Repeat over a comma-separated list. */
2804 QUIT; /* Allow user to bail out with ^C. */
2805 if (*action_exp == ',')
2806 action_exp++;
2807 action_exp = skip_spaces_const (action_exp);
2808
2809 next_comma = strchr (action_exp, ',');
2810
2811 if (0 == strncasecmp (action_exp, "$reg", 4))
2812 registers_info (NULL, from_tty);
2813 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2814 ;
2815 else if (0 == strncasecmp (action_exp, "$loc", 4))
2816 locals_info (NULL, from_tty);
2817 else if (0 == strncasecmp (action_exp, "$arg", 4))
2818 args_info (NULL, from_tty);
2819 else
2820 { /* variable */
2821 if (next_comma != NULL)
2822 {
2823 size_t len = next_comma - action_exp;
2824
2825 cmd = (char *) xrealloc (cmd, len + 1);
2826 memcpy (cmd, action_exp, len);
2827 cmd[len] = 0;
2828 }
2829 else
2830 {
2831 size_t len = strlen (action_exp);
2832
2833 cmd = (char *) xrealloc (cmd, len + 1);
2834 memcpy (cmd, action_exp, len + 1);
2835 }
2836
2837 printf_filtered ("%s = ", cmd);
2838 output_command_const (cmd, from_tty);
2839 printf_filtered ("\n");
2840 }
2841 action_exp = next_comma;
2842 }
2843 while (action_exp && *action_exp == ',');
2844
2845 do_cleanups (old_chain);
2846 }
2847 }
2848 }
2849 }
2850
2851 /* Return bp_location of the tracepoint associated with the current
2852 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe
2853 is a stepping traceframe. */
2854
2855 struct bp_location *
2856 get_traceframe_location (int *stepping_frame_p)
2857 {
2858 struct tracepoint *t;
2859 struct bp_location *tloc;
2860 struct regcache *regcache;
2861
2862 if (tracepoint_number == -1)
2863 error (_("No current trace frame."));
2864
2865 t = get_tracepoint (tracepoint_number);
2866
2867 if (t == NULL)
2868 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2869 tracepoint_number);
2870
2871 /* The current frame is a trap frame if the frame PC is equal to the
2872 tracepoint PC. If not, then the current frame was collected
2873 during single-stepping. */
2874 regcache = get_current_regcache ();
2875
2876 /* If the traceframe's address matches any of the tracepoint's
2877 locations, assume it is a direct hit rather than a while-stepping
2878 frame. (FIXME this is not reliable, should record each frame's
2879 type.) */
2880 for (tloc = t->base.loc; tloc; tloc = tloc->next)
2881 if (tloc->address == regcache_read_pc (regcache))
2882 {
2883 *stepping_frame_p = 0;
2884 return tloc;
2885 }
2886
2887 /* If this is a stepping frame, we don't know which location
2888 triggered. The first is as good (or bad) a guess as any... */
2889 *stepping_frame_p = 1;
2890 return t->base.loc;
2891 }
2892
2893 /* Return all the actions, including default collect, of a tracepoint
2894 T. It constructs cleanups into the chain, and leaves the caller to
2895 handle them (call do_cleanups). */
2896
2897 static struct command_line *
2898 all_tracepoint_actions_and_cleanup (struct breakpoint *t)
2899 {
2900 struct command_line *actions;
2901
2902 actions = breakpoint_commands (t);
2903
2904 /* If there are default expressions to collect, make up a collect
2905 action and prepend to the action list to encode. Note that since
2906 validation is per-tracepoint (local var "xyz" might be valid for
2907 one tracepoint and not another, etc), we make up the action on
2908 the fly, and don't cache it. */
2909 if (*default_collect)
2910 {
2911 struct command_line *default_collect_action;
2912 char *default_collect_line;
2913
2914 default_collect_line = xstrprintf ("collect %s", default_collect);
2915 make_cleanup (xfree, default_collect_line);
2916
2917 validate_actionline (default_collect_line, t);
2918 default_collect_action = XNEW (struct command_line);
2919 make_cleanup (xfree, default_collect_action);
2920 default_collect_action->next = actions;
2921 default_collect_action->line = default_collect_line;
2922 actions = default_collect_action;
2923 }
2924
2925 return actions;
2926 }
2927
2928 /* The tdump command. */
2929
2930 static void
2931 tdump_command (char *args, int from_tty)
2932 {
2933 int stepping_frame = 0;
2934 struct bp_location *loc;
2935 struct cleanup *old_chain;
2936 struct command_line *actions;
2937
2938 /* This throws an error is not inspecting a trace frame. */
2939 loc = get_traceframe_location (&stepping_frame);
2940
2941 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2942 tracepoint_number, traceframe_number);
2943
2944 /* This command only makes sense for the current frame, not the
2945 selected frame. */
2946 old_chain = make_cleanup_restore_current_thread ();
2947 select_frame (get_current_frame ());
2948
2949 actions = all_tracepoint_actions_and_cleanup (loc->owner);
2950
2951 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2952
2953 do_cleanups (old_chain);
2954 }
2955
2956 /* Encode a piece of a tracepoint's source-level definition in a form
2957 that is suitable for both protocol and saving in files. */
2958 /* This version does not do multiple encodes for long strings; it should
2959 return an offset to the next piece to encode. FIXME */
2960
2961 extern int
2962 encode_source_string (int tpnum, ULONGEST addr,
2963 char *srctype, const char *src, char *buf, int buf_size)
2964 {
2965 if (80 + strlen (srctype) > buf_size)
2966 error (_("Buffer too small for source encoding"));
2967 sprintf (buf, "%x:%s:%s:%x:%x:",
2968 tpnum, phex_nz (addr, sizeof (addr)),
2969 srctype, 0, (int) strlen (src));
2970 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2971 error (_("Source string too long for buffer"));
2972 bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src));
2973 return -1;
2974 }
2975
2976 /* Tell the target what to do with an ongoing tracing run if GDB
2977 disconnects for some reason. */
2978
2979 static void
2980 set_disconnected_tracing (char *args, int from_tty,
2981 struct cmd_list_element *c)
2982 {
2983 target_set_disconnected_tracing (disconnected_tracing);
2984 }
2985
2986 static void
2987 set_circular_trace_buffer (char *args, int from_tty,
2988 struct cmd_list_element *c)
2989 {
2990 target_set_circular_trace_buffer (circular_trace_buffer);
2991 }
2992
2993 static void
2994 set_trace_buffer_size (char *args, int from_tty,
2995 struct cmd_list_element *c)
2996 {
2997 target_set_trace_buffer_size (trace_buffer_size);
2998 }
2999
3000 static void
3001 set_trace_user (char *args, int from_tty,
3002 struct cmd_list_element *c)
3003 {
3004 int ret;
3005
3006 ret = target_set_trace_notes (trace_user, NULL, NULL);
3007
3008 if (!ret)
3009 warning (_("Target does not support trace notes, user ignored"));
3010 }
3011
3012 static void
3013 set_trace_notes (char *args, int from_tty,
3014 struct cmd_list_element *c)
3015 {
3016 int ret;
3017
3018 ret = target_set_trace_notes (NULL, trace_notes, NULL);
3019
3020 if (!ret)
3021 warning (_("Target does not support trace notes, note ignored"));
3022 }
3023
3024 static void
3025 set_trace_stop_notes (char *args, int from_tty,
3026 struct cmd_list_element *c)
3027 {
3028 int ret;
3029
3030 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
3031
3032 if (!ret)
3033 warning (_("Target does not support trace notes, stop note ignored"));
3034 }
3035
3036 /* Convert the memory pointed to by mem into hex, placing result in buf.
3037 * Return a pointer to the last char put in buf (null)
3038 * "stolen" from sparc-stub.c
3039 */
3040
3041 static const char hexchars[] = "0123456789abcdef";
3042
3043 static char *
3044 mem2hex (gdb_byte *mem, char *buf, int count)
3045 {
3046 gdb_byte ch;
3047
3048 while (count-- > 0)
3049 {
3050 ch = *mem++;
3051
3052 *buf++ = hexchars[ch >> 4];
3053 *buf++ = hexchars[ch & 0xf];
3054 }
3055
3056 *buf = 0;
3057
3058 return buf;
3059 }
3060
3061 int
3062 get_traceframe_number (void)
3063 {
3064 return traceframe_number;
3065 }
3066
3067 int
3068 get_tracepoint_number (void)
3069 {
3070 return tracepoint_number;
3071 }
3072
3073 /* Make the traceframe NUM be the current trace frame. Does nothing
3074 if NUM is already current. */
3075
3076 void
3077 set_current_traceframe (int num)
3078 {
3079 int newnum;
3080
3081 if (traceframe_number == num)
3082 {
3083 /* Nothing to do. */
3084 return;
3085 }
3086
3087 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3088
3089 if (newnum != num)
3090 warning (_("could not change traceframe"));
3091
3092 set_traceframe_num (newnum);
3093
3094 /* Changing the traceframe changes our view of registers and of the
3095 frame chain. */
3096 registers_changed ();
3097
3098 clear_traceframe_info ();
3099 }
3100
3101 /* A cleanup used when switching away and back from tfind mode. */
3102
3103 struct current_traceframe_cleanup
3104 {
3105 /* The traceframe we were inspecting. */
3106 int traceframe_number;
3107 };
3108
3109 static void
3110 do_restore_current_traceframe_cleanup (void *arg)
3111 {
3112 struct current_traceframe_cleanup *old
3113 = (struct current_traceframe_cleanup *) arg;
3114
3115 set_current_traceframe (old->traceframe_number);
3116 }
3117
3118 static void
3119 restore_current_traceframe_cleanup_dtor (void *arg)
3120 {
3121 struct current_traceframe_cleanup *old
3122 = (struct current_traceframe_cleanup *) arg;
3123
3124 xfree (old);
3125 }
3126
3127 struct cleanup *
3128 make_cleanup_restore_current_traceframe (void)
3129 {
3130 struct current_traceframe_cleanup *old =
3131 XNEW (struct current_traceframe_cleanup);
3132
3133 old->traceframe_number = traceframe_number;
3134
3135 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3136 restore_current_traceframe_cleanup_dtor);
3137 }
3138
3139 /* Given a number and address, return an uploaded tracepoint with that
3140 number, creating if necessary. */
3141
3142 struct uploaded_tp *
3143 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3144 {
3145 struct uploaded_tp *utp;
3146
3147 for (utp = *utpp; utp; utp = utp->next)
3148 if (utp->number == num && utp->addr == addr)
3149 return utp;
3150
3151 utp = XCNEW (struct uploaded_tp);
3152 utp->number = num;
3153 utp->addr = addr;
3154 utp->actions = NULL;
3155 utp->step_actions = NULL;
3156 utp->cmd_strings = NULL;
3157 utp->next = *utpp;
3158 *utpp = utp;
3159
3160 return utp;
3161 }
3162
3163 void
3164 free_uploaded_tps (struct uploaded_tp **utpp)
3165 {
3166 struct uploaded_tp *next_one;
3167
3168 while (*utpp)
3169 {
3170 next_one = (*utpp)->next;
3171 xfree (*utpp);
3172 *utpp = next_one;
3173 }
3174 }
3175
3176 /* Given a number and address, return an uploaded tracepoint with that
3177 number, creating if necessary. */
3178
3179 struct uploaded_tsv *
3180 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3181 {
3182 struct uploaded_tsv *utsv;
3183
3184 for (utsv = *utsvp; utsv; utsv = utsv->next)
3185 if (utsv->number == num)
3186 return utsv;
3187
3188 utsv = XCNEW (struct uploaded_tsv);
3189 utsv->number = num;
3190 utsv->next = *utsvp;
3191 *utsvp = utsv;
3192
3193 return utsv;
3194 }
3195
3196 void
3197 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3198 {
3199 struct uploaded_tsv *next_one;
3200
3201 while (*utsvp)
3202 {
3203 next_one = (*utsvp)->next;
3204 xfree (*utsvp);
3205 *utsvp = next_one;
3206 }
3207 }
3208
3209 /* FIXME this function is heuristic and will miss the cases where the
3210 conditional is semantically identical but differs in whitespace,
3211 such as "x == 0" vs "x==0". */
3212
3213 static int
3214 cond_string_is_same (char *str1, char *str2)
3215 {
3216 if (str1 == NULL || str2 == NULL)
3217 return (str1 == str2);
3218
3219 return (strcmp (str1, str2) == 0);
3220 }
3221
3222 /* Look for an existing tracepoint that seems similar enough to the
3223 uploaded one. Enablement isn't compared, because the user can
3224 toggle that freely, and may have done so in anticipation of the
3225 next trace run. Return the location of matched tracepoint. */
3226
3227 static struct bp_location *
3228 find_matching_tracepoint_location (struct uploaded_tp *utp)
3229 {
3230 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3231 int ix;
3232 struct breakpoint *b;
3233 struct bp_location *loc;
3234
3235 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
3236 {
3237 struct tracepoint *t = (struct tracepoint *) b;
3238
3239 if (b->type == utp->type
3240 && t->step_count == utp->step
3241 && t->pass_count == utp->pass
3242 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3243 /* FIXME also test actions. */
3244 )
3245 {
3246 /* Scan the locations for an address match. */
3247 for (loc = b->loc; loc; loc = loc->next)
3248 {
3249 if (loc->address == utp->addr)
3250 return loc;
3251 }
3252 }
3253 }
3254 return NULL;
3255 }
3256
3257 /* Given a list of tracepoints uploaded from a target, attempt to
3258 match them up with existing tracepoints, and create new ones if not
3259 found. */
3260
3261 void
3262 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3263 {
3264 struct uploaded_tp *utp;
3265 /* A set of tracepoints which are modified. */
3266 VEC(breakpoint_p) *modified_tp = NULL;
3267 int ix;
3268 struct breakpoint *b;
3269
3270 /* Look for GDB tracepoints that match up with our uploaded versions. */
3271 for (utp = *uploaded_tps; utp; utp = utp->next)
3272 {
3273 struct bp_location *loc;
3274 struct tracepoint *t;
3275
3276 loc = find_matching_tracepoint_location (utp);
3277 if (loc)
3278 {
3279 int found = 0;
3280
3281 /* Mark this location as already inserted. */
3282 loc->inserted = 1;
3283 t = (struct tracepoint *) loc->owner;
3284 printf_filtered (_("Assuming tracepoint %d is same "
3285 "as target's tracepoint %d at %s.\n"),
3286 loc->owner->number, utp->number,
3287 paddress (loc->gdbarch, utp->addr));
3288
3289 /* The tracepoint LOC->owner was modified (the location LOC
3290 was marked as inserted in the target). Save it in
3291 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3292 observers will be notified later once for each tracepoint
3293 saved in MODIFIED_TP. */
3294 for (ix = 0;
3295 VEC_iterate (breakpoint_p, modified_tp, ix, b);
3296 ix++)
3297 if (b == loc->owner)
3298 {
3299 found = 1;
3300 break;
3301 }
3302 if (!found)
3303 VEC_safe_push (breakpoint_p, modified_tp, loc->owner);
3304 }
3305 else
3306 {
3307 t = create_tracepoint_from_upload (utp);
3308 if (t)
3309 printf_filtered (_("Created tracepoint %d for "
3310 "target's tracepoint %d at %s.\n"),
3311 t->base.number, utp->number,
3312 paddress (get_current_arch (), utp->addr));
3313 else
3314 printf_filtered (_("Failed to create tracepoint for target's "
3315 "tracepoint %d at %s, skipping it.\n"),
3316 utp->number,
3317 paddress (get_current_arch (), utp->addr));
3318 }
3319 /* Whether found or created, record the number used by the
3320 target, to help with mapping target tracepoints back to their
3321 counterparts here. */
3322 if (t)
3323 t->number_on_target = utp->number;
3324 }
3325
3326 /* Notify 'breakpoint-modified' observer that at least one of B's
3327 locations was changed. */
3328 for (ix = 0; VEC_iterate (breakpoint_p, modified_tp, ix, b); ix++)
3329 observer_notify_breakpoint_modified (b);
3330
3331 VEC_free (breakpoint_p, modified_tp);
3332 free_uploaded_tps (uploaded_tps);
3333 }
3334
3335 /* Trace state variables don't have much to identify them beyond their
3336 name, so just use that to detect matches. */
3337
3338 static struct trace_state_variable *
3339 find_matching_tsv (struct uploaded_tsv *utsv)
3340 {
3341 if (!utsv->name)
3342 return NULL;
3343
3344 return find_trace_state_variable (utsv->name);
3345 }
3346
3347 static struct trace_state_variable *
3348 create_tsv_from_upload (struct uploaded_tsv *utsv)
3349 {
3350 const char *namebase;
3351 char *buf;
3352 int try_num = 0;
3353 struct trace_state_variable *tsv;
3354 struct cleanup *old_chain;
3355
3356 if (utsv->name)
3357 {
3358 namebase = utsv->name;
3359 buf = xstrprintf ("%s", namebase);
3360 }
3361 else
3362 {
3363 namebase = "__tsv";
3364 buf = xstrprintf ("%s_%d", namebase, try_num++);
3365 }
3366
3367 /* Fish for a name that is not in use. */
3368 /* (should check against all internal vars?) */
3369 while (find_trace_state_variable (buf))
3370 {
3371 xfree (buf);
3372 buf = xstrprintf ("%s_%d", namebase, try_num++);
3373 }
3374
3375 old_chain = make_cleanup (xfree, buf);
3376
3377 /* We have an available name, create the variable. */
3378 tsv = create_trace_state_variable (buf);
3379 tsv->initial_value = utsv->initial_value;
3380 tsv->builtin = utsv->builtin;
3381
3382 observer_notify_tsv_created (tsv);
3383
3384 do_cleanups (old_chain);
3385
3386 return tsv;
3387 }
3388
3389 /* Given a list of uploaded trace state variables, try to match them
3390 up with existing variables, or create additional ones. */
3391
3392 void
3393 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3394 {
3395 int ix;
3396 struct uploaded_tsv *utsv;
3397 struct trace_state_variable *tsv;
3398 int highest;
3399
3400 /* Most likely some numbers will have to be reassigned as part of
3401 the merge, so clear them all in anticipation. */
3402 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3403 tsv->number = 0;
3404
3405 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3406 {
3407 tsv = find_matching_tsv (utsv);
3408 if (tsv)
3409 {
3410 if (info_verbose)
3411 printf_filtered (_("Assuming trace state variable $%s "
3412 "is same as target's variable %d.\n"),
3413 tsv->name, utsv->number);
3414 }
3415 else
3416 {
3417 tsv = create_tsv_from_upload (utsv);
3418 if (info_verbose)
3419 printf_filtered (_("Created trace state variable "
3420 "$%s for target's variable %d.\n"),
3421 tsv->name, utsv->number);
3422 }
3423 /* Give precedence to numberings that come from the target. */
3424 if (tsv)
3425 tsv->number = utsv->number;
3426 }
3427
3428 /* Renumber everything that didn't get a target-assigned number. */
3429 highest = 0;
3430 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3431 if (tsv->number > highest)
3432 highest = tsv->number;
3433
3434 ++highest;
3435 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3436 if (tsv->number == 0)
3437 tsv->number = highest++;
3438
3439 free_uploaded_tsvs (uploaded_tsvs);
3440 }
3441
3442 /* Parse the part of trace status syntax that is shared between
3443 the remote protocol and the trace file reader. */
3444
3445 void
3446 parse_trace_status (char *line, struct trace_status *ts)
3447 {
3448 char *p = line, *p1, *p2, *p3, *p_temp;
3449 int end;
3450 ULONGEST val;
3451
3452 ts->running_known = 1;
3453 ts->running = (*p++ == '1');
3454 ts->stop_reason = trace_stop_reason_unknown;
3455 xfree (ts->stop_desc);
3456 ts->stop_desc = NULL;
3457 ts->traceframe_count = -1;
3458 ts->traceframes_created = -1;
3459 ts->buffer_free = -1;
3460 ts->buffer_size = -1;
3461 ts->disconnected_tracing = 0;
3462 ts->circular_buffer = 0;
3463 xfree (ts->user_name);
3464 ts->user_name = NULL;
3465 xfree (ts->notes);
3466 ts->notes = NULL;
3467 ts->start_time = ts->stop_time = 0;
3468
3469 while (*p++)
3470 {
3471 p1 = strchr (p, ':');
3472 if (p1 == NULL)
3473 error (_("Malformed trace status, at %s\n\
3474 Status line: '%s'\n"), p, line);
3475 p3 = strchr (p, ';');
3476 if (p3 == NULL)
3477 p3 = p + strlen (p);
3478 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3479 {
3480 p = unpack_varlen_hex (++p1, &val);
3481 ts->stop_reason = trace_buffer_full;
3482 }
3483 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3484 {
3485 p = unpack_varlen_hex (++p1, &val);
3486 ts->stop_reason = trace_never_run;
3487 }
3488 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3489 p1 - p) == 0)
3490 {
3491 p = unpack_varlen_hex (++p1, &val);
3492 ts->stop_reason = tracepoint_passcount;
3493 ts->stopping_tracepoint = val;
3494 }
3495 else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0)
3496 {
3497 p2 = strchr (++p1, ':');
3498 if (!p2 || p2 > p3)
3499 {
3500 /*older style*/
3501 p2 = p1;
3502 }
3503 else if (p2 != p1)
3504 {
3505 ts->stop_desc = (char *) xmalloc (strlen (line));
3506 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3507 ts->stop_desc[end] = '\0';
3508 }
3509 else
3510 ts->stop_desc = xstrdup ("");
3511
3512 p = unpack_varlen_hex (++p2, &val);
3513 ts->stop_reason = trace_stop_command;
3514 }
3515 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3516 {
3517 p = unpack_varlen_hex (++p1, &val);
3518 ts->stop_reason = trace_disconnected;
3519 }
3520 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3521 {
3522 p2 = strchr (++p1, ':');
3523 if (p2 != p1)
3524 {
3525 ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
3526 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3527 ts->stop_desc[end] = '\0';
3528 }
3529 else
3530 ts->stop_desc = xstrdup ("");
3531
3532 p = unpack_varlen_hex (++p2, &val);
3533 ts->stopping_tracepoint = val;
3534 ts->stop_reason = tracepoint_error;
3535 }
3536 else if (strncmp (p, "tframes", p1 - p) == 0)
3537 {
3538 p = unpack_varlen_hex (++p1, &val);
3539 ts->traceframe_count = val;
3540 }
3541 else if (strncmp (p, "tcreated", p1 - p) == 0)
3542 {
3543 p = unpack_varlen_hex (++p1, &val);
3544 ts->traceframes_created = val;
3545 }
3546 else if (strncmp (p, "tfree", p1 - p) == 0)
3547 {
3548 p = unpack_varlen_hex (++p1, &val);
3549 ts->buffer_free = val;
3550 }
3551 else if (strncmp (p, "tsize", p1 - p) == 0)
3552 {
3553 p = unpack_varlen_hex (++p1, &val);
3554 ts->buffer_size = val;
3555 }
3556 else if (strncmp (p, "disconn", p1 - p) == 0)
3557 {
3558 p = unpack_varlen_hex (++p1, &val);
3559 ts->disconnected_tracing = val;
3560 }
3561 else if (strncmp (p, "circular", p1 - p) == 0)
3562 {
3563 p = unpack_varlen_hex (++p1, &val);
3564 ts->circular_buffer = val;
3565 }
3566 else if (strncmp (p, "starttime", p1 - p) == 0)
3567 {
3568 p = unpack_varlen_hex (++p1, &val);
3569 ts->start_time = val;
3570 }
3571 else if (strncmp (p, "stoptime", p1 - p) == 0)
3572 {
3573 p = unpack_varlen_hex (++p1, &val);
3574 ts->stop_time = val;
3575 }
3576 else if (strncmp (p, "username", p1 - p) == 0)
3577 {
3578 ++p1;
3579 ts->user_name = (char *) xmalloc (strlen (p) / 2);
3580 end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2);
3581 ts->user_name[end] = '\0';
3582 p = p3;
3583 }
3584 else if (strncmp (p, "notes", p1 - p) == 0)
3585 {
3586 ++p1;
3587 ts->notes = (char *) xmalloc (strlen (p) / 2);
3588 end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
3589 ts->notes[end] = '\0';
3590 p = p3;
3591 }
3592 else
3593 {
3594 /* Silently skip unknown optional info. */
3595 p_temp = strchr (p1 + 1, ';');
3596 if (p_temp)
3597 p = p_temp;
3598 else
3599 /* Must be at the end. */
3600 break;
3601 }
3602 }
3603 }
3604
3605 void
3606 parse_tracepoint_status (char *p, struct breakpoint *bp,
3607 struct uploaded_tp *utp)
3608 {
3609 ULONGEST uval;
3610 struct tracepoint *tp = (struct tracepoint *) bp;
3611
3612 p = unpack_varlen_hex (p, &uval);
3613 if (tp)
3614 tp->base.hit_count += uval;
3615 else
3616 utp->hit_count += uval;
3617 p = unpack_varlen_hex (p + 1, &uval);
3618 if (tp)
3619 tp->traceframe_usage += uval;
3620 else
3621 utp->traceframe_usage += uval;
3622 /* Ignore any extra, allowing for future extensions. */
3623 }
3624
3625 /* Given a line of text defining a part of a tracepoint, parse it into
3626 an "uploaded tracepoint". */
3627
3628 void
3629 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3630 {
3631 char *p;
3632 char piece;
3633 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3634 int enabled, end;
3635 enum bptype type;
3636 char *cond, *srctype, *buf;
3637 struct uploaded_tp *utp = NULL;
3638
3639 p = line;
3640 /* Both tracepoint and action definitions start with the same number
3641 and address sequence. */
3642 piece = *p++;
3643 p = unpack_varlen_hex (p, &num);
3644 p++; /* skip a colon */
3645 p = unpack_varlen_hex (p, &addr);
3646 p++; /* skip a colon */
3647 if (piece == 'T')
3648 {
3649 enabled = (*p++ == 'E');
3650 p++; /* skip a colon */
3651 p = unpack_varlen_hex (p, &step);
3652 p++; /* skip a colon */
3653 p = unpack_varlen_hex (p, &pass);
3654 type = bp_tracepoint;
3655 cond = NULL;
3656 /* Thumb through optional fields. */
3657 while (*p == ':')
3658 {
3659 p++; /* skip a colon */
3660 if (*p == 'F')
3661 {
3662 type = bp_fast_tracepoint;
3663 p++;
3664 p = unpack_varlen_hex (p, &orig_size);
3665 }
3666 else if (*p == 'S')
3667 {
3668 type = bp_static_tracepoint;
3669 p++;
3670 }
3671 else if (*p == 'X')
3672 {
3673 p++;
3674 p = unpack_varlen_hex (p, &xlen);
3675 p++; /* skip a comma */
3676 cond = (char *) xmalloc (2 * xlen + 1);
3677 strncpy (cond, p, 2 * xlen);
3678 cond[2 * xlen] = '\0';
3679 p += 2 * xlen;
3680 }
3681 else
3682 warning (_("Unrecognized char '%c' in tracepoint "
3683 "definition, skipping rest"), *p);
3684 }
3685 utp = get_uploaded_tp (num, addr, utpp);
3686 utp->type = type;
3687 utp->enabled = enabled;
3688 utp->step = step;
3689 utp->pass = pass;
3690 utp->cond = cond;
3691 }
3692 else if (piece == 'A')
3693 {
3694 utp = get_uploaded_tp (num, addr, utpp);
3695 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
3696 }
3697 else if (piece == 'S')
3698 {
3699 utp = get_uploaded_tp (num, addr, utpp);
3700 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
3701 }
3702 else if (piece == 'Z')
3703 {
3704 /* Parse a chunk of source form definition. */
3705 utp = get_uploaded_tp (num, addr, utpp);
3706 srctype = p;
3707 p = strchr (p, ':');
3708 p++; /* skip a colon */
3709 p = unpack_varlen_hex (p, &start);
3710 p++; /* skip a colon */
3711 p = unpack_varlen_hex (p, &xlen);
3712 p++; /* skip a colon */
3713
3714 buf = (char *) alloca (strlen (line));
3715
3716 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3717 buf[end] = '\0';
3718
3719 if (startswith (srctype, "at:"))
3720 utp->at_string = xstrdup (buf);
3721 else if (startswith (srctype, "cond:"))
3722 utp->cond_string = xstrdup (buf);
3723 else if (startswith (srctype, "cmd:"))
3724 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
3725 }
3726 else if (piece == 'V')
3727 {
3728 utp = get_uploaded_tp (num, addr, utpp);
3729
3730 parse_tracepoint_status (p, NULL, utp);
3731 }
3732 else
3733 {
3734 /* Don't error out, the target might be sending us optional
3735 info that we don't care about. */
3736 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3737 }
3738 }
3739
3740 /* Convert a textual description of a trace state variable into an
3741 uploaded object. */
3742
3743 void
3744 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3745 {
3746 char *p, *buf;
3747 ULONGEST num, initval, builtin;
3748 int end;
3749 struct uploaded_tsv *utsv = NULL;
3750
3751 buf = (char *) alloca (strlen (line));
3752
3753 p = line;
3754 p = unpack_varlen_hex (p, &num);
3755 p++; /* skip a colon */
3756 p = unpack_varlen_hex (p, &initval);
3757 p++; /* skip a colon */
3758 p = unpack_varlen_hex (p, &builtin);
3759 p++; /* skip a colon */
3760 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3761 buf[end] = '\0';
3762
3763 utsv = get_uploaded_tsv (num, utsvp);
3764 utsv->initial_value = initval;
3765 utsv->builtin = builtin;
3766 utsv->name = xstrdup (buf);
3767 }
3768
3769 void
3770 free_current_marker (void *arg)
3771 {
3772 struct static_tracepoint_marker **marker_p
3773 = (struct static_tracepoint_marker **) arg;
3774
3775 if (*marker_p != NULL)
3776 {
3777 release_static_tracepoint_marker (*marker_p);
3778 xfree (*marker_p);
3779 }
3780 else
3781 *marker_p = NULL;
3782 }
3783
3784 /* Given a line of text defining a static tracepoint marker, parse it
3785 into a "static tracepoint marker" object. Throws an error is
3786 parsing fails. If PP is non-null, it points to one past the end of
3787 the parsed marker definition. */
3788
3789 void
3790 parse_static_tracepoint_marker_definition (char *line, char **pp,
3791 struct static_tracepoint_marker *marker)
3792 {
3793 char *p, *endp;
3794 ULONGEST addr;
3795 int end;
3796
3797 p = line;
3798 p = unpack_varlen_hex (p, &addr);
3799 p++; /* skip a colon */
3800
3801 marker->gdbarch = target_gdbarch ();
3802 marker->address = (CORE_ADDR) addr;
3803
3804 endp = strchr (p, ':');
3805 if (endp == NULL)
3806 error (_("bad marker definition: %s"), line);
3807
3808 marker->str_id = (char *) xmalloc (endp - p + 1);
3809 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
3810 marker->str_id[end] = '\0';
3811
3812 p += 2 * end;
3813 p++; /* skip a colon */
3814
3815 marker->extra = (char *) xmalloc (strlen (p) + 1);
3816 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
3817 marker->extra[end] = '\0';
3818
3819 if (pp)
3820 *pp = p;
3821 }
3822
3823 /* Release a static tracepoint marker's contents. Note that the
3824 object itself isn't released here. There objects are usually on
3825 the stack. */
3826
3827 void
3828 release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
3829 {
3830 xfree (marker->str_id);
3831 marker->str_id = NULL;
3832 }
3833
3834 /* Print MARKER to gdb_stdout. */
3835
3836 static void
3837 print_one_static_tracepoint_marker (int count,
3838 struct static_tracepoint_marker *marker)
3839 {
3840 struct symbol *sym;
3841
3842 char wrap_indent[80];
3843 char extra_field_indent[80];
3844 struct ui_out *uiout = current_uiout;
3845 struct cleanup *bkpt_chain;
3846 VEC(breakpoint_p) *tracepoints;
3847
3848 struct symtab_and_line sal;
3849
3850 init_sal (&sal);
3851
3852 sal.pc = marker->address;
3853
3854 tracepoints = static_tracepoints_here (marker->address);
3855
3856 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
3857
3858 /* A counter field to help readability. This is not a stable
3859 identifier! */
3860 uiout->field_int ("count", count);
3861
3862 uiout->field_string ("marker-id", marker->str_id);
3863
3864 uiout->field_fmt ("enabled", "%c",
3865 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
3866 uiout->spaces (2);
3867
3868 strcpy (wrap_indent, " ");
3869
3870 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
3871 strcat (wrap_indent, " ");
3872 else
3873 strcat (wrap_indent, " ");
3874
3875 strcpy (extra_field_indent, " ");
3876
3877 uiout->field_core_addr ("addr", marker->gdbarch, marker->address);
3878
3879 sal = find_pc_line (marker->address, 0);
3880 sym = find_pc_sect_function (marker->address, NULL);
3881 if (sym)
3882 {
3883 uiout->text ("in ");
3884 uiout->field_string ("func",
3885 SYMBOL_PRINT_NAME (sym));
3886 uiout->wrap_hint (wrap_indent);
3887 uiout->text (" at ");
3888 }
3889 else
3890 uiout->field_skip ("func");
3891
3892 if (sal.symtab != NULL)
3893 {
3894 uiout->field_string ("file",
3895 symtab_to_filename_for_display (sal.symtab));
3896 uiout->text (":");
3897
3898 if (uiout->is_mi_like_p ())
3899 {
3900 const char *fullname = symtab_to_fullname (sal.symtab);
3901
3902 uiout->field_string ("fullname", fullname);
3903 }
3904 else
3905 uiout->field_skip ("fullname");
3906
3907 uiout->field_int ("line", sal.line);
3908 }
3909 else
3910 {
3911 uiout->field_skip ("fullname");
3912 uiout->field_skip ("line");
3913 }
3914
3915 uiout->text ("\n");
3916 uiout->text (extra_field_indent);
3917 uiout->text (_("Data: \""));
3918 uiout->field_string ("extra-data", marker->extra);
3919 uiout->text ("\"\n");
3920
3921 if (!VEC_empty (breakpoint_p, tracepoints))
3922 {
3923 struct cleanup *cleanup_chain;
3924 int ix;
3925 struct breakpoint *b;
3926
3927 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
3928 "tracepoints-at");
3929
3930 uiout->text (extra_field_indent);
3931 uiout->text (_("Probed by static tracepoints: "));
3932 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
3933 {
3934 if (ix > 0)
3935 uiout->text (", ");
3936 uiout->text ("#");
3937 uiout->field_int ("tracepoint-id", b->number);
3938 }
3939
3940 do_cleanups (cleanup_chain);
3941
3942 if (uiout->is_mi_like_p ())
3943 uiout->field_int ("number-of-tracepoints",
3944 VEC_length(breakpoint_p, tracepoints));
3945 else
3946 uiout->text ("\n");
3947 }
3948 VEC_free (breakpoint_p, tracepoints);
3949
3950 do_cleanups (bkpt_chain);
3951 }
3952
3953 static void
3954 info_static_tracepoint_markers_command (char *arg, int from_tty)
3955 {
3956 VEC(static_tracepoint_marker_p) *markers;
3957 struct cleanup *old_chain;
3958 struct static_tracepoint_marker *marker;
3959 struct ui_out *uiout = current_uiout;
3960 int i;
3961
3962 /* We don't have to check target_can_use_agent and agent's capability on
3963 static tracepoint here, in order to be compatible with older GDBserver.
3964 We don't check USE_AGENT is true or not, because static tracepoints
3965 don't work without in-process agent, so we don't bother users to type
3966 `set agent on' when to use static tracepoint. */
3967
3968 old_chain
3969 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
3970 "StaticTracepointMarkersTable");
3971
3972 uiout->table_header (7, ui_left, "counter", "Cnt");
3973
3974 uiout->table_header (40, ui_left, "marker-id", "ID");
3975
3976 uiout->table_header (3, ui_left, "enabled", "Enb");
3977 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
3978 uiout->table_header (10, ui_left, "addr", "Address");
3979 else
3980 uiout->table_header (18, ui_left, "addr", "Address");
3981 uiout->table_header (40, ui_noalign, "what", "What");
3982
3983 uiout->table_body ();
3984
3985 markers = target_static_tracepoint_markers_by_strid (NULL);
3986 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
3987
3988 for (i = 0;
3989 VEC_iterate (static_tracepoint_marker_p,
3990 markers, i, marker);
3991 i++)
3992 {
3993 print_one_static_tracepoint_marker (i + 1, marker);
3994 release_static_tracepoint_marker (marker);
3995 }
3996
3997 do_cleanups (old_chain);
3998 }
3999
4000 /* The $_sdata convenience variable is a bit special. We don't know
4001 for sure type of the value until we actually have a chance to fetch
4002 the data --- the size of the object depends on what has been
4003 collected. We solve this by making $_sdata be an internalvar that
4004 creates a new value on access. */
4005
4006 /* Return a new value with the correct type for the sdata object of
4007 the current trace frame. Return a void value if there's no object
4008 available. */
4009
4010 static struct value *
4011 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
4012 void *ignore)
4013 {
4014 LONGEST size;
4015 gdb_byte *buf;
4016
4017 /* We need to read the whole object before we know its size. */
4018 size = target_read_alloc (&current_target,
4019 TARGET_OBJECT_STATIC_TRACE_DATA,
4020 NULL, &buf);
4021 if (size >= 0)
4022 {
4023 struct value *v;
4024 struct type *type;
4025
4026 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4027 size);
4028 v = allocate_value (type);
4029 memcpy (value_contents_raw (v), buf, size);
4030 xfree (buf);
4031 return v;
4032 }
4033 else
4034 return allocate_value (builtin_type (gdbarch)->builtin_void);
4035 }
4036
4037 #if !defined(HAVE_LIBEXPAT)
4038
4039 struct traceframe_info *
4040 parse_traceframe_info (const char *tframe_info)
4041 {
4042 static int have_warned;
4043
4044 if (!have_warned)
4045 {
4046 have_warned = 1;
4047 warning (_("Can not parse XML trace frame info; XML support "
4048 "was disabled at compile time"));
4049 }
4050
4051 return NULL;
4052 }
4053
4054 #else /* HAVE_LIBEXPAT */
4055
4056 #include "xml-support.h"
4057
4058 /* Handle the start of a <memory> element. */
4059
4060 static void
4061 traceframe_info_start_memory (struct gdb_xml_parser *parser,
4062 const struct gdb_xml_element *element,
4063 void *user_data, VEC(gdb_xml_value_s) *attributes)
4064 {
4065 struct traceframe_info *info = (struct traceframe_info *) user_data;
4066 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4067 ULONGEST *start_p, *length_p;
4068
4069 start_p
4070 = (ULONGEST *) xml_find_attribute (attributes, "start")->value;
4071 length_p
4072 = (ULONGEST *) xml_find_attribute (attributes, "length")->value;
4073
4074 r->start = *start_p;
4075 r->length = *length_p;
4076 }
4077
4078 /* Handle the start of a <tvar> element. */
4079
4080 static void
4081 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
4082 const struct gdb_xml_element *element,
4083 void *user_data,
4084 VEC(gdb_xml_value_s) *attributes)
4085 {
4086 struct traceframe_info *info = (struct traceframe_info *) user_data;
4087 const char *id_attrib
4088 = (const char *) xml_find_attribute (attributes, "id")->value;
4089 int id = gdb_xml_parse_ulongest (parser, id_attrib);
4090
4091 VEC_safe_push (int, info->tvars, id);
4092 }
4093
4094 /* Discard the constructed trace frame info (if an error occurs). */
4095
4096 static void
4097 free_result (void *p)
4098 {
4099 struct traceframe_info *result = (struct traceframe_info *) p;
4100
4101 free_traceframe_info (result);
4102 }
4103
4104 /* The allowed elements and attributes for an XML memory map. */
4105
4106 static const struct gdb_xml_attribute memory_attributes[] = {
4107 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4108 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4109 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4110 };
4111
4112 static const struct gdb_xml_attribute tvar_attributes[] = {
4113 { "id", GDB_XML_AF_NONE, NULL, NULL },
4114 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4115 };
4116
4117 static const struct gdb_xml_element traceframe_info_children[] = {
4118 { "memory", memory_attributes, NULL,
4119 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4120 traceframe_info_start_memory, NULL },
4121 { "tvar", tvar_attributes, NULL,
4122 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4123 traceframe_info_start_tvar, NULL },
4124 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4125 };
4126
4127 static const struct gdb_xml_element traceframe_info_elements[] = {
4128 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4129 NULL, NULL },
4130 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4131 };
4132
4133 /* Parse a traceframe-info XML document. */
4134
4135 struct traceframe_info *
4136 parse_traceframe_info (const char *tframe_info)
4137 {
4138 struct traceframe_info *result;
4139 struct cleanup *back_to;
4140
4141 result = XCNEW (struct traceframe_info);
4142 back_to = make_cleanup (free_result, result);
4143
4144 if (gdb_xml_parse_quick (_("trace frame info"),
4145 "traceframe-info.dtd", traceframe_info_elements,
4146 tframe_info, result) == 0)
4147 {
4148 /* Parsed successfully, keep the result. */
4149 discard_cleanups (back_to);
4150
4151 return result;
4152 }
4153
4154 do_cleanups (back_to);
4155 return NULL;
4156 }
4157
4158 #endif /* HAVE_LIBEXPAT */
4159
4160 /* Returns the traceframe_info object for the current traceframe.
4161 This is where we avoid re-fetching the object from the target if we
4162 already have it cached. */
4163
4164 struct traceframe_info *
4165 get_traceframe_info (void)
4166 {
4167 if (traceframe_info == NULL)
4168 traceframe_info = target_traceframe_info ();
4169
4170 return traceframe_info;
4171 }
4172
4173 /* If the target supports the query, return in RESULT the set of
4174 collected memory in the current traceframe, found within the LEN
4175 bytes range starting at MEMADDR. Returns true if the target
4176 supports the query, otherwise returns false, and RESULT is left
4177 undefined. */
4178
4179 int
4180 traceframe_available_memory (VEC(mem_range_s) **result,
4181 CORE_ADDR memaddr, ULONGEST len)
4182 {
4183 struct traceframe_info *info = get_traceframe_info ();
4184
4185 if (info != NULL)
4186 {
4187 struct mem_range *r;
4188 int i;
4189
4190 *result = NULL;
4191
4192 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4193 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4194 {
4195 ULONGEST lo1, hi1, lo2, hi2;
4196 struct mem_range *nr;
4197
4198 lo1 = memaddr;
4199 hi1 = memaddr + len;
4200
4201 lo2 = r->start;
4202 hi2 = r->start + r->length;
4203
4204 nr = VEC_safe_push (mem_range_s, *result, NULL);
4205
4206 nr->start = std::max (lo1, lo2);
4207 nr->length = std::min (hi1, hi2) - nr->start;
4208 }
4209
4210 normalize_mem_ranges (*result);
4211 return 1;
4212 }
4213
4214 return 0;
4215 }
4216
4217 /* Implementation of `sdata' variable. */
4218
4219 static const struct internalvar_funcs sdata_funcs =
4220 {
4221 sdata_make_value,
4222 NULL,
4223 NULL
4224 };
4225
4226 /* module initialization */
4227 void
4228 _initialize_tracepoint (void)
4229 {
4230 struct cmd_list_element *c;
4231
4232 /* Explicitly create without lookup, since that tries to create a
4233 value with a void typed value, and when we get here, gdbarch
4234 isn't initialized yet. At this point, we're quite sure there
4235 isn't another convenience variable of the same name. */
4236 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
4237
4238 traceframe_number = -1;
4239 tracepoint_number = -1;
4240
4241 add_info ("scope", scope_info,
4242 _("List the variables local to a scope"));
4243
4244 add_cmd ("tracepoints", class_trace, NULL,
4245 _("Tracing of program execution without stopping the program."),
4246 &cmdlist);
4247
4248 add_com ("tdump", class_trace, tdump_command,
4249 _("Print everything collected at the current tracepoint."));
4250
4251 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4252 Define a trace state variable.\n\
4253 Argument is a $-prefixed name, optionally followed\n\
4254 by '=' and an expression that sets the initial value\n\
4255 at the start of tracing."));
4256 set_cmd_completer (c, expression_completer);
4257
4258 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4259 Delete one or more trace state variables.\n\
4260 Arguments are the names of the variables to delete.\n\
4261 If no arguments are supplied, delete all variables."), &deletelist);
4262 /* FIXME add a trace variable completer. */
4263
4264 add_info ("tvariables", tvariables_info, _("\
4265 Status of trace state variables and their values.\n\
4266 "));
4267
4268 add_info ("static-tracepoint-markers",
4269 info_static_tracepoint_markers_command, _("\
4270 List target static tracepoints markers.\n\
4271 "));
4272
4273 add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
4274 Select a trace frame;\n\
4275 No argument means forward by one frame; '-' means backward by one frame."),
4276 &tfindlist, "tfind ", 1, &cmdlist);
4277
4278 add_cmd ("outside", class_trace, tfind_outside_command, _("\
4279 Select a trace frame whose PC is outside the given range (exclusive).\n\
4280 Usage: tfind outside addr1, addr2"),
4281 &tfindlist);
4282
4283 add_cmd ("range", class_trace, tfind_range_command, _("\
4284 Select a trace frame whose PC is in the given range (inclusive).\n\
4285 Usage: tfind range addr1,addr2"),
4286 &tfindlist);
4287
4288 add_cmd ("line", class_trace, tfind_line_command, _("\
4289 Select a trace frame by source line.\n\
4290 Argument can be a line number (with optional source file),\n\
4291 a function name, or '*' followed by an address.\n\
4292 Default argument is 'the next source line that was traced'."),
4293 &tfindlist);
4294
4295 add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\
4296 Select a trace frame by tracepoint number.\n\
4297 Default is the tracepoint for the current trace frame."),
4298 &tfindlist);
4299
4300 add_cmd ("pc", class_trace, tfind_pc_command, _("\
4301 Select a trace frame by PC.\n\
4302 Default is the current PC, or the PC of the current trace frame."),
4303 &tfindlist);
4304
4305 add_cmd ("end", class_trace, tfind_end_command, _("\
4306 De-select any trace frame and resume 'live' debugging."),
4307 &tfindlist);
4308
4309 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
4310
4311 add_cmd ("start", class_trace, tfind_start_command,
4312 _("Select the first trace frame in the trace buffer."),
4313 &tfindlist);
4314
4315 add_com ("tstatus", class_trace, tstatus_command,
4316 _("Display the status of the current trace data collection."));
4317
4318 add_com ("tstop", class_trace, tstop_command, _("\
4319 Stop trace data collection.\n\
4320 Usage: tstop [ <notes> ... ]\n\
4321 Any arguments supplied are recorded with the trace as a stop reason and\n\
4322 reported by tstatus (if the target supports trace notes)."));
4323
4324 add_com ("tstart", class_trace, tstart_command, _("\
4325 Start trace data collection.\n\
4326 Usage: tstart [ <notes> ... ]\n\
4327 Any arguments supplied are recorded with the trace as a note and\n\
4328 reported by tstatus (if the target supports trace notes)."));
4329
4330 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4331 Ends a list of commands or actions.\n\
4332 Several GDB commands allow you to enter a list of commands or actions.\n\
4333 Entering \"end\" on a line by itself is the normal way to terminate\n\
4334 such a list.\n\n\
4335 Note: the \"end\" command cannot be used at the gdb prompt."));
4336
4337 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4338 Specify single-stepping behavior at a tracepoint.\n\
4339 Argument is number of instructions to trace in single-step mode\n\
4340 following the tracepoint. This command is normally followed by\n\
4341 one or more \"collect\" commands, to specify what to collect\n\
4342 while single-stepping.\n\n\
4343 Note: this command can only be used in a tracepoint \"actions\" list."));
4344
4345 add_com_alias ("ws", "while-stepping", class_alias, 0);
4346 add_com_alias ("stepping", "while-stepping", class_alias, 0);
4347
4348 add_com ("collect", class_trace, collect_pseudocommand, _("\
4349 Specify one or more data items to be collected at a tracepoint.\n\
4350 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4351 collect all data (variables, registers) referenced by that expression.\n\
4352 Also accepts the following special arguments:\n\
4353 $regs -- all registers.\n\
4354 $args -- all function arguments.\n\
4355 $locals -- all variables local to the block/function scope.\n\
4356 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4357 Note: this command can only be used in a tracepoint \"actions\" list."));
4358
4359 add_com ("teval", class_trace, teval_pseudocommand, _("\
4360 Specify one or more expressions to be evaluated at a tracepoint.\n\
4361 Accepts a comma-separated list of (one or more) expressions.\n\
4362 The result of each evaluation will be discarded.\n\
4363 Note: this command can only be used in a tracepoint \"actions\" list."));
4364
4365 add_com ("actions", class_trace, actions_command, _("\
4366 Specify the actions to be taken at a tracepoint.\n\
4367 Tracepoint actions may include collecting of specified data,\n\
4368 single-stepping, or enabling/disabling other tracepoints,\n\
4369 depending on target's capabilities."));
4370
4371 default_collect = xstrdup ("");
4372 add_setshow_string_cmd ("default-collect", class_trace,
4373 &default_collect, _("\
4374 Set the list of expressions to collect by default"), _("\
4375 Show the list of expressions to collect by default"), NULL,
4376 NULL, NULL,
4377 &setlist, &showlist);
4378
4379 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4380 &disconnected_tracing, _("\
4381 Set whether tracing continues after GDB disconnects."), _("\
4382 Show whether tracing continues after GDB disconnects."), _("\
4383 Use this to continue a tracing run even if GDB disconnects\n\
4384 or detaches from the target. You can reconnect later and look at\n\
4385 trace data collected in the meantime."),
4386 set_disconnected_tracing,
4387 NULL,
4388 &setlist,
4389 &showlist);
4390
4391 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4392 &circular_trace_buffer, _("\
4393 Set target's use of circular trace buffer."), _("\
4394 Show target's use of circular trace buffer."), _("\
4395 Use this to make the trace buffer into a circular buffer,\n\
4396 which will discard traceframes (oldest first) instead of filling\n\
4397 up and stopping the trace run."),
4398 set_circular_trace_buffer,
4399 NULL,
4400 &setlist,
4401 &showlist);
4402
4403 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
4404 &trace_buffer_size, _("\
4405 Set requested size of trace buffer."), _("\
4406 Show requested size of trace buffer."), _("\
4407 Use this to choose a size for the trace buffer. Some targets\n\
4408 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\
4409 disables any attempt to set the buffer size and lets the target choose."),
4410 set_trace_buffer_size, NULL,
4411 &setlist, &showlist);
4412
4413 add_setshow_string_cmd ("trace-user", class_trace,
4414 &trace_user, _("\
4415 Set the user name to use for current and future trace runs"), _("\
4416 Show the user name to use for current and future trace runs"), NULL,
4417 set_trace_user, NULL,
4418 &setlist, &showlist);
4419
4420 add_setshow_string_cmd ("trace-notes", class_trace,
4421 &trace_notes, _("\
4422 Set notes string to use for current and future trace runs"), _("\
4423 Show the notes string to use for current and future trace runs"), NULL,
4424 set_trace_notes, NULL,
4425 &setlist, &showlist);
4426
4427 add_setshow_string_cmd ("trace-stop-notes", class_trace,
4428 &trace_stop_notes, _("\
4429 Set notes string to use for future tstop commands"), _("\
4430 Show the notes string to use for future tstop commands"), NULL,
4431 set_trace_stop_notes, NULL,
4432 &setlist, &showlist);
4433 }
This page took 0.181546 seconds and 5 git commands to generate.