gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3 Copyright (C) 1997-2020 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 char *trace_user = NULL;
149
150 /* Textual notes applying to the current and/or future trace runs. */
151
152 char *trace_notes = NULL;
153
154 /* Textual notes applying to the stopping of a trace. */
155
156 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, "", -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->elts[0].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 printed expression EXP to *LIST. */
1270
1271 void
1272 collection_list::append_exp (struct expression *exp)
1273 {
1274 string_file tmp_stream;
1275
1276 print_expression (exp, &tmp_stream);
1277
1278 m_computed.push_back (std::move (tmp_stream.string ()));
1279 }
1280
1281 void
1282 collection_list::finish ()
1283 {
1284 memrange_sortmerge (m_memranges);
1285 }
1286
1287 static void
1288 encode_actions_1 (struct command_line *action,
1289 struct bp_location *tloc,
1290 int frame_reg,
1291 LONGEST frame_offset,
1292 struct collection_list *collect,
1293 struct collection_list *stepping_list)
1294 {
1295 const char *action_exp;
1296 int i;
1297 struct value *tempval;
1298 struct cmd_list_element *cmd;
1299
1300 for (; action; action = action->next)
1301 {
1302 QUIT; /* Allow user to bail out with ^C. */
1303 action_exp = action->line;
1304 action_exp = skip_spaces (action_exp);
1305
1306 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1307 if (cmd == 0)
1308 error (_("Bad action list item: %s"), action_exp);
1309
1310 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1311 {
1312 int trace_string = 0;
1313
1314 if (*action_exp == '/')
1315 action_exp = decode_agent_options (action_exp, &trace_string);
1316
1317 do
1318 { /* Repeat over a comma-separated list. */
1319 QUIT; /* Allow user to bail out with ^C. */
1320 action_exp = skip_spaces (action_exp);
1321
1322 if (0 == strncasecmp ("$reg", action_exp, 4))
1323 {
1324 for (i = 0; i < gdbarch_num_regs (target_gdbarch ());
1325 i++)
1326 {
1327 int remote_regno = (gdbarch_remote_register_number
1328 (target_gdbarch (), i));
1329
1330 /* Ignore arch regnos without a corresponding
1331 remote regno. This can happen for regnos not
1332 in the tdesc. */
1333 if (remote_regno >= 0)
1334 collect->add_remote_register (remote_regno);
1335 }
1336 action_exp = strchr (action_exp, ','); /* more? */
1337 }
1338 else if (0 == strncasecmp ("$arg", action_exp, 4))
1339 {
1340 collect->add_local_symbols (target_gdbarch (),
1341 tloc->address,
1342 frame_reg,
1343 frame_offset,
1344 'A',
1345 trace_string);
1346 action_exp = strchr (action_exp, ','); /* more? */
1347 }
1348 else if (0 == strncasecmp ("$loc", action_exp, 4))
1349 {
1350 collect->add_local_symbols (target_gdbarch (),
1351 tloc->address,
1352 frame_reg,
1353 frame_offset,
1354 'L',
1355 trace_string);
1356 action_exp = strchr (action_exp, ','); /* more? */
1357 }
1358 else if (0 == strncasecmp ("$_ret", action_exp, 5))
1359 {
1360 agent_expr_up aexpr
1361 = gen_trace_for_return_address (tloc->address,
1362 target_gdbarch (),
1363 trace_string);
1364
1365 finalize_tracepoint_aexpr (aexpr.get ());
1366
1367 /* take care of the registers */
1368 collect->add_ax_registers (aexpr.get ());
1369
1370 collect->add_aexpr (std::move (aexpr));
1371 action_exp = strchr (action_exp, ','); /* more? */
1372 }
1373 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1374 {
1375 collect->add_static_trace_data ();
1376 action_exp = strchr (action_exp, ','); /* more? */
1377 }
1378 else
1379 {
1380 unsigned long addr;
1381
1382 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1383 block_for_pc (tloc->address),
1384 1);
1385
1386 switch (exp->elts[0].opcode)
1387 {
1388 case OP_REGISTER:
1389 {
1390 const char *name = &exp->elts[2].string;
1391
1392 i = user_reg_map_name_to_regnum (target_gdbarch (),
1393 name, strlen (name));
1394 if (i == -1)
1395 internal_error (__FILE__, __LINE__,
1396 _("Register $%s not available"),
1397 name);
1398 if (info_verbose)
1399 printf_filtered ("OP_REGISTER: ");
1400 collect->add_local_register (target_gdbarch (),
1401 i, tloc->address);
1402 break;
1403 }
1404
1405 case UNOP_MEMVAL:
1406 /* Safe because we know it's a simple expression. */
1407 tempval = evaluate_expression (exp.get ());
1408 addr = value_address (tempval);
1409 /* Initialize the TYPE_LENGTH if it is a typedef. */
1410 check_typedef (exp->elts[1].type);
1411 collect->add_memrange (target_gdbarch (),
1412 memrange_absolute, addr,
1413 TYPE_LENGTH (exp->elts[1].type),
1414 tloc->address);
1415 collect->append_exp (exp.get ());
1416 break;
1417
1418 case OP_VAR_VALUE:
1419 {
1420 struct symbol *sym = exp->elts[2].symbol;
1421 const char *name = sym->natural_name ();
1422
1423 collect->collect_symbol (exp->elts[2].symbol,
1424 target_gdbarch (),
1425 frame_reg,
1426 frame_offset,
1427 tloc->address,
1428 trace_string);
1429 collect->add_wholly_collected (name);
1430 }
1431 break;
1432
1433 default: /* Full-fledged expression. */
1434 agent_expr_up aexpr = gen_trace_for_expr (tloc->address,
1435 exp.get (),
1436 trace_string);
1437
1438 finalize_tracepoint_aexpr (aexpr.get ());
1439
1440 /* Take care of the registers. */
1441 collect->add_ax_registers (aexpr.get ());
1442
1443 collect->add_aexpr (std::move (aexpr));
1444 collect->append_exp (exp.get ());
1445 break;
1446 } /* switch */
1447 } /* do */
1448 }
1449 while (action_exp && *action_exp++ == ',');
1450 } /* if */
1451 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1452 {
1453 do
1454 { /* Repeat over a comma-separated list. */
1455 QUIT; /* Allow user to bail out with ^C. */
1456 action_exp = skip_spaces (action_exp);
1457
1458 {
1459 expression_up exp = parse_exp_1 (&action_exp, tloc->address,
1460 block_for_pc (tloc->address),
1461 1);
1462
1463 agent_expr_up aexpr = gen_eval_for_expr (tloc->address,
1464 exp.get ());
1465
1466 finalize_tracepoint_aexpr (aexpr.get ());
1467
1468 /* Even though we're not officially collecting, add
1469 to the collect list anyway. */
1470 collect->add_aexpr (std::move (aexpr));
1471 } /* do */
1472 }
1473 while (action_exp && *action_exp++ == ',');
1474 } /* if */
1475 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1476 {
1477 /* We check against nested while-stepping when setting
1478 breakpoint action, so no way to run into nested
1479 here. */
1480 gdb_assert (stepping_list);
1481
1482 encode_actions_1 (action->body_list_0.get (), tloc, frame_reg,
1483 frame_offset, stepping_list, NULL);
1484 }
1485 else
1486 error (_("Invalid tracepoint command '%s'"), action->line);
1487 } /* for */
1488 }
1489
1490 /* Encode actions of tracepoint TLOC->owner and fill TRACEPOINT_LIST
1491 and STEPPING_LIST. */
1492
1493 void
1494 encode_actions (struct bp_location *tloc,
1495 struct collection_list *tracepoint_list,
1496 struct collection_list *stepping_list)
1497 {
1498 int frame_reg;
1499 LONGEST frame_offset;
1500
1501 gdbarch_virtual_frame_pointer (tloc->gdbarch,
1502 tloc->address, &frame_reg, &frame_offset);
1503
1504 counted_command_line actions = all_tracepoint_actions (tloc->owner);
1505 encode_actions_1 (actions.get (), tloc, frame_reg, frame_offset,
1506 tracepoint_list, stepping_list);
1507 encode_actions_1 (breakpoint_commands (tloc->owner), tloc,
1508 frame_reg, frame_offset, tracepoint_list, stepping_list);
1509
1510 tracepoint_list->finish ();
1511 stepping_list->finish ();
1512 }
1513
1514 /* Render all actions into gdb protocol. */
1515
1516 void
1517 encode_actions_rsp (struct bp_location *tloc,
1518 std::vector<std::string> *tdp_actions,
1519 std::vector<std::string> *stepping_actions)
1520 {
1521 struct collection_list tracepoint_list, stepping_list;
1522
1523 encode_actions (tloc, &tracepoint_list, &stepping_list);
1524
1525 *tdp_actions = tracepoint_list.stringify ();
1526 *stepping_actions = stepping_list.stringify ();
1527 }
1528
1529 void
1530 collection_list::add_aexpr (agent_expr_up aexpr)
1531 {
1532 m_aexprs.push_back (std::move (aexpr));
1533 }
1534
1535 static void
1536 process_tracepoint_on_disconnect (void)
1537 {
1538 int has_pending_p = 0;
1539
1540 /* Check whether we still have pending tracepoint. If we have, warn the
1541 user that pending tracepoint will no longer work. */
1542 for (breakpoint *b : all_tracepoints ())
1543 {
1544 if (b->loc == NULL)
1545 {
1546 has_pending_p = 1;
1547 break;
1548 }
1549 else
1550 {
1551 struct bp_location *loc1;
1552
1553 for (loc1 = b->loc; loc1; loc1 = loc1->next)
1554 {
1555 if (loc1->shlib_disabled)
1556 {
1557 has_pending_p = 1;
1558 break;
1559 }
1560 }
1561
1562 if (has_pending_p)
1563 break;
1564 }
1565 }
1566
1567 if (has_pending_p)
1568 warning (_("Pending tracepoints will not be resolved while"
1569 " GDB is disconnected\n"));
1570 }
1571
1572 /* Reset local state of tracing. */
1573
1574 void
1575 trace_reset_local_state (void)
1576 {
1577 set_traceframe_num (-1);
1578 set_tracepoint_num (-1);
1579 set_traceframe_context (NULL);
1580 clear_traceframe_info ();
1581 }
1582
1583 void
1584 start_tracing (const char *notes)
1585 {
1586 int any_enabled = 0, num_to_download = 0;
1587 int ret;
1588
1589 std::vector<breakpoint *> tp_vec = all_tracepoints ();
1590
1591 /* No point in tracing without any tracepoints... */
1592 if (tp_vec.empty ())
1593 error (_("No tracepoints defined, not starting trace"));
1594
1595 for (breakpoint *b : tp_vec)
1596 {
1597 if (b->enable_state == bp_enabled)
1598 any_enabled = 1;
1599
1600 if ((b->type == bp_fast_tracepoint
1601 ? may_insert_fast_tracepoints
1602 : may_insert_tracepoints))
1603 ++num_to_download;
1604 else
1605 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1606 (b->type == bp_fast_tracepoint ? "fast " : ""), b->number);
1607 }
1608
1609 if (!any_enabled)
1610 {
1611 if (target_supports_enable_disable_tracepoint ())
1612 warning (_("No tracepoints enabled"));
1613 else
1614 {
1615 /* No point in tracing with only disabled tracepoints that
1616 cannot be re-enabled. */
1617 error (_("No tracepoints enabled, not starting trace"));
1618 }
1619 }
1620
1621 if (num_to_download <= 0)
1622 error (_("No tracepoints that may be downloaded, not starting trace"));
1623
1624 target_trace_init ();
1625
1626 for (breakpoint *b : tp_vec)
1627 {
1628 struct tracepoint *t = (struct tracepoint *) b;
1629 struct bp_location *loc;
1630 int bp_location_downloaded = 0;
1631
1632 /* Clear `inserted' flag. */
1633 for (loc = b->loc; loc; loc = loc->next)
1634 loc->inserted = 0;
1635
1636 if ((b->type == bp_fast_tracepoint
1637 ? !may_insert_fast_tracepoints
1638 : !may_insert_tracepoints))
1639 continue;
1640
1641 t->number_on_target = 0;
1642
1643 for (loc = b->loc; loc; loc = loc->next)
1644 {
1645 /* Since tracepoint locations are never duplicated, `inserted'
1646 flag should be zero. */
1647 gdb_assert (!loc->inserted);
1648
1649 target_download_tracepoint (loc);
1650
1651 loc->inserted = 1;
1652 bp_location_downloaded = 1;
1653 }
1654
1655 t->number_on_target = b->number;
1656
1657 for (loc = b->loc; loc; loc = loc->next)
1658 if (loc->probe.prob != NULL)
1659 loc->probe.prob->set_semaphore (loc->probe.objfile,
1660 loc->gdbarch);
1661
1662 if (bp_location_downloaded)
1663 gdb::observers::breakpoint_modified.notify (b);
1664 }
1665
1666 /* Send down all the trace state variables too. */
1667 for (const trace_state_variable &tsv : tvariables)
1668 target_download_trace_state_variable (tsv);
1669
1670 /* Tell target to treat text-like sections as transparent. */
1671 target_trace_set_readonly_regions ();
1672 /* Set some mode flags. */
1673 target_set_disconnected_tracing (disconnected_tracing);
1674 target_set_circular_trace_buffer (circular_trace_buffer);
1675 target_set_trace_buffer_size (trace_buffer_size);
1676
1677 if (!notes)
1678 notes = trace_notes;
1679 ret = target_set_trace_notes (trace_user, notes, NULL);
1680
1681 if (!ret && (trace_user || notes))
1682 warning (_("Target does not support trace user/notes, info ignored"));
1683
1684 /* Now insert traps and begin collecting data. */
1685 target_trace_start ();
1686
1687 /* Reset our local state. */
1688 trace_reset_local_state ();
1689 current_trace_status()->running = 1;
1690 }
1691
1692 /* The tstart command requests the target to start a new trace run.
1693 The command passes any arguments it has to the target verbatim, as
1694 an optional "trace note". This is useful as for instance a warning
1695 to other users if the trace runs disconnected, and you don't want
1696 anybody else messing with the target. */
1697
1698 static void
1699 tstart_command (const char *args, int from_tty)
1700 {
1701 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1702
1703 if (current_trace_status ()->running)
1704 {
1705 if (from_tty
1706 && !query (_("A trace is running already. Start a new run? ")))
1707 error (_("New trace run not started."));
1708 }
1709
1710 start_tracing (args);
1711 }
1712
1713 /* The tstop command stops the tracing run. The command passes any
1714 supplied arguments to the target verbatim as a "stop note"; if the
1715 target supports trace notes, then it will be reported back as part
1716 of the trace run's status. */
1717
1718 static void
1719 tstop_command (const char *args, int from_tty)
1720 {
1721 if (!current_trace_status ()->running)
1722 error (_("Trace is not running."));
1723
1724 stop_tracing (args);
1725 }
1726
1727 void
1728 stop_tracing (const char *note)
1729 {
1730 int ret;
1731
1732 target_trace_stop ();
1733
1734 for (breakpoint *t : all_tracepoints ())
1735 {
1736 struct bp_location *loc;
1737
1738 if ((t->type == bp_fast_tracepoint
1739 ? !may_insert_fast_tracepoints
1740 : !may_insert_tracepoints))
1741 continue;
1742
1743 for (loc = t->loc; loc; loc = loc->next)
1744 {
1745 /* GDB can be totally absent in some disconnected trace scenarios,
1746 but we don't really care if this semaphore goes out of sync.
1747 That's why we are decrementing it here, but not taking care
1748 in other places. */
1749 if (loc->probe.prob != NULL)
1750 loc->probe.prob->clear_semaphore (loc->probe.objfile,
1751 loc->gdbarch);
1752 }
1753 }
1754
1755 if (!note)
1756 note = trace_stop_notes;
1757 ret = target_set_trace_notes (NULL, NULL, note);
1758
1759 if (!ret && note)
1760 warning (_("Target does not support trace notes, note ignored"));
1761
1762 /* Should change in response to reply? */
1763 current_trace_status ()->running = 0;
1764 }
1765
1766 /* tstatus command */
1767 static void
1768 tstatus_command (const char *args, int from_tty)
1769 {
1770 struct trace_status *ts = current_trace_status ();
1771 int status;
1772
1773 status = target_get_trace_status (ts);
1774
1775 if (status == -1)
1776 {
1777 if (ts->filename != NULL)
1778 printf_filtered (_("Using a trace file.\n"));
1779 else
1780 {
1781 printf_filtered (_("Trace can not be run on this target.\n"));
1782 return;
1783 }
1784 }
1785
1786 if (!ts->running_known)
1787 {
1788 printf_filtered (_("Run/stop status is unknown.\n"));
1789 }
1790 else if (ts->running)
1791 {
1792 printf_filtered (_("Trace is running on the target.\n"));
1793 }
1794 else
1795 {
1796 switch (ts->stop_reason)
1797 {
1798 case trace_never_run:
1799 printf_filtered (_("No trace has been run on the target.\n"));
1800 break;
1801 case trace_stop_command:
1802 if (ts->stop_desc)
1803 printf_filtered (_("Trace stopped by a tstop command (%s).\n"),
1804 ts->stop_desc);
1805 else
1806 printf_filtered (_("Trace stopped by a tstop command.\n"));
1807 break;
1808 case trace_buffer_full:
1809 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1810 break;
1811 case trace_disconnected:
1812 printf_filtered (_("Trace stopped because of disconnection.\n"));
1813 break;
1814 case tracepoint_passcount:
1815 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1816 ts->stopping_tracepoint);
1817 break;
1818 case tracepoint_error:
1819 if (ts->stopping_tracepoint)
1820 printf_filtered (_("Trace stopped by an "
1821 "error (%s, tracepoint %d).\n"),
1822 ts->stop_desc, ts->stopping_tracepoint);
1823 else
1824 printf_filtered (_("Trace stopped by an error (%s).\n"),
1825 ts->stop_desc);
1826 break;
1827 case trace_stop_reason_unknown:
1828 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1829 break;
1830 default:
1831 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1832 ts->stop_reason);
1833 break;
1834 }
1835 }
1836
1837 if (ts->traceframes_created >= 0
1838 && ts->traceframe_count != ts->traceframes_created)
1839 {
1840 printf_filtered (_("Buffer contains %d trace "
1841 "frames (of %d created total).\n"),
1842 ts->traceframe_count, ts->traceframes_created);
1843 }
1844 else if (ts->traceframe_count >= 0)
1845 {
1846 printf_filtered (_("Collected %d trace frames.\n"),
1847 ts->traceframe_count);
1848 }
1849
1850 if (ts->buffer_free >= 0)
1851 {
1852 if (ts->buffer_size >= 0)
1853 {
1854 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1855 ts->buffer_free, ts->buffer_size);
1856 if (ts->buffer_size > 0)
1857 printf_filtered (_(" (%d%% full)"),
1858 ((int) ((((long long) (ts->buffer_size
1859 - ts->buffer_free)) * 100)
1860 / ts->buffer_size)));
1861 printf_filtered (_(".\n"));
1862 }
1863 else
1864 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1865 ts->buffer_free);
1866 }
1867
1868 if (ts->disconnected_tracing)
1869 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1870 else
1871 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1872
1873 if (ts->circular_buffer)
1874 printf_filtered (_("Trace buffer is circular.\n"));
1875
1876 if (ts->user_name && strlen (ts->user_name) > 0)
1877 printf_filtered (_("Trace user is %s.\n"), ts->user_name);
1878
1879 if (ts->notes && strlen (ts->notes) > 0)
1880 printf_filtered (_("Trace notes: %s.\n"), ts->notes);
1881
1882 /* Now report on what we're doing with tfind. */
1883 if (traceframe_number >= 0)
1884 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1885 traceframe_number, tracepoint_number);
1886 else
1887 printf_filtered (_("Not looking at any trace frame.\n"));
1888
1889 /* Report start/stop times if supplied. */
1890 if (ts->start_time)
1891 {
1892 if (ts->stop_time)
1893 {
1894 LONGEST run_time = ts->stop_time - ts->start_time;
1895
1896 /* Reporting a run time is more readable than two long numbers. */
1897 printf_filtered (_("Trace started at %ld.%06ld secs, stopped %ld.%06ld secs later.\n"),
1898 (long int) (ts->start_time / 1000000),
1899 (long int) (ts->start_time % 1000000),
1900 (long int) (run_time / 1000000),
1901 (long int) (run_time % 1000000));
1902 }
1903 else
1904 printf_filtered (_("Trace started at %ld.%06ld secs.\n"),
1905 (long int) (ts->start_time / 1000000),
1906 (long int) (ts->start_time % 1000000));
1907 }
1908 else if (ts->stop_time)
1909 printf_filtered (_("Trace stopped at %ld.%06ld secs.\n"),
1910 (long int) (ts->stop_time / 1000000),
1911 (long int) (ts->stop_time % 1000000));
1912
1913 /* Now report any per-tracepoint status available. */
1914 for (breakpoint *t : all_tracepoints ())
1915 target_get_tracepoint_status (t, NULL);
1916 }
1917
1918 /* Report the trace status to uiout, in a way suitable for MI, and not
1919 suitable for CLI. If ON_STOP is true, suppress a few fields that
1920 are not meaningful in the -trace-stop response.
1921
1922 The implementation is essentially parallel to trace_status_command, but
1923 merging them will result in unreadable code. */
1924 void
1925 trace_status_mi (int on_stop)
1926 {
1927 struct ui_out *uiout = current_uiout;
1928 struct trace_status *ts = current_trace_status ();
1929 int status;
1930
1931 status = target_get_trace_status (ts);
1932
1933 if (status == -1 && ts->filename == NULL)
1934 {
1935 uiout->field_string ("supported", "0");
1936 return;
1937 }
1938
1939 if (ts->filename != NULL)
1940 uiout->field_string ("supported", "file");
1941 else if (!on_stop)
1942 uiout->field_string ("supported", "1");
1943
1944 if (ts->filename != NULL)
1945 uiout->field_string ("trace-file", ts->filename);
1946
1947 gdb_assert (ts->running_known);
1948
1949 if (ts->running)
1950 {
1951 uiout->field_string ("running", "1");
1952
1953 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1954 Given that the frontend gets the status either on -trace-stop, or from
1955 -trace-status after re-connection, it does not seem like this
1956 information is necessary for anything. It is not necessary for either
1957 figuring the vital state of the target nor for navigation of trace
1958 frames. If the frontend wants to show the current state is some
1959 configure dialog, it can request the value when such dialog is
1960 invoked by the user. */
1961 }
1962 else
1963 {
1964 const char *stop_reason = NULL;
1965 int stopping_tracepoint = -1;
1966
1967 if (!on_stop)
1968 uiout->field_string ("running", "0");
1969
1970 if (ts->stop_reason != trace_stop_reason_unknown)
1971 {
1972 switch (ts->stop_reason)
1973 {
1974 case trace_stop_command:
1975 stop_reason = "request";
1976 break;
1977 case trace_buffer_full:
1978 stop_reason = "overflow";
1979 break;
1980 case trace_disconnected:
1981 stop_reason = "disconnection";
1982 break;
1983 case tracepoint_passcount:
1984 stop_reason = "passcount";
1985 stopping_tracepoint = ts->stopping_tracepoint;
1986 break;
1987 case tracepoint_error:
1988 stop_reason = "error";
1989 stopping_tracepoint = ts->stopping_tracepoint;
1990 break;
1991 }
1992
1993 if (stop_reason)
1994 {
1995 uiout->field_string ("stop-reason", stop_reason);
1996 if (stopping_tracepoint != -1)
1997 uiout->field_signed ("stopping-tracepoint",
1998 stopping_tracepoint);
1999 if (ts->stop_reason == tracepoint_error)
2000 uiout->field_string ("error-description",
2001 ts->stop_desc);
2002 }
2003 }
2004 }
2005
2006 if (ts->traceframe_count != -1)
2007 uiout->field_signed ("frames", ts->traceframe_count);
2008 if (ts->traceframes_created != -1)
2009 uiout->field_signed ("frames-created", ts->traceframes_created);
2010 if (ts->buffer_size != -1)
2011 uiout->field_signed ("buffer-size", ts->buffer_size);
2012 if (ts->buffer_free != -1)
2013 uiout->field_signed ("buffer-free", ts->buffer_free);
2014
2015 uiout->field_signed ("disconnected", ts->disconnected_tracing);
2016 uiout->field_signed ("circular", ts->circular_buffer);
2017
2018 uiout->field_string ("user-name", ts->user_name);
2019 uiout->field_string ("notes", ts->notes);
2020
2021 {
2022 char buf[100];
2023
2024 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2025 (long int) (ts->start_time / 1000000),
2026 (long int) (ts->start_time % 1000000));
2027 uiout->field_string ("start-time", buf);
2028 xsnprintf (buf, sizeof buf, "%ld.%06ld",
2029 (long int) (ts->stop_time / 1000000),
2030 (long int) (ts->stop_time % 1000000));
2031 uiout->field_string ("stop-time", buf);
2032 }
2033 }
2034
2035 /* Check if a trace run is ongoing. If so, and FROM_TTY, query the
2036 user if she really wants to detach. */
2037
2038 void
2039 query_if_trace_running (int from_tty)
2040 {
2041 if (!from_tty)
2042 return;
2043
2044 /* It can happen that the target that was tracing went away on its
2045 own, and we didn't notice. Get a status update, and if the
2046 current target doesn't even do tracing, then assume it's not
2047 running anymore. */
2048 if (target_get_trace_status (current_trace_status ()) < 0)
2049 current_trace_status ()->running = 0;
2050
2051 /* If running interactively, give the user the option to cancel and
2052 then decide what to do differently with the run. Scripts are
2053 just going to disconnect and let the target deal with it,
2054 according to how it's been instructed previously via
2055 disconnected-tracing. */
2056 if (current_trace_status ()->running)
2057 {
2058 process_tracepoint_on_disconnect ();
2059
2060 if (current_trace_status ()->disconnected_tracing)
2061 {
2062 if (!query (_("Trace is running and will "
2063 "continue after detach; detach anyway? ")))
2064 error (_("Not confirmed."));
2065 }
2066 else
2067 {
2068 if (!query (_("Trace is running but will "
2069 "stop on detach; detach anyway? ")))
2070 error (_("Not confirmed."));
2071 }
2072 }
2073 }
2074
2075 /* This function handles the details of what to do about an ongoing
2076 tracing run if the user has asked to detach or otherwise disconnect
2077 from the target. */
2078
2079 void
2080 disconnect_tracing (void)
2081 {
2082 /* Also we want to be out of tfind mode, otherwise things can get
2083 confusing upon reconnection. Just use these calls instead of
2084 full tfind_1 behavior because we're in the middle of detaching,
2085 and there's no point to updating current stack frame etc. */
2086 trace_reset_local_state ();
2087 }
2088
2089 /* Worker function for the various flavors of the tfind command. */
2090 void
2091 tfind_1 (enum trace_find_type type, int num,
2092 CORE_ADDR addr1, CORE_ADDR addr2,
2093 int from_tty)
2094 {
2095 int target_frameno = -1, target_tracept = -1;
2096 struct frame_id old_frame_id = null_frame_id;
2097 struct tracepoint *tp;
2098 struct ui_out *uiout = current_uiout;
2099
2100 /* Only try to get the current stack frame if we have a chance of
2101 succeeding. In particular, if we're trying to get a first trace
2102 frame while all threads are running, it's not going to succeed,
2103 so leave it with a default value and let the frame comparison
2104 below (correctly) decide to print out the source location of the
2105 trace frame. */
2106 if (!(type == tfind_number && num == -1)
2107 && (has_stack_frames () || traceframe_number >= 0))
2108 old_frame_id = get_frame_id (get_current_frame ());
2109
2110 target_frameno = target_trace_find (type, num, addr1, addr2,
2111 &target_tracept);
2112
2113 if (type == tfind_number
2114 && num == -1
2115 && target_frameno == -1)
2116 {
2117 /* We told the target to get out of tfind mode, and it did. */
2118 }
2119 else if (target_frameno == -1)
2120 {
2121 /* A request for a non-existent trace frame has failed.
2122 Our response will be different, depending on FROM_TTY:
2123
2124 If FROM_TTY is true, meaning that this command was
2125 typed interactively by the user, then give an error
2126 and DO NOT change the state of traceframe_number etc.
2127
2128 However if FROM_TTY is false, meaning that we're either
2129 in a script, a loop, or a user-defined command, then
2130 DON'T give an error, but DO change the state of
2131 traceframe_number etc. to invalid.
2132
2133 The rationale is that if you typed the command, you
2134 might just have committed a typo or something, and you'd
2135 like to NOT lose your current debugging state. However
2136 if you're in a user-defined command or especially in a
2137 loop, then you need a way to detect that the command
2138 failed WITHOUT aborting. This allows you to write
2139 scripts that search thru the trace buffer until the end,
2140 and then continue on to do something else. */
2141
2142 if (from_tty)
2143 error (_("Target failed to find requested trace frame."));
2144 else
2145 {
2146 if (info_verbose)
2147 printf_filtered ("End of trace buffer.\n");
2148 #if 0 /* dubious now? */
2149 /* The following will not recurse, since it's
2150 special-cased. */
2151 tfind_command ("-1", from_tty);
2152 #endif
2153 }
2154 }
2155
2156 tp = get_tracepoint_by_number_on_target (target_tracept);
2157
2158 reinit_frame_cache ();
2159 target_dcache_invalidate ();
2160
2161 set_tracepoint_num (tp ? tp->number : target_tracept);
2162
2163 if (target_frameno != get_traceframe_number ())
2164 gdb::observers::traceframe_changed.notify (target_frameno, tracepoint_number);
2165
2166 set_current_traceframe (target_frameno);
2167
2168 if (target_frameno == -1)
2169 set_traceframe_context (NULL);
2170 else
2171 set_traceframe_context (get_current_frame ());
2172
2173 if (traceframe_number >= 0)
2174 {
2175 /* Use different branches for MI and CLI to make CLI messages
2176 i18n-eable. */
2177 if (uiout->is_mi_like_p ())
2178 {
2179 uiout->field_string ("found", "1");
2180 uiout->field_signed ("tracepoint", tracepoint_number);
2181 uiout->field_signed ("traceframe", traceframe_number);
2182 }
2183 else
2184 {
2185 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2186 traceframe_number, tracepoint_number);
2187 }
2188 }
2189 else
2190 {
2191 if (uiout->is_mi_like_p ())
2192 uiout->field_string ("found", "0");
2193 else if (type == tfind_number && num == -1)
2194 printf_unfiltered (_("No longer looking at any trace frame\n"));
2195 else /* This case may never occur, check. */
2196 printf_unfiltered (_("No trace frame found\n"));
2197 }
2198
2199 /* If we're in nonstop mode and getting out of looking at trace
2200 frames, there won't be any current frame to go back to and
2201 display. */
2202 if (from_tty
2203 && (has_stack_frames () || traceframe_number >= 0))
2204 {
2205 enum print_what print_what;
2206
2207 /* NOTE: in imitation of the step command, try to determine
2208 whether we have made a transition from one function to
2209 another. If so, we'll print the "stack frame" (ie. the new
2210 function and it's arguments) -- otherwise we'll just show the
2211 new source line. */
2212
2213 if (frame_id_eq (old_frame_id,
2214 get_frame_id (get_current_frame ())))
2215 print_what = SRC_LINE;
2216 else
2217 print_what = SRC_AND_LOC;
2218
2219 print_stack_frame (get_selected_frame (NULL), 1, print_what, 1);
2220 do_displays ();
2221 }
2222 }
2223
2224 /* Error on looking at traceframes while trace is running. */
2225
2226 void
2227 check_trace_running (struct trace_status *status)
2228 {
2229 if (status->running && status->filename == NULL)
2230 error (_("May not look at trace frames while trace is running."));
2231 }
2232
2233 /* trace_find_command takes a trace frame number n,
2234 sends "QTFrame:<n>" to the target,
2235 and accepts a reply that may contain several optional pieces
2236 of information: a frame number, a tracepoint number, and an
2237 indication of whether this is a trap frame or a stepping frame.
2238
2239 The minimal response is just "OK" (which indicates that the
2240 target does not give us a frame number or a tracepoint number).
2241 Instead of that, the target may send us a string containing
2242 any combination of:
2243 F<hexnum> (gives the selected frame number)
2244 T<hexnum> (gives the selected tracepoint number)
2245 */
2246
2247 /* tfind command */
2248 static void
2249 tfind_command_1 (const char *args, int from_tty)
2250 { /* This should only be called with a numeric argument. */
2251 int frameno = -1;
2252
2253 check_trace_running (current_trace_status ());
2254
2255 if (args == 0 || *args == 0)
2256 { /* TFIND with no args means find NEXT trace frame. */
2257 if (traceframe_number == -1)
2258 frameno = 0; /* "next" is first one. */
2259 else
2260 frameno = traceframe_number + 1;
2261 }
2262 else if (0 == strcmp (args, "-"))
2263 {
2264 if (traceframe_number == -1)
2265 error (_("not debugging trace buffer"));
2266 else if (from_tty && traceframe_number == 0)
2267 error (_("already at start of trace buffer"));
2268
2269 frameno = traceframe_number - 1;
2270 }
2271 /* A hack to work around eval's need for fp to have been collected. */
2272 else if (0 == strcmp (args, "-1"))
2273 frameno = -1;
2274 else
2275 frameno = parse_and_eval_long (args);
2276
2277 if (frameno < -1)
2278 error (_("invalid input (%d is less than zero)"), frameno);
2279
2280 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
2281 }
2282
2283 static void
2284 tfind_command (const char *args, int from_tty)
2285 {
2286 tfind_command_1 (args, from_tty);
2287 }
2288
2289 /* tfind end */
2290 static void
2291 tfind_end_command (const char *args, int from_tty)
2292 {
2293 tfind_command_1 ("-1", from_tty);
2294 }
2295
2296 /* tfind start */
2297 static void
2298 tfind_start_command (const char *args, int from_tty)
2299 {
2300 tfind_command_1 ("0", from_tty);
2301 }
2302
2303 /* tfind pc command */
2304 static void
2305 tfind_pc_command (const char *args, int from_tty)
2306 {
2307 CORE_ADDR pc;
2308
2309 check_trace_running (current_trace_status ());
2310
2311 if (args == 0 || *args == 0)
2312 pc = regcache_read_pc (get_current_regcache ());
2313 else
2314 pc = parse_and_eval_address (args);
2315
2316 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
2317 }
2318
2319 /* tfind tracepoint command */
2320 static void
2321 tfind_tracepoint_command (const char *args, int from_tty)
2322 {
2323 int tdp;
2324 struct tracepoint *tp;
2325
2326 check_trace_running (current_trace_status ());
2327
2328 if (args == 0 || *args == 0)
2329 {
2330 if (tracepoint_number == -1)
2331 error (_("No current tracepoint -- please supply an argument."));
2332 else
2333 tdp = tracepoint_number; /* Default is current TDP. */
2334 }
2335 else
2336 tdp = parse_and_eval_long (args);
2337
2338 /* If we have the tracepoint on hand, use the number that the
2339 target knows about (which may be different if we disconnected
2340 and reconnected). */
2341 tp = get_tracepoint (tdp);
2342 if (tp)
2343 tdp = tp->number_on_target;
2344
2345 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
2346 }
2347
2348 /* TFIND LINE command:
2349
2350 This command will take a sourceline for argument, just like BREAK
2351 or TRACE (ie. anything that "decode_line_1" can handle).
2352
2353 With no argument, this command will find the next trace frame
2354 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2355
2356 static void
2357 tfind_line_command (const char *args, int from_tty)
2358 {
2359 check_trace_running (current_trace_status ());
2360
2361 symtab_and_line sal;
2362 if (args == 0 || *args == 0)
2363 {
2364 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2365 }
2366 else
2367 {
2368 std::vector<symtab_and_line> sals
2369 = decode_line_with_current_source (args, DECODE_LINE_FUNFIRSTLINE);
2370 sal = sals[0];
2371 }
2372
2373 if (sal.symtab == 0)
2374 error (_("No line number information available."));
2375
2376 CORE_ADDR start_pc, end_pc;
2377 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
2378 {
2379 if (start_pc == end_pc)
2380 {
2381 printf_filtered ("Line %d of \"%s\"",
2382 sal.line,
2383 symtab_to_filename_for_display (sal.symtab));
2384 wrap_here (" ");
2385 printf_filtered (" is at address ");
2386 print_address (get_current_arch (), start_pc, gdb_stdout);
2387 wrap_here (" ");
2388 printf_filtered (" but contains no code.\n");
2389 sal = find_pc_line (start_pc, 0);
2390 if (sal.line > 0
2391 && find_line_pc_range (sal, &start_pc, &end_pc)
2392 && start_pc != end_pc)
2393 printf_filtered ("Attempting to find line %d instead.\n",
2394 sal.line);
2395 else
2396 error (_("Cannot find a good line."));
2397 }
2398 }
2399 else
2400 /* Is there any case in which we get here, and have an address
2401 which the user would want to see? If we have debugging
2402 symbols and no line numbers? */
2403 error (_("Line number %d is out of range for \"%s\"."),
2404 sal.line, symtab_to_filename_for_display (sal.symtab));
2405
2406 /* Find within range of stated line. */
2407 if (args && *args)
2408 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2409 else
2410 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2411 }
2412
2413 /* tfind range command */
2414 static void
2415 tfind_range_command (const char *args, int from_tty)
2416 {
2417 static CORE_ADDR start, stop;
2418 const char *tmp;
2419
2420 check_trace_running (current_trace_status ());
2421
2422 if (args == 0 || *args == 0)
2423 { /* XXX FIXME: what should default behavior be? */
2424 printf_filtered ("Usage: tfind range STARTADDR, ENDADDR\n");
2425 return;
2426 }
2427
2428 if (0 != (tmp = strchr (args, ',')))
2429 {
2430 std::string start_addr (args, tmp);
2431 ++tmp;
2432 tmp = skip_spaces (tmp);
2433 start = parse_and_eval_address (start_addr.c_str ());
2434 stop = parse_and_eval_address (tmp);
2435 }
2436 else
2437 { /* No explicit end address? */
2438 start = parse_and_eval_address (args);
2439 stop = start + 1; /* ??? */
2440 }
2441
2442 tfind_1 (tfind_range, 0, start, stop, from_tty);
2443 }
2444
2445 /* tfind outside command */
2446 static void
2447 tfind_outside_command (const char *args, int from_tty)
2448 {
2449 CORE_ADDR start, stop;
2450 const char *tmp;
2451
2452 if (current_trace_status ()->running
2453 && current_trace_status ()->filename == NULL)
2454 error (_("May not look at trace frames while trace is running."));
2455
2456 if (args == 0 || *args == 0)
2457 { /* XXX FIXME: what should default behavior be? */
2458 printf_filtered ("Usage: tfind outside STARTADDR, ENDADDR\n");
2459 return;
2460 }
2461
2462 if (0 != (tmp = strchr (args, ',')))
2463 {
2464 std::string start_addr (args, tmp);
2465 ++tmp;
2466 tmp = skip_spaces (tmp);
2467 start = parse_and_eval_address (start_addr.c_str ());
2468 stop = parse_and_eval_address (tmp);
2469 }
2470 else
2471 { /* No explicit end address? */
2472 start = parse_and_eval_address (args);
2473 stop = start + 1; /* ??? */
2474 }
2475
2476 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2477 }
2478
2479 /* info scope command: list the locals for a scope. */
2480 static void
2481 info_scope_command (const char *args_in, int from_tty)
2482 {
2483 struct symbol *sym;
2484 struct bound_minimal_symbol msym;
2485 const struct block *block;
2486 const char *symname;
2487 const char *save_args = args_in;
2488 struct block_iterator iter;
2489 int j, count = 0;
2490 struct gdbarch *gdbarch;
2491 int regno;
2492 const char *args = args_in;
2493
2494 if (args == 0 || *args == 0)
2495 error (_("requires an argument (function, "
2496 "line or *addr) to define a scope"));
2497
2498 event_location_up location = string_to_event_location (&args,
2499 current_language);
2500 std::vector<symtab_and_line> sals
2501 = decode_line_1 (location.get (), DECODE_LINE_FUNFIRSTLINE,
2502 NULL, NULL, 0);
2503 if (sals.empty ())
2504 {
2505 /* Presumably decode_line_1 has already warned. */
2506 return;
2507 }
2508
2509 /* Resolve line numbers to PC. */
2510 resolve_sal_pc (&sals[0]);
2511 block = block_for_pc (sals[0].pc);
2512
2513 while (block != 0)
2514 {
2515 QUIT; /* Allow user to bail out with ^C. */
2516 ALL_BLOCK_SYMBOLS (block, iter, sym)
2517 {
2518 QUIT; /* Allow user to bail out with ^C. */
2519 if (count == 0)
2520 printf_filtered ("Scope for %s:\n", save_args);
2521 count++;
2522
2523 symname = sym->print_name ();
2524 if (symname == NULL || *symname == '\0')
2525 continue; /* Probably botched, certainly useless. */
2526
2527 gdbarch = symbol_arch (sym);
2528
2529 printf_filtered ("Symbol %s is ", symname);
2530
2531 if (SYMBOL_COMPUTED_OPS (sym) != NULL)
2532 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2533 BLOCK_ENTRY_PC (block),
2534 gdb_stdout);
2535 else
2536 {
2537 switch (SYMBOL_CLASS (sym))
2538 {
2539 default:
2540 case LOC_UNDEF: /* Messed up symbol? */
2541 printf_filtered ("a bogus symbol, class %d.\n",
2542 SYMBOL_CLASS (sym));
2543 count--; /* Don't count this one. */
2544 continue;
2545 case LOC_CONST:
2546 printf_filtered ("a constant with value %s (%s)",
2547 plongest (SYMBOL_VALUE (sym)),
2548 hex_string (SYMBOL_VALUE (sym)));
2549 break;
2550 case LOC_CONST_BYTES:
2551 printf_filtered ("constant bytes: ");
2552 if (SYMBOL_TYPE (sym))
2553 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2554 fprintf_filtered (gdb_stdout, " %02x",
2555 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2556 break;
2557 case LOC_STATIC:
2558 printf_filtered ("in static storage at address ");
2559 printf_filtered ("%s", paddress (gdbarch,
2560 SYMBOL_VALUE_ADDRESS (sym)));
2561 break;
2562 case LOC_REGISTER:
2563 /* GDBARCH is the architecture associated with the objfile
2564 the symbol is defined in; the target architecture may be
2565 different, and may provide additional registers. However,
2566 we do not know the target architecture at this point.
2567 We assume the objfile architecture will contain all the
2568 standard registers that occur in debug info in that
2569 objfile. */
2570 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2571 gdbarch);
2572
2573 if (SYMBOL_IS_ARGUMENT (sym))
2574 printf_filtered ("an argument in register $%s",
2575 gdbarch_register_name (gdbarch, regno));
2576 else
2577 printf_filtered ("a local variable in register $%s",
2578 gdbarch_register_name (gdbarch, regno));
2579 break;
2580 case LOC_ARG:
2581 printf_filtered ("an argument at stack/frame offset %s",
2582 plongest (SYMBOL_VALUE (sym)));
2583 break;
2584 case LOC_LOCAL:
2585 printf_filtered ("a local variable at frame offset %s",
2586 plongest (SYMBOL_VALUE (sym)));
2587 break;
2588 case LOC_REF_ARG:
2589 printf_filtered ("a reference argument at offset %s",
2590 plongest (SYMBOL_VALUE (sym)));
2591 break;
2592 case LOC_REGPARM_ADDR:
2593 /* Note comment at LOC_REGISTER. */
2594 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2595 gdbarch);
2596 printf_filtered ("the address of an argument, in register $%s",
2597 gdbarch_register_name (gdbarch, regno));
2598 break;
2599 case LOC_TYPEDEF:
2600 printf_filtered ("a typedef.\n");
2601 continue;
2602 case LOC_LABEL:
2603 printf_filtered ("a label at address ");
2604 printf_filtered ("%s", paddress (gdbarch,
2605 SYMBOL_VALUE_ADDRESS (sym)));
2606 break;
2607 case LOC_BLOCK:
2608 printf_filtered ("a function at address ");
2609 printf_filtered ("%s",
2610 paddress (gdbarch, BLOCK_ENTRY_PC (SYMBOL_BLOCK_VALUE (sym))));
2611 break;
2612 case LOC_UNRESOLVED:
2613 msym = lookup_minimal_symbol (sym->linkage_name (),
2614 NULL, NULL);
2615 if (msym.minsym == NULL)
2616 printf_filtered ("Unresolved Static");
2617 else
2618 {
2619 printf_filtered ("static storage at address ");
2620 printf_filtered ("%s",
2621 paddress (gdbarch,
2622 BMSYMBOL_VALUE_ADDRESS (msym)));
2623 }
2624 break;
2625 case LOC_OPTIMIZED_OUT:
2626 printf_filtered ("optimized out.\n");
2627 continue;
2628 case LOC_COMPUTED:
2629 gdb_assert_not_reached (_("LOC_COMPUTED variable missing a method"));
2630 }
2631 }
2632 if (SYMBOL_TYPE (sym))
2633 {
2634 struct type *t = check_typedef (SYMBOL_TYPE (sym));
2635
2636 printf_filtered (", length %s.\n", pulongest (TYPE_LENGTH (t)));
2637 }
2638 }
2639 if (BLOCK_FUNCTION (block))
2640 break;
2641 else
2642 block = BLOCK_SUPERBLOCK (block);
2643 }
2644 if (count <= 0)
2645 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2646 save_args);
2647 }
2648
2649 /* Helper for trace_dump_command. Dump the action list starting at
2650 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2651 actions of the body of a while-stepping action. STEPPING_FRAME is
2652 set if the current traceframe was determined to be a while-stepping
2653 traceframe. */
2654
2655 static void
2656 trace_dump_actions (struct command_line *action,
2657 int stepping_actions, int stepping_frame,
2658 int from_tty)
2659 {
2660 const char *action_exp, *next_comma;
2661
2662 for (; action != NULL; action = action->next)
2663 {
2664 struct cmd_list_element *cmd;
2665
2666 QUIT; /* Allow user to bail out with ^C. */
2667 action_exp = action->line;
2668 action_exp = skip_spaces (action_exp);
2669
2670 /* The collection actions to be done while stepping are
2671 bracketed by the commands "while-stepping" and "end". */
2672
2673 if (*action_exp == '#') /* comment line */
2674 continue;
2675
2676 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2677 if (cmd == 0)
2678 error (_("Bad action list item: %s"), action_exp);
2679
2680 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2681 {
2682 gdb_assert (action->body_list_1 == nullptr);
2683 trace_dump_actions (action->body_list_0.get (),
2684 1, stepping_frame, from_tty);
2685 }
2686 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2687 {
2688 /* Display the collected data.
2689 For the trap frame, display only what was collected at
2690 the trap. Likewise for stepping frames, display only
2691 what was collected while stepping. This means that the
2692 two boolean variables, STEPPING_FRAME and
2693 STEPPING_ACTIONS should be equal. */
2694 if (stepping_frame == stepping_actions)
2695 {
2696 int trace_string = 0;
2697
2698 if (*action_exp == '/')
2699 action_exp = decode_agent_options (action_exp, &trace_string);
2700
2701 do
2702 { /* Repeat over a comma-separated list. */
2703 QUIT; /* Allow user to bail out with ^C. */
2704 if (*action_exp == ',')
2705 action_exp++;
2706 action_exp = skip_spaces (action_exp);
2707
2708 next_comma = strchr (action_exp, ',');
2709
2710 if (0 == strncasecmp (action_exp, "$reg", 4))
2711 registers_info (NULL, from_tty);
2712 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2713 ;
2714 else if (0 == strncasecmp (action_exp, "$loc", 4))
2715 info_locals_command (NULL, from_tty);
2716 else if (0 == strncasecmp (action_exp, "$arg", 4))
2717 info_args_command (NULL, from_tty);
2718 else
2719 { /* variable */
2720 std::string contents;
2721 const char *exp = action_exp;
2722 if (next_comma != NULL)
2723 {
2724 size_t len = next_comma - action_exp;
2725 contents = std::string (action_exp, len);
2726 exp = contents.c_str ();
2727 }
2728
2729 printf_filtered ("%s = ", exp);
2730 output_command (exp, from_tty);
2731 printf_filtered ("\n");
2732 }
2733 action_exp = next_comma;
2734 }
2735 while (action_exp && *action_exp == ',');
2736 }
2737 }
2738 }
2739 }
2740
2741 /* Return bp_location of the tracepoint associated with the current
2742 traceframe. Set *STEPPING_FRAME_P to 1 if the current traceframe
2743 is a stepping traceframe. */
2744
2745 struct bp_location *
2746 get_traceframe_location (int *stepping_frame_p)
2747 {
2748 struct tracepoint *t;
2749 struct bp_location *tloc;
2750 struct regcache *regcache;
2751
2752 if (tracepoint_number == -1)
2753 error (_("No current trace frame."));
2754
2755 t = get_tracepoint (tracepoint_number);
2756
2757 if (t == NULL)
2758 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2759 tracepoint_number);
2760
2761 /* The current frame is a trap frame if the frame PC is equal to the
2762 tracepoint PC. If not, then the current frame was collected
2763 during single-stepping. */
2764 regcache = get_current_regcache ();
2765
2766 /* If the traceframe's address matches any of the tracepoint's
2767 locations, assume it is a direct hit rather than a while-stepping
2768 frame. (FIXME this is not reliable, should record each frame's
2769 type.) */
2770 for (tloc = t->loc; tloc; tloc = tloc->next)
2771 if (tloc->address == regcache_read_pc (regcache))
2772 {
2773 *stepping_frame_p = 0;
2774 return tloc;
2775 }
2776
2777 /* If this is a stepping frame, we don't know which location
2778 triggered. The first is as good (or bad) a guess as any... */
2779 *stepping_frame_p = 1;
2780 return t->loc;
2781 }
2782
2783 /* Return the default collect actions of a tracepoint T. */
2784
2785 static counted_command_line
2786 all_tracepoint_actions (struct breakpoint *t)
2787 {
2788 counted_command_line actions (nullptr, command_lines_deleter ());
2789
2790 /* If there are default expressions to collect, make up a collect
2791 action and prepend to the action list to encode. Note that since
2792 validation is per-tracepoint (local var "xyz" might be valid for
2793 one tracepoint and not another, etc), we make up the action on
2794 the fly, and don't cache it. */
2795 if (*default_collect)
2796 {
2797 gdb::unique_xmalloc_ptr<char> default_collect_line
2798 (xstrprintf ("collect %s", default_collect));
2799
2800 validate_actionline (default_collect_line.get (), t);
2801 actions.reset (new struct command_line (simple_control,
2802 default_collect_line.release ()),
2803 command_lines_deleter ());
2804 }
2805
2806 return actions;
2807 }
2808
2809 /* The tdump command. */
2810
2811 static void
2812 tdump_command (const char *args, int from_tty)
2813 {
2814 int stepping_frame = 0;
2815 struct bp_location *loc;
2816
2817 /* This throws an error is not inspecting a trace frame. */
2818 loc = get_traceframe_location (&stepping_frame);
2819
2820 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2821 tracepoint_number, traceframe_number);
2822
2823 /* This command only makes sense for the current frame, not the
2824 selected frame. */
2825 scoped_restore_current_thread restore_thread;
2826
2827 select_frame (get_current_frame ());
2828
2829 counted_command_line actions = all_tracepoint_actions (loc->owner);
2830
2831 trace_dump_actions (actions.get (), 0, stepping_frame, from_tty);
2832 trace_dump_actions (breakpoint_commands (loc->owner), 0, stepping_frame,
2833 from_tty);
2834 }
2835
2836 /* Encode a piece of a tracepoint's source-level definition in a form
2837 that is suitable for both protocol and saving in files. */
2838 /* This version does not do multiple encodes for long strings; it should
2839 return an offset to the next piece to encode. FIXME */
2840
2841 int
2842 encode_source_string (int tpnum, ULONGEST addr,
2843 const char *srctype, const char *src,
2844 char *buf, int buf_size)
2845 {
2846 if (80 + strlen (srctype) > buf_size)
2847 error (_("Buffer too small for source encoding"));
2848 sprintf (buf, "%x:%s:%s:%x:%x:",
2849 tpnum, phex_nz (addr, sizeof (addr)),
2850 srctype, 0, (int) strlen (src));
2851 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2852 error (_("Source string too long for buffer"));
2853 bin2hex ((gdb_byte *) src, buf + strlen (buf), strlen (src));
2854 return -1;
2855 }
2856
2857 /* Tell the target what to do with an ongoing tracing run if GDB
2858 disconnects for some reason. */
2859
2860 static void
2861 set_disconnected_tracing (const char *args, int from_tty,
2862 struct cmd_list_element *c)
2863 {
2864 target_set_disconnected_tracing (disconnected_tracing);
2865 }
2866
2867 static void
2868 set_circular_trace_buffer (const char *args, int from_tty,
2869 struct cmd_list_element *c)
2870 {
2871 target_set_circular_trace_buffer (circular_trace_buffer);
2872 }
2873
2874 static void
2875 set_trace_buffer_size (const char *args, int from_tty,
2876 struct cmd_list_element *c)
2877 {
2878 target_set_trace_buffer_size (trace_buffer_size);
2879 }
2880
2881 static void
2882 set_trace_user (const char *args, int from_tty,
2883 struct cmd_list_element *c)
2884 {
2885 int ret;
2886
2887 ret = target_set_trace_notes (trace_user, NULL, NULL);
2888
2889 if (!ret)
2890 warning (_("Target does not support trace notes, user ignored"));
2891 }
2892
2893 static void
2894 set_trace_notes (const char *args, int from_tty,
2895 struct cmd_list_element *c)
2896 {
2897 int ret;
2898
2899 ret = target_set_trace_notes (NULL, trace_notes, NULL);
2900
2901 if (!ret)
2902 warning (_("Target does not support trace notes, note ignored"));
2903 }
2904
2905 static void
2906 set_trace_stop_notes (const char *args, int from_tty,
2907 struct cmd_list_element *c)
2908 {
2909 int ret;
2910
2911 ret = target_set_trace_notes (NULL, NULL, trace_stop_notes);
2912
2913 if (!ret)
2914 warning (_("Target does not support trace notes, stop note ignored"));
2915 }
2916
2917 /* Convert the memory pointed to by mem into hex, placing result in buf.
2918 * Return a pointer to the last char put in buf (null)
2919 * "stolen" from sparc-stub.c
2920 */
2921
2922 static const char hexchars[] = "0123456789abcdef";
2923
2924 static char *
2925 mem2hex (gdb_byte *mem, char *buf, int count)
2926 {
2927 gdb_byte ch;
2928
2929 while (count-- > 0)
2930 {
2931 ch = *mem++;
2932
2933 *buf++ = hexchars[ch >> 4];
2934 *buf++ = hexchars[ch & 0xf];
2935 }
2936
2937 *buf = 0;
2938
2939 return buf;
2940 }
2941
2942 int
2943 get_traceframe_number (void)
2944 {
2945 return traceframe_number;
2946 }
2947
2948 int
2949 get_tracepoint_number (void)
2950 {
2951 return tracepoint_number;
2952 }
2953
2954 /* Make the traceframe NUM be the current trace frame. Does nothing
2955 if NUM is already current. */
2956
2957 void
2958 set_current_traceframe (int num)
2959 {
2960 int newnum;
2961
2962 if (traceframe_number == num)
2963 {
2964 /* Nothing to do. */
2965 return;
2966 }
2967
2968 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
2969
2970 if (newnum != num)
2971 warning (_("could not change traceframe"));
2972
2973 set_traceframe_num (newnum);
2974
2975 /* Changing the traceframe changes our view of registers and of the
2976 frame chain. */
2977 registers_changed ();
2978
2979 clear_traceframe_info ();
2980 }
2981
2982 scoped_restore_current_traceframe::scoped_restore_current_traceframe ()
2983 : m_traceframe_number (traceframe_number)
2984 {}
2985
2986 /* Given a number and address, return an uploaded tracepoint with that
2987 number, creating if necessary. */
2988
2989 struct uploaded_tp *
2990 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
2991 {
2992 struct uploaded_tp *utp;
2993
2994 for (utp = *utpp; utp; utp = utp->next)
2995 if (utp->number == num && utp->addr == addr)
2996 return utp;
2997
2998 utp = new uploaded_tp;
2999 utp->number = num;
3000 utp->addr = addr;
3001 utp->next = *utpp;
3002 *utpp = utp;
3003
3004 return utp;
3005 }
3006
3007 void
3008 free_uploaded_tps (struct uploaded_tp **utpp)
3009 {
3010 struct uploaded_tp *next_one;
3011
3012 while (*utpp)
3013 {
3014 next_one = (*utpp)->next;
3015 delete *utpp;
3016 *utpp = next_one;
3017 }
3018 }
3019
3020 /* Given a number and address, return an uploaded tracepoint with that
3021 number, creating if necessary. */
3022
3023 struct uploaded_tsv *
3024 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3025 {
3026 struct uploaded_tsv *utsv;
3027
3028 for (utsv = *utsvp; utsv; utsv = utsv->next)
3029 if (utsv->number == num)
3030 return utsv;
3031
3032 utsv = XCNEW (struct uploaded_tsv);
3033 utsv->number = num;
3034 utsv->next = *utsvp;
3035 *utsvp = utsv;
3036
3037 return utsv;
3038 }
3039
3040 void
3041 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3042 {
3043 struct uploaded_tsv *next_one;
3044
3045 while (*utsvp)
3046 {
3047 next_one = (*utsvp)->next;
3048 xfree (*utsvp);
3049 *utsvp = next_one;
3050 }
3051 }
3052
3053 /* FIXME this function is heuristic and will miss the cases where the
3054 conditional is semantically identical but differs in whitespace,
3055 such as "x == 0" vs "x==0". */
3056
3057 static int
3058 cond_string_is_same (char *str1, char *str2)
3059 {
3060 if (str1 == NULL || str2 == NULL)
3061 return (str1 == str2);
3062
3063 return (strcmp (str1, str2) == 0);
3064 }
3065
3066 /* Look for an existing tracepoint that seems similar enough to the
3067 uploaded one. Enablement isn't compared, because the user can
3068 toggle that freely, and may have done so in anticipation of the
3069 next trace run. Return the location of matched tracepoint. */
3070
3071 static struct bp_location *
3072 find_matching_tracepoint_location (struct uploaded_tp *utp)
3073 {
3074 struct bp_location *loc;
3075
3076 for (breakpoint *b : all_tracepoints ())
3077 {
3078 struct tracepoint *t = (struct tracepoint *) b;
3079
3080 if (b->type == utp->type
3081 && t->step_count == utp->step
3082 && t->pass_count == utp->pass
3083 && cond_string_is_same (t->cond_string,
3084 utp->cond_string.get ())
3085 /* FIXME also test actions. */
3086 )
3087 {
3088 /* Scan the locations for an address match. */
3089 for (loc = b->loc; loc; loc = loc->next)
3090 {
3091 if (loc->address == utp->addr)
3092 return loc;
3093 }
3094 }
3095 }
3096 return NULL;
3097 }
3098
3099 /* Given a list of tracepoints uploaded from a target, attempt to
3100 match them up with existing tracepoints, and create new ones if not
3101 found. */
3102
3103 void
3104 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3105 {
3106 struct uploaded_tp *utp;
3107 /* A set of tracepoints which are modified. */
3108 std::vector<breakpoint *> modified_tp;
3109
3110 /* Look for GDB tracepoints that match up with our uploaded versions. */
3111 for (utp = *uploaded_tps; utp; utp = utp->next)
3112 {
3113 struct bp_location *loc;
3114 struct tracepoint *t;
3115
3116 loc = find_matching_tracepoint_location (utp);
3117 if (loc)
3118 {
3119 int found = 0;
3120
3121 /* Mark this location as already inserted. */
3122 loc->inserted = 1;
3123 t = (struct tracepoint *) loc->owner;
3124 printf_filtered (_("Assuming tracepoint %d is same "
3125 "as target's tracepoint %d at %s.\n"),
3126 loc->owner->number, utp->number,
3127 paddress (loc->gdbarch, utp->addr));
3128
3129 /* The tracepoint LOC->owner was modified (the location LOC
3130 was marked as inserted in the target). Save it in
3131 MODIFIED_TP if not there yet. The 'breakpoint-modified'
3132 observers will be notified later once for each tracepoint
3133 saved in MODIFIED_TP. */
3134 for (breakpoint *b : modified_tp)
3135 if (b == loc->owner)
3136 {
3137 found = 1;
3138 break;
3139 }
3140 if (!found)
3141 modified_tp.push_back (loc->owner);
3142 }
3143 else
3144 {
3145 t = create_tracepoint_from_upload (utp);
3146 if (t)
3147 printf_filtered (_("Created tracepoint %d for "
3148 "target's tracepoint %d at %s.\n"),
3149 t->number, utp->number,
3150 paddress (get_current_arch (), utp->addr));
3151 else
3152 printf_filtered (_("Failed to create tracepoint for target's "
3153 "tracepoint %d at %s, skipping it.\n"),
3154 utp->number,
3155 paddress (get_current_arch (), utp->addr));
3156 }
3157 /* Whether found or created, record the number used by the
3158 target, to help with mapping target tracepoints back to their
3159 counterparts here. */
3160 if (t)
3161 t->number_on_target = utp->number;
3162 }
3163
3164 /* Notify 'breakpoint-modified' observer that at least one of B's
3165 locations was changed. */
3166 for (breakpoint *b : modified_tp)
3167 gdb::observers::breakpoint_modified.notify (b);
3168
3169 free_uploaded_tps (uploaded_tps);
3170 }
3171
3172 /* Trace state variables don't have much to identify them beyond their
3173 name, so just use that to detect matches. */
3174
3175 static struct trace_state_variable *
3176 find_matching_tsv (struct uploaded_tsv *utsv)
3177 {
3178 if (!utsv->name)
3179 return NULL;
3180
3181 return find_trace_state_variable (utsv->name);
3182 }
3183
3184 static struct trace_state_variable *
3185 create_tsv_from_upload (struct uploaded_tsv *utsv)
3186 {
3187 const char *namebase;
3188 std::string buf;
3189 int try_num = 0;
3190 struct trace_state_variable *tsv;
3191
3192 if (utsv->name)
3193 {
3194 namebase = utsv->name;
3195 buf = namebase;
3196 }
3197 else
3198 {
3199 namebase = "__tsv";
3200 buf = string_printf ("%s_%d", namebase, try_num++);
3201 }
3202
3203 /* Fish for a name that is not in use. */
3204 /* (should check against all internal vars?) */
3205 while (find_trace_state_variable (buf.c_str ()))
3206 buf = string_printf ("%s_%d", namebase, try_num++);
3207
3208 /* We have an available name, create the variable. */
3209 tsv = create_trace_state_variable (buf.c_str ());
3210 tsv->initial_value = utsv->initial_value;
3211 tsv->builtin = utsv->builtin;
3212
3213 gdb::observers::tsv_created.notify (tsv);
3214
3215 return tsv;
3216 }
3217
3218 /* Given a list of uploaded trace state variables, try to match them
3219 up with existing variables, or create additional ones. */
3220
3221 void
3222 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3223 {
3224 struct uploaded_tsv *utsv;
3225 int highest;
3226
3227 /* Most likely some numbers will have to be reassigned as part of
3228 the merge, so clear them all in anticipation. */
3229 for (trace_state_variable &tsv : tvariables)
3230 tsv.number = 0;
3231
3232 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3233 {
3234 struct trace_state_variable *tsv = find_matching_tsv (utsv);
3235 if (tsv)
3236 {
3237 if (info_verbose)
3238 printf_filtered (_("Assuming trace state variable $%s "
3239 "is same as target's variable %d.\n"),
3240 tsv->name.c_str (), utsv->number);
3241 }
3242 else
3243 {
3244 tsv = create_tsv_from_upload (utsv);
3245 if (info_verbose)
3246 printf_filtered (_("Created trace state variable "
3247 "$%s for target's variable %d.\n"),
3248 tsv->name.c_str (), utsv->number);
3249 }
3250 /* Give precedence to numberings that come from the target. */
3251 if (tsv)
3252 tsv->number = utsv->number;
3253 }
3254
3255 /* Renumber everything that didn't get a target-assigned number. */
3256 highest = 0;
3257 for (const trace_state_variable &tsv : tvariables)
3258 highest = std::max (tsv.number, highest);
3259
3260 ++highest;
3261 for (trace_state_variable &tsv : tvariables)
3262 if (tsv.number == 0)
3263 tsv.number = highest++;
3264
3265 free_uploaded_tsvs (uploaded_tsvs);
3266 }
3267
3268 /* Parse the part of trace status syntax that is shared between
3269 the remote protocol and the trace file reader. */
3270
3271 void
3272 parse_trace_status (const char *line, struct trace_status *ts)
3273 {
3274 const char *p = line, *p1, *p2, *p3, *p_temp;
3275 int end;
3276 ULONGEST val;
3277
3278 ts->running_known = 1;
3279 ts->running = (*p++ == '1');
3280 ts->stop_reason = trace_stop_reason_unknown;
3281 xfree (ts->stop_desc);
3282 ts->stop_desc = NULL;
3283 ts->traceframe_count = -1;
3284 ts->traceframes_created = -1;
3285 ts->buffer_free = -1;
3286 ts->buffer_size = -1;
3287 ts->disconnected_tracing = 0;
3288 ts->circular_buffer = 0;
3289 xfree (ts->user_name);
3290 ts->user_name = NULL;
3291 xfree (ts->notes);
3292 ts->notes = NULL;
3293 ts->start_time = ts->stop_time = 0;
3294
3295 while (*p++)
3296 {
3297 p1 = strchr (p, ':');
3298 if (p1 == NULL)
3299 error (_("Malformed trace status, at %s\n\
3300 Status line: '%s'\n"), p, line);
3301 p3 = strchr (p, ';');
3302 if (p3 == NULL)
3303 p3 = p + strlen (p);
3304 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3305 {
3306 p = unpack_varlen_hex (++p1, &val);
3307 ts->stop_reason = trace_buffer_full;
3308 }
3309 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3310 {
3311 p = unpack_varlen_hex (++p1, &val);
3312 ts->stop_reason = trace_never_run;
3313 }
3314 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3315 p1 - p) == 0)
3316 {
3317 p = unpack_varlen_hex (++p1, &val);
3318 ts->stop_reason = tracepoint_passcount;
3319 ts->stopping_tracepoint = val;
3320 }
3321 else if (strncmp (p, stop_reason_names[trace_stop_command], p1 - p) == 0)
3322 {
3323 p2 = strchr (++p1, ':');
3324 if (!p2 || p2 > p3)
3325 {
3326 /*older style*/
3327 p2 = p1;
3328 }
3329 else if (p2 != p1)
3330 {
3331 ts->stop_desc = (char *) xmalloc (strlen (line));
3332 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3333 ts->stop_desc[end] = '\0';
3334 }
3335 else
3336 ts->stop_desc = xstrdup ("");
3337
3338 p = unpack_varlen_hex (++p2, &val);
3339 ts->stop_reason = trace_stop_command;
3340 }
3341 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3342 {
3343 p = unpack_varlen_hex (++p1, &val);
3344 ts->stop_reason = trace_disconnected;
3345 }
3346 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3347 {
3348 p2 = strchr (++p1, ':');
3349 if (p2 != p1)
3350 {
3351 ts->stop_desc = (char *) xmalloc ((p2 - p1) / 2 + 1);
3352 end = hex2bin (p1, (gdb_byte *) ts->stop_desc, (p2 - p1) / 2);
3353 ts->stop_desc[end] = '\0';
3354 }
3355 else
3356 ts->stop_desc = xstrdup ("");
3357
3358 p = unpack_varlen_hex (++p2, &val);
3359 ts->stopping_tracepoint = val;
3360 ts->stop_reason = tracepoint_error;
3361 }
3362 else if (strncmp (p, "tframes", p1 - p) == 0)
3363 {
3364 p = unpack_varlen_hex (++p1, &val);
3365 ts->traceframe_count = val;
3366 }
3367 else if (strncmp (p, "tcreated", p1 - p) == 0)
3368 {
3369 p = unpack_varlen_hex (++p1, &val);
3370 ts->traceframes_created = val;
3371 }
3372 else if (strncmp (p, "tfree", p1 - p) == 0)
3373 {
3374 p = unpack_varlen_hex (++p1, &val);
3375 ts->buffer_free = val;
3376 }
3377 else if (strncmp (p, "tsize", p1 - p) == 0)
3378 {
3379 p = unpack_varlen_hex (++p1, &val);
3380 ts->buffer_size = val;
3381 }
3382 else if (strncmp (p, "disconn", p1 - p) == 0)
3383 {
3384 p = unpack_varlen_hex (++p1, &val);
3385 ts->disconnected_tracing = val;
3386 }
3387 else if (strncmp (p, "circular", p1 - p) == 0)
3388 {
3389 p = unpack_varlen_hex (++p1, &val);
3390 ts->circular_buffer = val;
3391 }
3392 else if (strncmp (p, "starttime", p1 - p) == 0)
3393 {
3394 p = unpack_varlen_hex (++p1, &val);
3395 ts->start_time = val;
3396 }
3397 else if (strncmp (p, "stoptime", p1 - p) == 0)
3398 {
3399 p = unpack_varlen_hex (++p1, &val);
3400 ts->stop_time = val;
3401 }
3402 else if (strncmp (p, "username", p1 - p) == 0)
3403 {
3404 ++p1;
3405 ts->user_name = (char *) xmalloc (strlen (p) / 2);
3406 end = hex2bin (p1, (gdb_byte *) ts->user_name, (p3 - p1) / 2);
3407 ts->user_name[end] = '\0';
3408 p = p3;
3409 }
3410 else if (strncmp (p, "notes", p1 - p) == 0)
3411 {
3412 ++p1;
3413 ts->notes = (char *) xmalloc (strlen (p) / 2);
3414 end = hex2bin (p1, (gdb_byte *) ts->notes, (p3 - p1) / 2);
3415 ts->notes[end] = '\0';
3416 p = p3;
3417 }
3418 else
3419 {
3420 /* Silently skip unknown optional info. */
3421 p_temp = strchr (p1 + 1, ';');
3422 if (p_temp)
3423 p = p_temp;
3424 else
3425 /* Must be at the end. */
3426 break;
3427 }
3428 }
3429 }
3430
3431 void
3432 parse_tracepoint_status (const char *p, struct breakpoint *bp,
3433 struct uploaded_tp *utp)
3434 {
3435 ULONGEST uval;
3436 struct tracepoint *tp = (struct tracepoint *) bp;
3437
3438 p = unpack_varlen_hex (p, &uval);
3439 if (tp)
3440 tp->hit_count += uval;
3441 else
3442 utp->hit_count += uval;
3443 p = unpack_varlen_hex (p + 1, &uval);
3444 if (tp)
3445 tp->traceframe_usage += uval;
3446 else
3447 utp->traceframe_usage += uval;
3448 /* Ignore any extra, allowing for future extensions. */
3449 }
3450
3451 /* Given a line of text defining a part of a tracepoint, parse it into
3452 an "uploaded tracepoint". */
3453
3454 void
3455 parse_tracepoint_definition (const char *line, struct uploaded_tp **utpp)
3456 {
3457 const char *p;
3458 char piece;
3459 ULONGEST num, addr, step, pass, orig_size, xlen, start;
3460 int enabled, end;
3461 enum bptype type;
3462 const char *srctype;
3463 char *buf;
3464 struct uploaded_tp *utp = NULL;
3465
3466 p = line;
3467 /* Both tracepoint and action definitions start with the same number
3468 and address sequence. */
3469 piece = *p++;
3470 p = unpack_varlen_hex (p, &num);
3471 p++; /* skip a colon */
3472 p = unpack_varlen_hex (p, &addr);
3473 p++; /* skip a colon */
3474 if (piece == 'T')
3475 {
3476 gdb::unique_xmalloc_ptr<char[]> cond;
3477
3478 enabled = (*p++ == 'E');
3479 p++; /* skip a colon */
3480 p = unpack_varlen_hex (p, &step);
3481 p++; /* skip a colon */
3482 p = unpack_varlen_hex (p, &pass);
3483 type = bp_tracepoint;
3484 /* Thumb through optional fields. */
3485 while (*p == ':')
3486 {
3487 p++; /* skip a colon */
3488 if (*p == 'F')
3489 {
3490 type = bp_fast_tracepoint;
3491 p++;
3492 p = unpack_varlen_hex (p, &orig_size);
3493 }
3494 else if (*p == 'S')
3495 {
3496 type = bp_static_tracepoint;
3497 p++;
3498 }
3499 else if (*p == 'X')
3500 {
3501 p++;
3502 p = unpack_varlen_hex (p, &xlen);
3503 p++; /* skip a comma */
3504 cond.reset ((char *) xmalloc (2 * xlen + 1));
3505 strncpy (&cond[0], p, 2 * xlen);
3506 cond[2 * xlen] = '\0';
3507 p += 2 * xlen;
3508 }
3509 else
3510 warning (_("Unrecognized char '%c' in tracepoint "
3511 "definition, skipping rest"), *p);
3512 }
3513 utp = get_uploaded_tp (num, addr, utpp);
3514 utp->type = type;
3515 utp->enabled = enabled;
3516 utp->step = step;
3517 utp->pass = pass;
3518 utp->cond = std::move (cond);
3519 }
3520 else if (piece == 'A')
3521 {
3522 utp = get_uploaded_tp (num, addr, utpp);
3523 utp->actions.emplace_back (xstrdup (p));
3524 }
3525 else if (piece == 'S')
3526 {
3527 utp = get_uploaded_tp (num, addr, utpp);
3528 utp->step_actions.emplace_back (xstrdup (p));
3529 }
3530 else if (piece == 'Z')
3531 {
3532 /* Parse a chunk of source form definition. */
3533 utp = get_uploaded_tp (num, addr, utpp);
3534 srctype = p;
3535 p = strchr (p, ':');
3536 p++; /* skip a colon */
3537 p = unpack_varlen_hex (p, &start);
3538 p++; /* skip a colon */
3539 p = unpack_varlen_hex (p, &xlen);
3540 p++; /* skip a colon */
3541
3542 buf = (char *) alloca (strlen (line));
3543
3544 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3545 buf[end] = '\0';
3546
3547 if (startswith (srctype, "at:"))
3548 utp->at_string.reset (xstrdup (buf));
3549 else if (startswith (srctype, "cond:"))
3550 utp->cond_string.reset (xstrdup (buf));
3551 else if (startswith (srctype, "cmd:"))
3552 utp->cmd_strings.emplace_back (xstrdup (buf));
3553 }
3554 else if (piece == 'V')
3555 {
3556 utp = get_uploaded_tp (num, addr, utpp);
3557
3558 parse_tracepoint_status (p, NULL, utp);
3559 }
3560 else
3561 {
3562 /* Don't error out, the target might be sending us optional
3563 info that we don't care about. */
3564 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
3565 }
3566 }
3567
3568 /* Convert a textual description of a trace state variable into an
3569 uploaded object. */
3570
3571 void
3572 parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp)
3573 {
3574 const char *p;
3575 char *buf;
3576 ULONGEST num, initval, builtin;
3577 int end;
3578 struct uploaded_tsv *utsv = NULL;
3579
3580 buf = (char *) alloca (strlen (line));
3581
3582 p = line;
3583 p = unpack_varlen_hex (p, &num);
3584 p++; /* skip a colon */
3585 p = unpack_varlen_hex (p, &initval);
3586 p++; /* skip a colon */
3587 p = unpack_varlen_hex (p, &builtin);
3588 p++; /* skip a colon */
3589 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3590 buf[end] = '\0';
3591
3592 utsv = get_uploaded_tsv (num, utsvp);
3593 utsv->initial_value = initval;
3594 utsv->builtin = builtin;
3595 utsv->name = xstrdup (buf);
3596 }
3597
3598 /* Given a line of text defining a static tracepoint marker, parse it
3599 into a "static tracepoint marker" object. Throws an error is
3600 parsing fails. If PP is non-null, it points to one past the end of
3601 the parsed marker definition. */
3602
3603 void
3604 parse_static_tracepoint_marker_definition (const char *line, const char **pp,
3605 static_tracepoint_marker *marker)
3606 {
3607 const char *p, *endp;
3608 ULONGEST addr;
3609
3610 p = line;
3611 p = unpack_varlen_hex (p, &addr);
3612 p++; /* skip a colon */
3613
3614 marker->gdbarch = target_gdbarch ();
3615 marker->address = (CORE_ADDR) addr;
3616
3617 endp = strchr (p, ':');
3618 if (endp == NULL)
3619 error (_("bad marker definition: %s"), line);
3620
3621 marker->str_id = hex2str (p, (endp - p) / 2);
3622
3623 p = endp;
3624 p++; /* skip a colon */
3625
3626 /* This definition may be followed by another one, separated by a comma. */
3627 int hex_len;
3628 endp = strchr (p, ',');
3629 if (endp != nullptr)
3630 hex_len = endp - p;
3631 else
3632 hex_len = strlen (p);
3633
3634 marker->extra = hex2str (p, hex_len / 2);
3635
3636 if (pp != nullptr)
3637 *pp = p + hex_len;
3638 }
3639
3640 /* Print MARKER to gdb_stdout. */
3641
3642 static void
3643 print_one_static_tracepoint_marker (int count,
3644 const static_tracepoint_marker &marker)
3645 {
3646 struct symbol *sym;
3647
3648 char wrap_indent[80];
3649 char extra_field_indent[80];
3650 struct ui_out *uiout = current_uiout;
3651
3652 symtab_and_line sal;
3653 sal.pc = marker.address;
3654
3655 std::vector<breakpoint *> tracepoints
3656 = static_tracepoints_here (marker.address);
3657
3658 ui_out_emit_tuple tuple_emitter (uiout, "marker");
3659
3660 /* A counter field to help readability. This is not a stable
3661 identifier! */
3662 uiout->field_signed ("count", count);
3663
3664 uiout->field_string ("marker-id", marker.str_id.c_str ());
3665
3666 uiout->field_fmt ("enabled", "%c",
3667 !tracepoints.empty () ? 'y' : 'n');
3668 uiout->spaces (2);
3669
3670 strcpy (wrap_indent, " ");
3671
3672 if (gdbarch_addr_bit (marker.gdbarch) <= 32)
3673 strcat (wrap_indent, " ");
3674 else
3675 strcat (wrap_indent, " ");
3676
3677 strcpy (extra_field_indent, " ");
3678
3679 uiout->field_core_addr ("addr", marker.gdbarch, marker.address);
3680
3681 sal = find_pc_line (marker.address, 0);
3682 sym = find_pc_sect_function (marker.address, NULL);
3683 if (sym)
3684 {
3685 uiout->text ("in ");
3686 uiout->field_string ("func", sym->print_name (),
3687 function_name_style.style ());
3688 uiout->wrap_hint (wrap_indent);
3689 uiout->text (" at ");
3690 }
3691 else
3692 uiout->field_skip ("func");
3693
3694 if (sal.symtab != NULL)
3695 {
3696 uiout->field_string ("file",
3697 symtab_to_filename_for_display (sal.symtab),
3698 file_name_style.style ());
3699 uiout->text (":");
3700
3701 if (uiout->is_mi_like_p ())
3702 {
3703 const char *fullname = symtab_to_fullname (sal.symtab);
3704
3705 uiout->field_string ("fullname", fullname);
3706 }
3707 else
3708 uiout->field_skip ("fullname");
3709
3710 uiout->field_signed ("line", sal.line);
3711 }
3712 else
3713 {
3714 uiout->field_skip ("fullname");
3715 uiout->field_skip ("line");
3716 }
3717
3718 uiout->text ("\n");
3719 uiout->text (extra_field_indent);
3720 uiout->text (_("Data: \""));
3721 uiout->field_string ("extra-data", marker.extra.c_str ());
3722 uiout->text ("\"\n");
3723
3724 if (!tracepoints.empty ())
3725 {
3726 int ix;
3727
3728 {
3729 ui_out_emit_tuple inner_tuple_emitter (uiout, "tracepoints-at");
3730
3731 uiout->text (extra_field_indent);
3732 uiout->text (_("Probed by static tracepoints: "));
3733 for (ix = 0; ix < tracepoints.size (); ix++)
3734 {
3735 if (ix > 0)
3736 uiout->text (", ");
3737 uiout->text ("#");
3738 uiout->field_signed ("tracepoint-id", tracepoints[ix]->number);
3739 }
3740 }
3741
3742 if (uiout->is_mi_like_p ())
3743 uiout->field_signed ("number-of-tracepoints", tracepoints.size ());
3744 else
3745 uiout->text ("\n");
3746 }
3747 }
3748
3749 static void
3750 info_static_tracepoint_markers_command (const char *arg, int from_tty)
3751 {
3752 struct ui_out *uiout = current_uiout;
3753 std::vector<static_tracepoint_marker> markers
3754 = target_static_tracepoint_markers_by_strid (NULL);
3755
3756 /* We don't have to check target_can_use_agent and agent's capability on
3757 static tracepoint here, in order to be compatible with older GDBserver.
3758 We don't check USE_AGENT is true or not, because static tracepoints
3759 don't work without in-process agent, so we don't bother users to type
3760 `set agent on' when to use static tracepoint. */
3761
3762 ui_out_emit_table table_emitter (uiout, 5, -1,
3763 "StaticTracepointMarkersTable");
3764
3765 uiout->table_header (7, ui_left, "counter", "Cnt");
3766
3767 uiout->table_header (40, ui_left, "marker-id", "ID");
3768
3769 uiout->table_header (3, ui_left, "enabled", "Enb");
3770 if (gdbarch_addr_bit (target_gdbarch ()) <= 32)
3771 uiout->table_header (10, ui_left, "addr", "Address");
3772 else
3773 uiout->table_header (18, ui_left, "addr", "Address");
3774 uiout->table_header (40, ui_noalign, "what", "What");
3775
3776 uiout->table_body ();
3777
3778 for (int i = 0; i < markers.size (); i++)
3779 print_one_static_tracepoint_marker (i + 1, markers[i]);
3780 }
3781
3782 /* The $_sdata convenience variable is a bit special. We don't know
3783 for sure type of the value until we actually have a chance to fetch
3784 the data --- the size of the object depends on what has been
3785 collected. We solve this by making $_sdata be an internalvar that
3786 creates a new value on access. */
3787
3788 /* Return a new value with the correct type for the sdata object of
3789 the current trace frame. Return a void value if there's no object
3790 available. */
3791
3792 static struct value *
3793 sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var,
3794 void *ignore)
3795 {
3796 /* We need to read the whole object before we know its size. */
3797 gdb::optional<gdb::byte_vector> buf
3798 = target_read_alloc (current_top_target (), TARGET_OBJECT_STATIC_TRACE_DATA,
3799 NULL);
3800 if (buf)
3801 {
3802 struct value *v;
3803 struct type *type;
3804
3805 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
3806 buf->size ());
3807 v = allocate_value (type);
3808 memcpy (value_contents_raw (v), buf->data (), buf->size ());
3809 return v;
3810 }
3811 else
3812 return allocate_value (builtin_type (gdbarch)->builtin_void);
3813 }
3814
3815 #if !defined(HAVE_LIBEXPAT)
3816
3817 struct std::unique_ptr<traceframe_info>
3818 parse_traceframe_info (const char *tframe_info)
3819 {
3820 static int have_warned;
3821
3822 if (!have_warned)
3823 {
3824 have_warned = 1;
3825 warning (_("Can not parse XML trace frame info; XML support "
3826 "was disabled at compile time"));
3827 }
3828
3829 return NULL;
3830 }
3831
3832 #else /* HAVE_LIBEXPAT */
3833
3834 #include "xml-support.h"
3835
3836 /* Handle the start of a <memory> element. */
3837
3838 static void
3839 traceframe_info_start_memory (struct gdb_xml_parser *parser,
3840 const struct gdb_xml_element *element,
3841 void *user_data,
3842 std::vector<gdb_xml_value> &attributes)
3843 {
3844 struct traceframe_info *info = (struct traceframe_info *) user_data;
3845 ULONGEST *start_p, *length_p;
3846
3847 start_p
3848 = (ULONGEST *) xml_find_attribute (attributes, "start")->value.get ();
3849 length_p
3850 = (ULONGEST *) xml_find_attribute (attributes, "length")->value.get ();
3851
3852 info->memory.emplace_back (*start_p, *length_p);
3853 }
3854
3855 /* Handle the start of a <tvar> element. */
3856
3857 static void
3858 traceframe_info_start_tvar (struct gdb_xml_parser *parser,
3859 const struct gdb_xml_element *element,
3860 void *user_data,
3861 std::vector<gdb_xml_value> &attributes)
3862 {
3863 struct traceframe_info *info = (struct traceframe_info *) user_data;
3864 const char *id_attrib
3865 = (const char *) xml_find_attribute (attributes, "id")->value.get ();
3866 int id = gdb_xml_parse_ulongest (parser, id_attrib);
3867
3868 info->tvars.push_back (id);
3869 }
3870
3871 /* The allowed elements and attributes for an XML memory map. */
3872
3873 static const struct gdb_xml_attribute memory_attributes[] = {
3874 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
3875 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
3876 { NULL, GDB_XML_AF_NONE, NULL, NULL }
3877 };
3878
3879 static const struct gdb_xml_attribute tvar_attributes[] = {
3880 { "id", GDB_XML_AF_NONE, NULL, NULL },
3881 { NULL, GDB_XML_AF_NONE, NULL, NULL }
3882 };
3883
3884 static const struct gdb_xml_element traceframe_info_children[] = {
3885 { "memory", memory_attributes, NULL,
3886 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
3887 traceframe_info_start_memory, NULL },
3888 { "tvar", tvar_attributes, NULL,
3889 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
3890 traceframe_info_start_tvar, NULL },
3891 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
3892 };
3893
3894 static const struct gdb_xml_element traceframe_info_elements[] = {
3895 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
3896 NULL, NULL },
3897 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
3898 };
3899
3900 /* Parse a traceframe-info XML document. */
3901
3902 traceframe_info_up
3903 parse_traceframe_info (const char *tframe_info)
3904 {
3905 traceframe_info_up result (new traceframe_info);
3906
3907 if (gdb_xml_parse_quick (_("trace frame info"),
3908 "traceframe-info.dtd", traceframe_info_elements,
3909 tframe_info, result.get ()) == 0)
3910 return result;
3911
3912 return NULL;
3913 }
3914
3915 #endif /* HAVE_LIBEXPAT */
3916
3917 /* Returns the traceframe_info object for the current traceframe.
3918 This is where we avoid re-fetching the object from the target if we
3919 already have it cached. */
3920
3921 struct traceframe_info *
3922 get_traceframe_info (void)
3923 {
3924 if (current_traceframe_info == NULL)
3925 current_traceframe_info = target_traceframe_info ();
3926
3927 return current_traceframe_info.get ();
3928 }
3929
3930 /* If the target supports the query, return in RESULT the set of
3931 collected memory in the current traceframe, found within the LEN
3932 bytes range starting at MEMADDR. Returns true if the target
3933 supports the query, otherwise returns false, and RESULT is left
3934 undefined. */
3935
3936 int
3937 traceframe_available_memory (std::vector<mem_range> *result,
3938 CORE_ADDR memaddr, ULONGEST len)
3939 {
3940 struct traceframe_info *info = get_traceframe_info ();
3941
3942 if (info != NULL)
3943 {
3944 result->clear ();
3945
3946 for (mem_range &r : info->memory)
3947 if (mem_ranges_overlap (r.start, r.length, memaddr, len))
3948 {
3949 ULONGEST lo1, hi1, lo2, hi2;
3950
3951 lo1 = memaddr;
3952 hi1 = memaddr + len;
3953
3954 lo2 = r.start;
3955 hi2 = r.start + r.length;
3956
3957 CORE_ADDR start = std::max (lo1, lo2);
3958 int length = std::min (hi1, hi2) - start;
3959
3960 result->emplace_back (start, length);
3961 }
3962
3963 normalize_mem_ranges (result);
3964 return 1;
3965 }
3966
3967 return 0;
3968 }
3969
3970 /* Implementation of `sdata' variable. */
3971
3972 static const struct internalvar_funcs sdata_funcs =
3973 {
3974 sdata_make_value,
3975 NULL,
3976 NULL
3977 };
3978
3979 /* See tracepoint.h. */
3980 cmd_list_element *while_stepping_cmd_element = nullptr;
3981
3982 /* module initialization */
3983 void _initialize_tracepoint ();
3984 void
3985 _initialize_tracepoint ()
3986 {
3987 struct cmd_list_element *c;
3988
3989 /* Explicitly create without lookup, since that tries to create a
3990 value with a void typed value, and when we get here, gdbarch
3991 isn't initialized yet. At this point, we're quite sure there
3992 isn't another convenience variable of the same name. */
3993 create_internalvar_type_lazy ("_sdata", &sdata_funcs, NULL);
3994
3995 traceframe_number = -1;
3996 tracepoint_number = -1;
3997
3998 add_info ("scope", info_scope_command,
3999 _("List the variables local to a scope."));
4000
4001 add_cmd ("tracepoints", class_trace,
4002 _("Tracing of program execution without stopping the program."),
4003 &cmdlist);
4004
4005 add_com ("tdump", class_trace, tdump_command,
4006 _("Print everything collected at the current tracepoint."));
4007
4008 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4009 Define a trace state variable.\n\
4010 Argument is a $-prefixed name, optionally followed\n\
4011 by '=' and an expression that sets the initial value\n\
4012 at the start of tracing."));
4013 set_cmd_completer (c, expression_completer);
4014
4015 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4016 Delete one or more trace state variables.\n\
4017 Arguments are the names of the variables to delete.\n\
4018 If no arguments are supplied, delete all variables."), &deletelist);
4019 /* FIXME add a trace variable completer. */
4020
4021 add_info ("tvariables", info_tvariables_command, _("\
4022 Status of trace state variables and their values."));
4023
4024 add_info ("static-tracepoint-markers",
4025 info_static_tracepoint_markers_command, _("\
4026 List target static tracepoints markers."));
4027
4028 add_prefix_cmd ("tfind", class_trace, tfind_command, _("\
4029 Select a trace frame.\n\
4030 No argument means forward by one frame; '-' means backward by one frame."),
4031 &tfindlist, "tfind ", 1, &cmdlist);
4032
4033 add_cmd ("outside", class_trace, tfind_outside_command, _("\
4034 Select a trace frame whose PC is outside the given range (exclusive).\n\
4035 Usage: tfind outside ADDR1, ADDR2"),
4036 &tfindlist);
4037
4038 add_cmd ("range", class_trace, tfind_range_command, _("\
4039 Select a trace frame whose PC is in the given range (inclusive).\n\
4040 Usage: tfind range ADDR1, ADDR2"),
4041 &tfindlist);
4042
4043 add_cmd ("line", class_trace, tfind_line_command, _("\
4044 Select a trace frame by source line.\n\
4045 Argument can be a line number (with optional source file),\n\
4046 a function name, or '*' followed by an address.\n\
4047 Default argument is 'the next source line that was traced'."),
4048 &tfindlist);
4049
4050 add_cmd ("tracepoint", class_trace, tfind_tracepoint_command, _("\
4051 Select a trace frame by tracepoint number.\n\
4052 Default is the tracepoint for the current trace frame."),
4053 &tfindlist);
4054
4055 add_cmd ("pc", class_trace, tfind_pc_command, _("\
4056 Select a trace frame by PC.\n\
4057 Default is the current PC, or the PC of the current trace frame."),
4058 &tfindlist);
4059
4060 add_cmd ("end", class_trace, tfind_end_command, _("\
4061 De-select any trace frame and resume 'live' debugging."),
4062 &tfindlist);
4063
4064 add_alias_cmd ("none", "end", class_trace, 0, &tfindlist);
4065
4066 add_cmd ("start", class_trace, tfind_start_command,
4067 _("Select the first trace frame in the trace buffer."),
4068 &tfindlist);
4069
4070 add_com ("tstatus", class_trace, tstatus_command,
4071 _("Display the status of the current trace data collection."));
4072
4073 add_com ("tstop", class_trace, tstop_command, _("\
4074 Stop trace data collection.\n\
4075 Usage: tstop [NOTES]...\n\
4076 Any arguments supplied are recorded with the trace as a stop reason and\n\
4077 reported by tstatus (if the target supports trace notes)."));
4078
4079 add_com ("tstart", class_trace, tstart_command, _("\
4080 Start trace data collection.\n\
4081 Usage: tstart [NOTES]...\n\
4082 Any arguments supplied are recorded with the trace as a note and\n\
4083 reported by tstatus (if the target supports trace notes)."));
4084
4085 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4086 Ends a list of commands or actions.\n\
4087 Several GDB commands allow you to enter a list of commands or actions.\n\
4088 Entering \"end\" on a line by itself is the normal way to terminate\n\
4089 such a list.\n\n\
4090 Note: the \"end\" command cannot be used at the gdb prompt."));
4091
4092 while_stepping_cmd_element = add_com ("while-stepping", class_trace,
4093 while_stepping_pseudocommand, _("\
4094 Specify single-stepping behavior at a tracepoint.\n\
4095 Argument is number of instructions to trace in single-step mode\n\
4096 following the tracepoint. This command is normally followed by\n\
4097 one or more \"collect\" commands, to specify what to collect\n\
4098 while single-stepping.\n\n\
4099 Note: this command can only be used in a tracepoint \"actions\" list."));
4100
4101 add_com_alias ("ws", "while-stepping", class_trace, 0);
4102 add_com_alias ("stepping", "while-stepping", class_trace, 0);
4103
4104 add_com ("collect", class_trace, collect_pseudocommand, _("\
4105 Specify one or more data items to be collected at a tracepoint.\n\
4106 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4107 collect all data (variables, registers) referenced by that expression.\n\
4108 Also accepts the following special arguments:\n\
4109 $regs -- all registers.\n\
4110 $args -- all function arguments.\n\
4111 $locals -- all variables local to the block/function scope.\n\
4112 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
4113 Note: this command can only be used in a tracepoint \"actions\" list."));
4114
4115 add_com ("teval", class_trace, teval_pseudocommand, _("\
4116 Specify one or more expressions to be evaluated at a tracepoint.\n\
4117 Accepts a comma-separated list of (one or more) expressions.\n\
4118 The result of each evaluation will be discarded.\n\
4119 Note: this command can only be used in a tracepoint \"actions\" list."));
4120
4121 add_com ("actions", class_trace, actions_command, _("\
4122 Specify the actions to be taken at a tracepoint.\n\
4123 Tracepoint actions may include collecting of specified data,\n\
4124 single-stepping, or enabling/disabling other tracepoints,\n\
4125 depending on target's capabilities."));
4126
4127 default_collect = xstrdup ("");
4128 add_setshow_string_cmd ("default-collect", class_trace,
4129 &default_collect, _("\
4130 Set the list of expressions to collect by default."), _("\
4131 Show the list of expressions to collect by default."), NULL,
4132 NULL, NULL,
4133 &setlist, &showlist);
4134
4135 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4136 &disconnected_tracing, _("\
4137 Set whether tracing continues after GDB disconnects."), _("\
4138 Show whether tracing continues after GDB disconnects."), _("\
4139 Use this to continue a tracing run even if GDB disconnects\n\
4140 or detaches from the target. You can reconnect later and look at\n\
4141 trace data collected in the meantime."),
4142 set_disconnected_tracing,
4143 NULL,
4144 &setlist,
4145 &showlist);
4146
4147 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4148 &circular_trace_buffer, _("\
4149 Set target's use of circular trace buffer."), _("\
4150 Show target's use of circular trace buffer."), _("\
4151 Use this to make the trace buffer into a circular buffer,\n\
4152 which will discard traceframes (oldest first) instead of filling\n\
4153 up and stopping the trace run."),
4154 set_circular_trace_buffer,
4155 NULL,
4156 &setlist,
4157 &showlist);
4158
4159 add_setshow_zuinteger_unlimited_cmd ("trace-buffer-size", no_class,
4160 &trace_buffer_size, _("\
4161 Set requested size of trace buffer."), _("\
4162 Show requested size of trace buffer."), _("\
4163 Use this to choose a size for the trace buffer. Some targets\n\
4164 may have fixed or limited buffer sizes. Specifying \"unlimited\" or -1\n\
4165 disables any attempt to set the buffer size and lets the target choose."),
4166 set_trace_buffer_size, NULL,
4167 &setlist, &showlist);
4168
4169 add_setshow_string_cmd ("trace-user", class_trace,
4170 &trace_user, _("\
4171 Set the user name to use for current and future trace runs."), _("\
4172 Show the user name to use for current and future trace runs."), NULL,
4173 set_trace_user, NULL,
4174 &setlist, &showlist);
4175
4176 add_setshow_string_cmd ("trace-notes", class_trace,
4177 &trace_notes, _("\
4178 Set notes string to use for current and future trace runs."), _("\
4179 Show the notes string to use for current and future trace runs."), NULL,
4180 set_trace_notes, NULL,
4181 &setlist, &showlist);
4182
4183 add_setshow_string_cmd ("trace-stop-notes", class_trace,
4184 &trace_stop_notes, _("\
4185 Set notes string to use for future tstop commands."), _("\
4186 Show the notes string to use for future tstop commands."), NULL,
4187 set_trace_stop_notes, NULL,
4188 &setlist, &showlist);
4189 }
This page took 0.117639 seconds and 4 git commands to generate.