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