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