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