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