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