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