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