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