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