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