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