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