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