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