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