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