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