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