gdb/
[binutils-gdb.git] / gdb / tracepoint.c
1 /* Tracing functionality for remote targets in custom GDB protocol
2
3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
4 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
5
6 This file is part of GDB.
7
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
10 the Free Software Foundation; either version 3 of the License, or
11 (at your option) any later version.
12
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
17
18 You should have received a copy of the GNU General Public License
19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
21 #include "defs.h"
22 #include "arch-utils.h"
23 #include "symtab.h"
24 #include "frame.h"
25 #include "gdbtypes.h"
26 #include "expression.h"
27 #include "gdbcmd.h"
28 #include "value.h"
29 #include "target.h"
30 #include "language.h"
31 #include "gdb_string.h"
32 #include "inferior.h"
33 #include "breakpoint.h"
34 #include "tracepoint.h"
35 #include "linespec.h"
36 #include "regcache.h"
37 #include "completer.h"
38 #include "block.h"
39 #include "dictionary.h"
40 #include "observer.h"
41 #include "user-regs.h"
42 #include "valprint.h"
43 #include "gdbcore.h"
44 #include "objfiles.h"
45 #include "filenames.h"
46 #include "gdbthread.h"
47
48 #include "ax.h"
49 #include "ax-gdb.h"
50
51 /* readline include files */
52 #include "readline/readline.h"
53 #include "readline/history.h"
54
55 /* readline defines this. */
56 #undef savestring
57
58 #ifdef HAVE_UNISTD_H
59 #include <unistd.h>
60 #endif
61
62 #ifndef O_LARGEFILE
63 #define O_LARGEFILE 0
64 #endif
65
66 extern int hex2bin (const char *hex, gdb_byte *bin, int count);
67 extern int bin2hex (const gdb_byte *bin, char *hex, int count);
68
69 extern void stop_tracing ();
70
71 /* Maximum length of an agent aexpression.
72 This accounts for the fact that packets are limited to 400 bytes
73 (which includes everything -- including the checksum), and assumes
74 the worst case of maximum length for each of the pieces of a
75 continuation packet.
76
77 NOTE: expressions get mem2hex'ed otherwise this would be twice as
78 large. (400 - 31)/2 == 184 */
79 #define MAX_AGENT_EXPR_LEN 184
80
81 /* A hook used to notify the UI of tracepoint operations. */
82
83 void (*deprecated_trace_find_hook) (char *arg, int from_tty);
84 void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
85
86 extern void (*deprecated_readline_begin_hook) (char *, ...);
87 extern char *(*deprecated_readline_hook) (char *);
88 extern void (*deprecated_readline_end_hook) (void);
89
90 /* GDB commands implemented in other modules:
91 */
92
93 extern void output_command (char *, int);
94
95 /*
96 Tracepoint.c:
97
98 This module defines the following debugger commands:
99 trace : set a tracepoint on a function, line, or address.
100 info trace : list all debugger-defined tracepoints.
101 delete trace : delete one or more tracepoints.
102 enable trace : enable one or more tracepoints.
103 disable trace : disable one or more tracepoints.
104 actions : specify actions to be taken at a tracepoint.
105 passcount : specify a pass count for a tracepoint.
106 tstart : start a trace experiment.
107 tstop : stop a trace experiment.
108 tstatus : query the status of a trace experiment.
109 tfind : find a trace frame in the trace buffer.
110 tdump : print everything collected at the current tracepoint.
111 save-tracepoints : write tracepoint setup into a file.
112
113 This module defines the following user-visible debugger variables:
114 $trace_frame : sequence number of trace frame currently being debugged.
115 $trace_line : source line of trace frame currently being debugged.
116 $trace_file : source file of trace frame currently being debugged.
117 $tracepoint : tracepoint number of trace frame currently being debugged.
118 */
119
120
121 /* ======= Important global variables: ======= */
122
123 /* The list of all trace state variables. We don't retain pointers to
124 any of these for any reason - API is by name or number only - so it
125 works to have a vector of objects. */
126
127 typedef struct trace_state_variable tsv_s;
128 DEF_VEC_O(tsv_s);
129
130 static VEC(tsv_s) *tvariables;
131
132 /* The next integer to assign to a variable. */
133
134 static int next_tsv_number = 1;
135
136 /* Number of last traceframe collected. */
137 static int traceframe_number;
138
139 /* Tracepoint for last traceframe collected. */
140 static int tracepoint_number;
141
142 /* Symbol for function for last traceframe collected */
143 static struct symbol *traceframe_fun;
144
145 /* Symtab and line for last traceframe collected */
146 static struct symtab_and_line traceframe_sal;
147
148 /* Tracing command lists */
149 static struct cmd_list_element *tfindlist;
150
151 /* List of expressions to collect by default at each tracepoint hit. */
152 char *default_collect = "";
153
154 static int disconnected_tracing;
155
156 /* This variable controls whether we ask the target for a linear or
157 circular trace buffer. */
158
159 static int circular_trace_buffer;
160
161 /* ======= Important command functions: ======= */
162 static void trace_actions_command (char *, int);
163 static void trace_start_command (char *, int);
164 static void trace_stop_command (char *, int);
165 static void trace_status_command (char *, int);
166 static void trace_find_command (char *, int);
167 static void trace_find_pc_command (char *, int);
168 static void trace_find_tracepoint_command (char *, int);
169 static void trace_find_line_command (char *, int);
170 static void trace_find_range_command (char *, int);
171 static void trace_find_outside_command (char *, int);
172 static void trace_dump_command (char *, int);
173
174 /* support routines */
175
176 struct collection_list;
177 static void add_aexpr (struct collection_list *, struct agent_expr *);
178 static char *mem2hex (gdb_byte *, char *, int);
179 static void add_register (struct collection_list *collection,
180 unsigned int regno);
181
182 extern void send_disconnected_tracing_value (int value);
183
184 static void free_uploaded_tps (struct uploaded_tp **utpp);
185 static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
186
187
188 extern void _initialize_tracepoint (void);
189
190 static struct trace_status trace_status;
191
192 char *stop_reason_names[] = {
193 "tunknown",
194 "tnotrun",
195 "tstop",
196 "tfull",
197 "tdisconnected",
198 "tpasscount",
199 "terror"
200 };
201
202 struct trace_status *
203 current_trace_status ()
204 {
205 /* Ensure this is never NULL. */
206 if (!trace_status.error_desc)
207 trace_status.error_desc = "";
208 return &trace_status;
209 }
210
211 /* Set traceframe number to NUM. */
212 static void
213 set_traceframe_num (int num)
214 {
215 traceframe_number = num;
216 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
217 }
218
219 /* Set tracepoint number to NUM. */
220 static void
221 set_tracepoint_num (int num)
222 {
223 tracepoint_number = num;
224 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
225 }
226
227 /* Set externally visible debug variables for querying/printing
228 the traceframe context (line, function, file) */
229
230 static void
231 set_traceframe_context (struct frame_info *trace_frame)
232 {
233 CORE_ADDR trace_pc;
234
235 if (trace_frame == NULL) /* Cease debugging any trace buffers. */
236 {
237 traceframe_fun = 0;
238 traceframe_sal.pc = traceframe_sal.line = 0;
239 traceframe_sal.symtab = NULL;
240 clear_internalvar (lookup_internalvar ("trace_func"));
241 clear_internalvar (lookup_internalvar ("trace_file"));
242 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
243 return;
244 }
245
246 /* Save as globals for internal use. */
247 trace_pc = get_frame_pc (trace_frame);
248 traceframe_sal = find_pc_line (trace_pc, 0);
249 traceframe_fun = find_pc_function (trace_pc);
250
251 /* Save linenumber as "$trace_line", a debugger variable visible to
252 users. */
253 set_internalvar_integer (lookup_internalvar ("trace_line"),
254 traceframe_sal.line);
255
256 /* Save func name as "$trace_func", a debugger variable visible to
257 users. */
258 if (traceframe_fun == NULL
259 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
260 clear_internalvar (lookup_internalvar ("trace_func"));
261 else
262 set_internalvar_string (lookup_internalvar ("trace_func"),
263 SYMBOL_LINKAGE_NAME (traceframe_fun));
264
265 /* Save file name as "$trace_file", a debugger variable visible to
266 users. */
267 if (traceframe_sal.symtab == NULL
268 || traceframe_sal.symtab->filename == NULL)
269 clear_internalvar (lookup_internalvar ("trace_file"));
270 else
271 set_internalvar_string (lookup_internalvar ("trace_file"),
272 traceframe_sal.symtab->filename);
273 }
274
275 /* Create a new trace state variable with the given name. */
276
277 struct trace_state_variable *
278 create_trace_state_variable (const char *name)
279 {
280 struct trace_state_variable tsv;
281
282 memset (&tsv, 0, sizeof (tsv));
283 tsv.name = xstrdup (name);
284 tsv.number = next_tsv_number++;
285 return VEC_safe_push (tsv_s, tvariables, &tsv);
286 }
287
288 /* Look for a trace state variable of the given name. */
289
290 struct trace_state_variable *
291 find_trace_state_variable (const char *name)
292 {
293 struct trace_state_variable *tsv;
294 int ix;
295
296 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
297 if (strcmp (name, tsv->name) == 0)
298 return tsv;
299
300 return NULL;
301 }
302
303 void
304 delete_trace_state_variable (const char *name)
305 {
306 struct trace_state_variable *tsv;
307 int ix;
308
309 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
310 if (strcmp (name, tsv->name) == 0)
311 {
312 xfree ((void *)tsv->name);
313 VEC_unordered_remove (tsv_s, tvariables, ix);
314 return;
315 }
316
317 warning (_("No trace variable named \"$%s\", not deleting"), name);
318 }
319
320 /* The 'tvariable' command collects a name and optional expression to
321 evaluate into an initial value. */
322
323 void
324 trace_variable_command (char *args, int from_tty)
325 {
326 struct expression *expr;
327 struct cleanup *old_chain;
328 struct internalvar *intvar = NULL;
329 LONGEST initval = 0;
330 struct trace_state_variable *tsv;
331
332 if (!args || !*args)
333 error_no_arg (_("trace state variable name"));
334
335 /* All the possible valid arguments are expressions. */
336 expr = parse_expression (args);
337 old_chain = make_cleanup (free_current_contents, &expr);
338
339 if (expr->nelts == 0)
340 error (_("No expression?"));
341
342 /* Only allow two syntaxes; "$name" and "$name=value". */
343 if (expr->elts[0].opcode == OP_INTERNALVAR)
344 {
345 intvar = expr->elts[1].internalvar;
346 }
347 else if (expr->elts[0].opcode == BINOP_ASSIGN
348 && expr->elts[1].opcode == OP_INTERNALVAR)
349 {
350 intvar = expr->elts[2].internalvar;
351 initval = value_as_long (evaluate_subexpression_type (expr, 4));
352 }
353 else
354 error (_("Syntax must be $NAME [ = EXPR ]"));
355
356 if (!intvar)
357 error (_("No name given"));
358
359 if (strlen (internalvar_name (intvar)) <= 0)
360 error (_("Must supply a non-empty variable name"));
361
362 /* If the variable already exists, just change its initial value. */
363 tsv = find_trace_state_variable (internalvar_name (intvar));
364 if (tsv)
365 {
366 tsv->initial_value = initval;
367 printf_filtered (_("Trace state variable $%s now has initial value %s.\n"),
368 tsv->name, plongest (tsv->initial_value));
369 return;
370 }
371
372 /* Create a new variable. */
373 tsv = create_trace_state_variable (internalvar_name (intvar));
374 tsv->initial_value = initval;
375
376 printf_filtered (_("Trace state variable $%s created, with initial value %s.\n"),
377 tsv->name, plongest (tsv->initial_value));
378
379 do_cleanups (old_chain);
380 }
381
382 void
383 delete_trace_variable_command (char *args, int from_tty)
384 {
385 int i, ix;
386 char **argv;
387 struct cleanup *back_to;
388 struct trace_state_variable *tsv;
389
390 if (args == NULL)
391 {
392 if (query (_("Delete all trace state variables? ")))
393 VEC_free (tsv_s, tvariables);
394 dont_repeat ();
395 return;
396 }
397
398 argv = gdb_buildargv (args);
399 back_to = make_cleanup_freeargv (argv);
400
401 for (i = 0; argv[i] != NULL; i++)
402 {
403 if (*argv[i] == '$')
404 delete_trace_state_variable (argv[i] + 1);
405 else
406 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[i]);
407 }
408
409 do_cleanups (back_to);
410
411 dont_repeat ();
412 }
413
414 void
415 tvariables_info_1 (void)
416 {
417 struct trace_state_variable *tsv;
418 int ix;
419 int count = 0;
420 struct cleanup *back_to;
421
422 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
423 {
424 printf_filtered (_("No trace state variables.\n"));
425 return;
426 }
427
428 /* Try to acquire values from the target. */
429 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
430 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
431 &(tsv->value));
432
433 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
434 count, "trace-variables");
435 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
436 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
437 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
438
439 ui_out_table_body (uiout);
440
441 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
442 {
443 struct cleanup *back_to2;
444 char *c;
445 char *name;
446
447 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
448
449 name = concat ("$", tsv->name, NULL);
450 make_cleanup (xfree, name);
451 ui_out_field_string (uiout, "name", name);
452 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
453
454 if (tsv->value_known)
455 c = plongest (tsv->value);
456 else if (ui_out_is_mi_like_p (uiout))
457 /* For MI, we prefer not to use magic string constants, but rather
458 omit the field completely. The difference between unknown and
459 undefined does not seem important enough to represent. */
460 c = NULL;
461 else if (current_trace_status ()->running || traceframe_number >= 0)
462 /* The value is/was defined, but we don't have it. */
463 c = "<unknown>";
464 else
465 /* It is not meaningful to ask about the value. */
466 c = "<undefined>";
467 if (c)
468 ui_out_field_string (uiout, "current", c);
469 ui_out_text (uiout, "\n");
470
471 do_cleanups (back_to2);
472 }
473
474 do_cleanups (back_to);
475 }
476
477 /* List all the trace state variables. */
478
479 static void
480 tvariables_info (char *args, int from_tty)
481 {
482 tvariables_info_1 ();
483 }
484
485 /* ACTIONS functions: */
486
487 /* The three functions:
488 collect_pseudocommand,
489 while_stepping_pseudocommand, and
490 end_actions_pseudocommand
491 are placeholders for "commands" that are actually ONLY to be used
492 within a tracepoint action list. If the actual function is ever called,
493 it means that somebody issued the "command" at the top level,
494 which is always an error. */
495
496 void
497 end_actions_pseudocommand (char *args, int from_tty)
498 {
499 error (_("This command cannot be used at the top level."));
500 }
501
502 void
503 while_stepping_pseudocommand (char *args, int from_tty)
504 {
505 error (_("This command can only be used in a tracepoint actions list."));
506 }
507
508 static void
509 collect_pseudocommand (char *args, int from_tty)
510 {
511 error (_("This command can only be used in a tracepoint actions list."));
512 }
513
514 static void
515 teval_pseudocommand (char *args, int from_tty)
516 {
517 error (_("This command can only be used in a tracepoint actions list."));
518 }
519
520 /* Enter a list of actions for a tracepoint. */
521 static void
522 trace_actions_command (char *args, int from_tty)
523 {
524 struct breakpoint *t;
525 struct command_line *l;
526
527 t = get_tracepoint_by_number (&args, 0, 1);
528 if (t)
529 {
530 char *tmpbuf =
531 xstrprintf ("Enter actions for tracepoint %d, one per line.",
532 t->number);
533 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
534
535 l = read_command_lines (tmpbuf, from_tty, 1, check_tracepoint_command, t);
536 do_cleanups (cleanups);
537 breakpoint_set_commands (t, l);
538 }
539 /* else just return */
540 }
541
542 /* worker function */
543 enum actionline_type
544 validate_actionline (char **line, struct breakpoint *t)
545 {
546 struct cmd_list_element *c;
547 struct expression *exp = NULL;
548 struct cleanup *old_chain = NULL;
549 char *p, *tmp_p;
550 struct bp_location *loc;
551
552 /* if EOF is typed, *line is NULL */
553 if (*line == NULL)
554 return END;
555
556 for (p = *line; isspace ((int) *p);)
557 p++;
558
559 /* Symbol lookup etc. */
560 if (*p == '\0') /* empty line: just prompt for another line. */
561 return BADLINE;
562
563 if (*p == '#') /* comment line */
564 return GENERIC;
565
566 c = lookup_cmd (&p, cmdlist, "", -1, 1);
567 if (c == 0)
568 {
569 warning (_("'%s' is not an action that I know, or is ambiguous."),
570 p);
571 return BADLINE;
572 }
573
574 if (cmd_cfunc_eq (c, collect_pseudocommand))
575 {
576 struct agent_expr *aexpr;
577 struct agent_reqs areqs;
578
579 do
580 { /* repeat over a comma-separated list */
581 QUIT; /* allow user to bail out with ^C */
582 while (isspace ((int) *p))
583 p++;
584
585 if (*p == '$') /* look for special pseudo-symbols */
586 {
587 if ((0 == strncasecmp ("reg", p + 1, 3)) ||
588 (0 == strncasecmp ("arg", p + 1, 3)) ||
589 (0 == strncasecmp ("loc", p + 1, 3)))
590 {
591 p = strchr (p, ',');
592 continue;
593 }
594 /* else fall thru, treat p as an expression and parse it! */
595 }
596 tmp_p = p;
597 for (loc = t->loc; loc; loc = loc->next)
598 {
599 p = tmp_p;
600 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
601 old_chain = make_cleanup (free_current_contents, &exp);
602
603 if (exp->elts[0].opcode == OP_VAR_VALUE)
604 {
605 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
606 {
607 warning (_("constant %s (value %ld) will not be collected."),
608 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
609 SYMBOL_VALUE (exp->elts[2].symbol));
610 return BADLINE;
611 }
612 else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
613 {
614 warning (_("%s is optimized away and cannot be collected."),
615 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
616 return BADLINE;
617 }
618 }
619
620 /* We have something to collect, make sure that the expr to
621 bytecode translator can handle it and that it's not too
622 long. */
623 aexpr = gen_trace_for_expr (loc->address, exp);
624 make_cleanup_free_agent_expr (aexpr);
625
626 if (aexpr->len > MAX_AGENT_EXPR_LEN)
627 error (_("expression too complicated, try simplifying"));
628
629 ax_reqs (aexpr, &areqs);
630 (void) make_cleanup (xfree, areqs.reg_mask);
631
632 if (areqs.flaw != agent_flaw_none)
633 error (_("malformed expression"));
634
635 if (areqs.min_height < 0)
636 error (_("gdb: Internal error: expression has min height < 0"));
637
638 if (areqs.max_height > 20)
639 error (_("expression too complicated, try simplifying"));
640
641 do_cleanups (old_chain);
642 }
643 }
644 while (p && *p++ == ',');
645 return GENERIC;
646 }
647 else if (cmd_cfunc_eq (c, teval_pseudocommand))
648 {
649 struct agent_expr *aexpr;
650
651 do
652 { /* repeat over a comma-separated list */
653 QUIT; /* allow user to bail out with ^C */
654 while (isspace ((int) *p))
655 p++;
656
657 tmp_p = p;
658 for (loc = t->loc; loc; loc = loc->next)
659 {
660 p = tmp_p;
661 /* Only expressions are allowed for this action. */
662 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
663 old_chain = make_cleanup (free_current_contents, &exp);
664
665 /* We have something to evaluate, make sure that the expr to
666 bytecode translator can handle it and that it's not too
667 long. */
668 aexpr = gen_eval_for_expr (loc->address, exp);
669 make_cleanup_free_agent_expr (aexpr);
670
671 if (aexpr->len > MAX_AGENT_EXPR_LEN)
672 error (_("expression too complicated, try simplifying"));
673
674 do_cleanups (old_chain);
675 }
676 }
677 while (p && *p++ == ',');
678 return GENERIC;
679 }
680 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
681 {
682 char *steparg; /* in case warning is necessary */
683
684 while (isspace ((int) *p))
685 p++;
686 steparg = p;
687
688 if (*p == '\0' ||
689 (t->step_count = strtol (p, &p, 0)) == 0)
690 {
691 error (_("'%s': bad step-count."), *line);
692 }
693 return STEPPING;
694 }
695 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
696 return END;
697 else
698 {
699 error (_("'%s' is not a supported tracepoint action."), *line);
700 }
701 }
702
703 enum {
704 memrange_absolute = -1
705 };
706
707 struct memrange
708 {
709 int type; /* memrange_absolute for absolute memory range,
710 else basereg number */
711 bfd_signed_vma start;
712 bfd_signed_vma end;
713 };
714
715 struct collection_list
716 {
717 unsigned char regs_mask[32]; /* room for up to 256 regs */
718 long listsize;
719 long next_memrange;
720 struct memrange *list;
721 long aexpr_listsize; /* size of array pointed to by expr_list elt */
722 long next_aexpr_elt;
723 struct agent_expr **aexpr_list;
724
725 }
726 tracepoint_list, stepping_list;
727
728 /* MEMRANGE functions: */
729
730 static int memrange_cmp (const void *, const void *);
731
732 /* compare memranges for qsort */
733 static int
734 memrange_cmp (const void *va, const void *vb)
735 {
736 const struct memrange *a = va, *b = vb;
737
738 if (a->type < b->type)
739 return -1;
740 if (a->type > b->type)
741 return 1;
742 if (a->type == memrange_absolute)
743 {
744 if ((bfd_vma) a->start < (bfd_vma) b->start)
745 return -1;
746 if ((bfd_vma) a->start > (bfd_vma) b->start)
747 return 1;
748 }
749 else
750 {
751 if (a->start < b->start)
752 return -1;
753 if (a->start > b->start)
754 return 1;
755 }
756 return 0;
757 }
758
759 /* Sort the memrange list using qsort, and merge adjacent memranges. */
760 static void
761 memrange_sortmerge (struct collection_list *memranges)
762 {
763 int a, b;
764
765 qsort (memranges->list, memranges->next_memrange,
766 sizeof (struct memrange), memrange_cmp);
767 if (memranges->next_memrange > 0)
768 {
769 for (a = 0, b = 1; b < memranges->next_memrange; b++)
770 {
771 if (memranges->list[a].type == memranges->list[b].type &&
772 memranges->list[b].start - memranges->list[a].end <=
773 MAX_REGISTER_SIZE)
774 {
775 /* memrange b starts before memrange a ends; merge them. */
776 if (memranges->list[b].end > memranges->list[a].end)
777 memranges->list[a].end = memranges->list[b].end;
778 continue; /* next b, same a */
779 }
780 a++; /* next a */
781 if (a != b)
782 memcpy (&memranges->list[a], &memranges->list[b],
783 sizeof (struct memrange));
784 }
785 memranges->next_memrange = a + 1;
786 }
787 }
788
789 /* Add a register to a collection list. */
790 static void
791 add_register (struct collection_list *collection, unsigned int regno)
792 {
793 if (info_verbose)
794 printf_filtered ("collect register %d\n", regno);
795 if (regno >= (8 * sizeof (collection->regs_mask)))
796 error (_("Internal: register number %d too large for tracepoint"),
797 regno);
798 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
799 }
800
801 /* Add a memrange to a collection list */
802 static void
803 add_memrange (struct collection_list *memranges,
804 int type, bfd_signed_vma base,
805 unsigned long len)
806 {
807 if (info_verbose)
808 {
809 printf_filtered ("(%d,", type);
810 printf_vma (base);
811 printf_filtered (",%ld)\n", len);
812 }
813
814 /* type: memrange_absolute == memory, other n == basereg */
815 memranges->list[memranges->next_memrange].type = type;
816 /* base: addr if memory, offset if reg relative. */
817 memranges->list[memranges->next_memrange].start = base;
818 /* len: we actually save end (base + len) for convenience */
819 memranges->list[memranges->next_memrange].end = base + len;
820 memranges->next_memrange++;
821 if (memranges->next_memrange >= memranges->listsize)
822 {
823 memranges->listsize *= 2;
824 memranges->list = xrealloc (memranges->list,
825 memranges->listsize);
826 }
827
828 if (type != memrange_absolute) /* Better collect the base register! */
829 add_register (memranges, type);
830 }
831
832 /* Add a symbol to a collection list. */
833 static void
834 collect_symbol (struct collection_list *collect,
835 struct symbol *sym,
836 struct gdbarch *gdbarch,
837 long frame_regno, long frame_offset,
838 CORE_ADDR scope)
839 {
840 unsigned long len;
841 unsigned int reg;
842 bfd_signed_vma offset;
843 int treat_as_expr = 0;
844
845 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
846 switch (SYMBOL_CLASS (sym))
847 {
848 default:
849 printf_filtered ("%s: don't know symbol class %d\n",
850 SYMBOL_PRINT_NAME (sym),
851 SYMBOL_CLASS (sym));
852 break;
853 case LOC_CONST:
854 printf_filtered ("constant %s (value %ld) will not be collected.\n",
855 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
856 break;
857 case LOC_STATIC:
858 offset = SYMBOL_VALUE_ADDRESS (sym);
859 if (info_verbose)
860 {
861 char tmp[40];
862
863 sprintf_vma (tmp, offset);
864 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
865 SYMBOL_PRINT_NAME (sym), len,
866 tmp /* address */);
867 }
868 /* A struct may be a C++ class with static fields, go to general
869 expression handling. */
870 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
871 treat_as_expr = 1;
872 else
873 add_memrange (collect, memrange_absolute, offset, len);
874 break;
875 case LOC_REGISTER:
876 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
877 if (info_verbose)
878 printf_filtered ("LOC_REG[parm] %s: ",
879 SYMBOL_PRINT_NAME (sym));
880 add_register (collect, reg);
881 /* Check for doubles stored in two registers. */
882 /* FIXME: how about larger types stored in 3 or more regs? */
883 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
884 len > register_size (gdbarch, reg))
885 add_register (collect, reg + 1);
886 break;
887 case LOC_REF_ARG:
888 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
889 printf_filtered (" (will not collect %s)\n",
890 SYMBOL_PRINT_NAME (sym));
891 break;
892 case LOC_ARG:
893 reg = frame_regno;
894 offset = frame_offset + SYMBOL_VALUE (sym);
895 if (info_verbose)
896 {
897 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
898 SYMBOL_PRINT_NAME (sym), len);
899 printf_vma (offset);
900 printf_filtered (" from frame ptr reg %d\n", reg);
901 }
902 add_memrange (collect, reg, offset, len);
903 break;
904 case LOC_REGPARM_ADDR:
905 reg = SYMBOL_VALUE (sym);
906 offset = 0;
907 if (info_verbose)
908 {
909 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
910 SYMBOL_PRINT_NAME (sym), len);
911 printf_vma (offset);
912 printf_filtered (" from reg %d\n", reg);
913 }
914 add_memrange (collect, reg, offset, len);
915 break;
916 case LOC_LOCAL:
917 reg = frame_regno;
918 offset = frame_offset + SYMBOL_VALUE (sym);
919 if (info_verbose)
920 {
921 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
922 SYMBOL_PRINT_NAME (sym), len);
923 printf_vma (offset);
924 printf_filtered (" from frame ptr reg %d\n", reg);
925 }
926 add_memrange (collect, reg, offset, len);
927 break;
928 case LOC_UNRESOLVED:
929 printf_filtered ("Don't know LOC_UNRESOLVED %s\n",
930 SYMBOL_PRINT_NAME (sym));
931 break;
932 case LOC_OPTIMIZED_OUT:
933 printf_filtered ("%s has been optimized out of existence.\n",
934 SYMBOL_PRINT_NAME (sym));
935 break;
936
937 case LOC_COMPUTED:
938 treat_as_expr = 1;
939 break;
940 }
941
942 /* Expressions are the most general case. */
943 if (treat_as_expr)
944 {
945 struct agent_expr *aexpr;
946 struct cleanup *old_chain1 = NULL;
947 struct agent_reqs areqs;
948
949 aexpr = gen_trace_for_var (scope, gdbarch, sym);
950
951 /* It can happen that the symbol is recorded as a computed
952 location, but it's been optimized away and doesn't actually
953 have a location expression. */
954 if (!aexpr)
955 {
956 printf_filtered ("%s has been optimized out of existence.\n",
957 SYMBOL_PRINT_NAME (sym));
958 return;
959 }
960
961 old_chain1 = make_cleanup_free_agent_expr (aexpr);
962
963 ax_reqs (aexpr, &areqs);
964 if (areqs.flaw != agent_flaw_none)
965 error (_("malformed expression"));
966
967 if (areqs.min_height < 0)
968 error (_("gdb: Internal error: expression has min height < 0"));
969 if (areqs.max_height > 20)
970 error (_("expression too complicated, try simplifying"));
971
972 discard_cleanups (old_chain1);
973 add_aexpr (collect, aexpr);
974
975 /* take care of the registers */
976 if (areqs.reg_mask_len > 0)
977 {
978 int ndx1, ndx2;
979
980 for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
981 {
982 QUIT; /* allow user to bail out with ^C */
983 if (areqs.reg_mask[ndx1] != 0)
984 {
985 /* assume chars have 8 bits */
986 for (ndx2 = 0; ndx2 < 8; ndx2++)
987 if (areqs.reg_mask[ndx1] & (1 << ndx2))
988 /* it's used -- record it */
989 add_register (collect, ndx1 * 8 + ndx2);
990 }
991 }
992 }
993 }
994 }
995
996 /* Add all locals (or args) symbols to collection list */
997 static void
998 add_local_symbols (struct collection_list *collect,
999 struct gdbarch *gdbarch, CORE_ADDR pc,
1000 long frame_regno, long frame_offset, int type)
1001 {
1002 struct symbol *sym;
1003 struct block *block;
1004 struct dict_iterator iter;
1005 int count = 0;
1006
1007 block = block_for_pc (pc);
1008 while (block != 0)
1009 {
1010 QUIT; /* allow user to bail out with ^C */
1011 ALL_BLOCK_SYMBOLS (block, iter, sym)
1012 {
1013 if (SYMBOL_IS_ARGUMENT (sym)
1014 ? type == 'A' /* collecting Arguments */
1015 : type == 'L') /* collecting Locals */
1016 {
1017 count++;
1018 collect_symbol (collect, sym, gdbarch,
1019 frame_regno, frame_offset, pc);
1020 }
1021 }
1022 if (BLOCK_FUNCTION (block))
1023 break;
1024 else
1025 block = BLOCK_SUPERBLOCK (block);
1026 }
1027 if (count == 0)
1028 warning (_("No %s found in scope."),
1029 type == 'L' ? "locals" : "args");
1030 }
1031
1032 /* worker function */
1033 static void
1034 clear_collection_list (struct collection_list *list)
1035 {
1036 int ndx;
1037
1038 list->next_memrange = 0;
1039 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1040 {
1041 free_agent_expr (list->aexpr_list[ndx]);
1042 list->aexpr_list[ndx] = NULL;
1043 }
1044 list->next_aexpr_elt = 0;
1045 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1046 }
1047
1048 /* reduce a collection list to string form (for gdb protocol) */
1049 static char **
1050 stringify_collection_list (struct collection_list *list, char *string)
1051 {
1052 char temp_buf[2048];
1053 char tmp2[40];
1054 int count;
1055 int ndx = 0;
1056 char *(*str_list)[];
1057 char *end;
1058 long i;
1059
1060 count = 1 + list->next_memrange + list->next_aexpr_elt + 1;
1061 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1062
1063 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1064 if (list->regs_mask[i] != 0) /* skip leading zeroes in regs_mask */
1065 break;
1066 if (list->regs_mask[i] != 0) /* prepare to send regs_mask to the stub */
1067 {
1068 if (info_verbose)
1069 printf_filtered ("\nCollecting registers (mask): 0x");
1070 end = temp_buf;
1071 *end++ = 'R';
1072 for (; i >= 0; i--)
1073 {
1074 QUIT; /* allow user to bail out with ^C */
1075 if (info_verbose)
1076 printf_filtered ("%02X", list->regs_mask[i]);
1077 sprintf (end, "%02X", list->regs_mask[i]);
1078 end += 2;
1079 }
1080 (*str_list)[ndx] = xstrdup (temp_buf);
1081 ndx++;
1082 }
1083 if (info_verbose)
1084 printf_filtered ("\n");
1085 if (list->next_memrange > 0 && info_verbose)
1086 printf_filtered ("Collecting memranges: \n");
1087 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1088 {
1089 QUIT; /* allow user to bail out with ^C */
1090 sprintf_vma (tmp2, list->list[i].start);
1091 if (info_verbose)
1092 {
1093 printf_filtered ("(%d, %s, %ld)\n",
1094 list->list[i].type,
1095 tmp2,
1096 (long) (list->list[i].end - list->list[i].start));
1097 }
1098 if (count + 27 > MAX_AGENT_EXPR_LEN)
1099 {
1100 (*str_list)[ndx] = savestring (temp_buf, count);
1101 ndx++;
1102 count = 0;
1103 end = temp_buf;
1104 }
1105
1106 {
1107 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1108
1109 /* The "%X" conversion specifier expects an unsigned argument,
1110 so passing -1 (memrange_absolute) to it directly gives you
1111 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1112 Special-case it. */
1113 if (list->list[i].type == memrange_absolute)
1114 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1115 else
1116 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1117 }
1118
1119 count += strlen (end);
1120 end = temp_buf + count;
1121 }
1122
1123 for (i = 0; i < list->next_aexpr_elt; i++)
1124 {
1125 QUIT; /* allow user to bail out with ^C */
1126 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1127 {
1128 (*str_list)[ndx] = savestring (temp_buf, count);
1129 ndx++;
1130 count = 0;
1131 end = temp_buf;
1132 }
1133 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1134 end += 10; /* 'X' + 8 hex digits + ',' */
1135 count += 10;
1136
1137 end = mem2hex (list->aexpr_list[i]->buf,
1138 end, list->aexpr_list[i]->len);
1139 count += 2 * list->aexpr_list[i]->len;
1140 }
1141
1142 if (count != 0)
1143 {
1144 (*str_list)[ndx] = savestring (temp_buf, count);
1145 ndx++;
1146 count = 0;
1147 end = temp_buf;
1148 }
1149 (*str_list)[ndx] = NULL;
1150
1151 if (ndx == 0)
1152 {
1153 xfree (str_list);
1154 return NULL;
1155 }
1156 else
1157 return *str_list;
1158 }
1159
1160
1161 static void
1162 encode_actions_1 (struct command_line *action,
1163 struct breakpoint *t,
1164 struct bp_location *tloc,
1165 int frame_reg,
1166 LONGEST frame_offset,
1167 struct collection_list *collect,
1168 struct collection_list *stepping_list)
1169 {
1170 char *action_exp;
1171 struct expression *exp = NULL;
1172 struct command_line *actions;
1173 int i;
1174 struct value *tempval;
1175 struct cmd_list_element *cmd;
1176 struct agent_expr *aexpr;
1177
1178 for (; action; action = action->next)
1179 {
1180 QUIT; /* allow user to bail out with ^C */
1181 action_exp = action->line;
1182 while (isspace ((int) *action_exp))
1183 action_exp++;
1184
1185 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1186 if (cmd == 0)
1187 error (_("Bad action list item: %s"), action_exp);
1188
1189 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1190 {
1191 do
1192 { /* repeat over a comma-separated list */
1193 QUIT; /* allow user to bail out with ^C */
1194 while (isspace ((int) *action_exp))
1195 action_exp++;
1196
1197 if (0 == strncasecmp ("$reg", action_exp, 4))
1198 {
1199 for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
1200 add_register (collect, i);
1201 action_exp = strchr (action_exp, ','); /* more? */
1202 }
1203 else if (0 == strncasecmp ("$arg", action_exp, 4))
1204 {
1205 add_local_symbols (collect,
1206 t->gdbarch,
1207 tloc->address,
1208 frame_reg,
1209 frame_offset,
1210 'A');
1211 action_exp = strchr (action_exp, ','); /* more? */
1212 }
1213 else if (0 == strncasecmp ("$loc", action_exp, 4))
1214 {
1215 add_local_symbols (collect,
1216 t->gdbarch,
1217 tloc->address,
1218 frame_reg,
1219 frame_offset,
1220 'L');
1221 action_exp = strchr (action_exp, ','); /* more? */
1222 }
1223 else
1224 {
1225 unsigned long addr, len;
1226 struct cleanup *old_chain = NULL;
1227 struct cleanup *old_chain1 = NULL;
1228 struct agent_reqs areqs;
1229
1230 exp = parse_exp_1 (&action_exp,
1231 block_for_pc (tloc->address), 1);
1232 old_chain = make_cleanup (free_current_contents, &exp);
1233
1234 switch (exp->elts[0].opcode)
1235 {
1236 case OP_REGISTER:
1237 {
1238 const char *name = &exp->elts[2].string;
1239
1240 i = user_reg_map_name_to_regnum (t->gdbarch,
1241 name, strlen (name));
1242 if (i == -1)
1243 internal_error (__FILE__, __LINE__,
1244 _("Register $%s not available"),
1245 name);
1246 if (info_verbose)
1247 printf_filtered ("OP_REGISTER: ");
1248 add_register (collect, i);
1249 break;
1250 }
1251
1252 case UNOP_MEMVAL:
1253 /* safe because we know it's a simple expression */
1254 tempval = evaluate_expression (exp);
1255 addr = value_address (tempval);
1256 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1257 add_memrange (collect, memrange_absolute, addr, len);
1258 break;
1259
1260 case OP_VAR_VALUE:
1261 collect_symbol (collect,
1262 exp->elts[2].symbol,
1263 t->gdbarch,
1264 frame_reg,
1265 frame_offset,
1266 tloc->address);
1267 break;
1268
1269 default: /* full-fledged expression */
1270 aexpr = gen_trace_for_expr (tloc->address, exp);
1271
1272 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1273
1274 ax_reqs (aexpr, &areqs);
1275 if (areqs.flaw != agent_flaw_none)
1276 error (_("malformed expression"));
1277
1278 if (areqs.min_height < 0)
1279 error (_("gdb: Internal error: expression has min height < 0"));
1280 if (areqs.max_height > 20)
1281 error (_("expression too complicated, try simplifying"));
1282
1283 discard_cleanups (old_chain1);
1284 add_aexpr (collect, aexpr);
1285
1286 /* take care of the registers */
1287 if (areqs.reg_mask_len > 0)
1288 {
1289 int ndx1;
1290 int ndx2;
1291
1292 for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
1293 {
1294 QUIT; /* allow user to bail out with ^C */
1295 if (areqs.reg_mask[ndx1] != 0)
1296 {
1297 /* assume chars have 8 bits */
1298 for (ndx2 = 0; ndx2 < 8; ndx2++)
1299 if (areqs.reg_mask[ndx1] & (1 << ndx2))
1300 /* it's used -- record it */
1301 add_register (collect,
1302 ndx1 * 8 + ndx2);
1303 }
1304 }
1305 }
1306 break;
1307 } /* switch */
1308 do_cleanups (old_chain);
1309 } /* do */
1310 }
1311 while (action_exp && *action_exp++ == ',');
1312 } /* if */
1313 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1314 {
1315 do
1316 { /* repeat over a comma-separated list */
1317 QUIT; /* allow user to bail out with ^C */
1318 while (isspace ((int) *action_exp))
1319 action_exp++;
1320
1321 {
1322 unsigned long addr, len;
1323 struct cleanup *old_chain = NULL;
1324 struct cleanup *old_chain1 = NULL;
1325 struct agent_reqs areqs;
1326
1327 exp = parse_exp_1 (&action_exp,
1328 block_for_pc (tloc->address), 1);
1329 old_chain = make_cleanup (free_current_contents, &exp);
1330
1331 aexpr = gen_eval_for_expr (tloc->address, exp);
1332 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1333
1334 ax_reqs (aexpr, &areqs);
1335 if (areqs.flaw != agent_flaw_none)
1336 error (_("malformed expression"));
1337
1338 if (areqs.min_height < 0)
1339 error (_("gdb: Internal error: expression has min height < 0"));
1340 if (areqs.max_height > 20)
1341 error (_("expression too complicated, try simplifying"));
1342
1343 discard_cleanups (old_chain1);
1344 /* Even though we're not officially collecting, add
1345 to the collect list anyway. */
1346 add_aexpr (collect, aexpr);
1347
1348 do_cleanups (old_chain);
1349 } /* do */
1350 }
1351 while (action_exp && *action_exp++ == ',');
1352 } /* if */
1353 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1354 {
1355 /* We check against nested while-stepping when setting
1356 breakpoint action, so no way to run into nested
1357 here. */
1358 gdb_assert (stepping_list);
1359
1360 encode_actions_1 (action->body_list[0], t, tloc, frame_reg, frame_offset,
1361 stepping_list, NULL);
1362 }
1363 else
1364 error (_("Invalid tracepoint command '%s'"), action->line);
1365 } /* for */
1366 }
1367
1368 /* Render all actions into gdb protocol. */
1369 /*static*/ void
1370 encode_actions (struct breakpoint *t, struct bp_location *tloc,
1371 char ***tdp_actions, char ***stepping_actions)
1372 {
1373 static char tdp_buff[2048], step_buff[2048];
1374 char *default_collect_line = NULL;
1375 struct command_line *actions;
1376 struct command_line *default_collect_action = NULL;
1377 int frame_reg;
1378 LONGEST frame_offset;
1379 struct cleanup *back_to;
1380
1381 back_to = make_cleanup (null_cleanup, NULL);
1382
1383 clear_collection_list (&tracepoint_list);
1384 clear_collection_list (&stepping_list);
1385
1386 *tdp_actions = NULL;
1387 *stepping_actions = NULL;
1388
1389 gdbarch_virtual_frame_pointer (t->gdbarch,
1390 t->loc->address, &frame_reg, &frame_offset);
1391
1392 actions = t->commands->commands;
1393
1394 /* If there are default expressions to collect, make up a collect
1395 action and prepend to the action list to encode. Note that since
1396 validation is per-tracepoint (local var "xyz" might be valid for
1397 one tracepoint and not another, etc), we make up the action on
1398 the fly, and don't cache it. */
1399 if (*default_collect)
1400 {
1401 char *line;
1402 enum actionline_type linetype;
1403
1404 default_collect_line = xstrprintf ("collect %s", default_collect);
1405 make_cleanup (xfree, default_collect_line);
1406
1407 line = default_collect_line;
1408 linetype = validate_actionline (&line, t);
1409 if (linetype != BADLINE)
1410 {
1411 default_collect_action = xmalloc (sizeof (struct command_line));
1412 make_cleanup (xfree, default_collect_action);
1413 default_collect_action->next = t->commands->commands;
1414 default_collect_action->line = line;
1415 actions = default_collect_action;
1416 }
1417 }
1418 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1419 &tracepoint_list, &stepping_list);
1420
1421 memrange_sortmerge (&tracepoint_list);
1422 memrange_sortmerge (&stepping_list);
1423
1424 *tdp_actions = stringify_collection_list (&tracepoint_list,
1425 tdp_buff);
1426 *stepping_actions = stringify_collection_list (&stepping_list,
1427 step_buff);
1428
1429 do_cleanups (back_to);
1430 }
1431
1432 static void
1433 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1434 {
1435 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1436 {
1437 collect->aexpr_list =
1438 xrealloc (collect->aexpr_list,
1439 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1440 collect->aexpr_listsize *= 2;
1441 }
1442 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1443 collect->next_aexpr_elt++;
1444 }
1445
1446
1447 void
1448 start_tracing (void)
1449 {
1450 char buf[2048];
1451 VEC(breakpoint_p) *tp_vec = NULL;
1452 int ix;
1453 struct breakpoint *t;
1454 struct trace_state_variable *tsv;
1455 int any_downloaded = 0;
1456
1457 target_trace_init ();
1458
1459 tp_vec = all_tracepoints ();
1460 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1461 {
1462 t->number_on_target = 0;
1463 target_download_tracepoint (t);
1464 t->number_on_target = t->number;
1465 any_downloaded = 1;
1466 }
1467 VEC_free (breakpoint_p, tp_vec);
1468
1469 /* No point in tracing without any tracepoints... */
1470 if (!any_downloaded)
1471 error ("No tracepoints downloaded, not starting trace");
1472
1473 /* Send down all the trace state variables too. */
1474 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
1475 {
1476 target_download_trace_state_variable (tsv);
1477 }
1478
1479 /* Tell target to treat text-like sections as transparent. */
1480 target_trace_set_readonly_regions ();
1481 /* Set some mode flags. */
1482 target_set_disconnected_tracing (disconnected_tracing);
1483 target_set_circular_trace_buffer (circular_trace_buffer);
1484
1485 /* Now insert traps and begin collecting data. */
1486 target_trace_start ();
1487
1488 /* Reset our local state. */
1489 set_traceframe_num (-1);
1490 set_tracepoint_num (-1);
1491 set_traceframe_context (NULL);
1492 current_trace_status()->running = 1;
1493 }
1494
1495 /* tstart command:
1496
1497 Tell target to clear any previous trace experiment.
1498 Walk the list of tracepoints, and send them (and their actions)
1499 to the target. If no errors,
1500 Tell target to start a new trace experiment. */
1501
1502 static void
1503 trace_start_command (char *args, int from_tty)
1504 {
1505 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1506
1507 start_tracing ();
1508 }
1509
1510 /* tstop command */
1511 static void
1512 trace_stop_command (char *args, int from_tty)
1513 {
1514 stop_tracing ();
1515 }
1516
1517 void
1518 stop_tracing (void)
1519 {
1520 target_trace_stop ();
1521 /* should change in response to reply? */
1522 current_trace_status ()->running = 0;
1523 }
1524
1525 /* tstatus command */
1526 static void
1527 trace_status_command (char *args, int from_tty)
1528 {
1529 struct trace_status *ts = current_trace_status ();
1530 int status;
1531
1532 status = target_get_trace_status (ts);
1533
1534 if (status == -1)
1535 {
1536 if (ts->from_file)
1537 printf_filtered (_("Using a trace file.\n"));
1538 else
1539 {
1540 printf_filtered (_("Trace can not be run on this target.\n"));
1541 return;
1542 }
1543 }
1544
1545 if (!ts->running_known)
1546 {
1547 printf_filtered (_("Run/stop status is unknown.\n"));
1548 }
1549 else if (ts->running)
1550 {
1551 printf_filtered (_("Trace is running on the target.\n"));
1552 if (disconnected_tracing)
1553 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1554 else
1555 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1556 }
1557 else
1558 {
1559 switch (ts->stop_reason)
1560 {
1561 case trace_never_run:
1562 printf_filtered (_("No trace has been run on the target.\n"));
1563 break;
1564 case tstop_command:
1565 printf_filtered (_("Trace stopped by a tstop command.\n"));
1566 break;
1567 case trace_buffer_full:
1568 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1569 break;
1570 case trace_disconnected:
1571 printf_filtered (_("Trace stopped because of disconnection.\n"));
1572 break;
1573 case tracepoint_passcount:
1574 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1575 ts->stopping_tracepoint);
1576 break;
1577 case tracepoint_error:
1578 if (ts->stopping_tracepoint)
1579 printf_filtered (_("Trace stopped by an error (%s, tracepoint %d).\n"),
1580 ts->error_desc, ts->stopping_tracepoint);
1581 else
1582 printf_filtered (_("Trace stopped by an error (%s).\n"),
1583 ts->error_desc);
1584 break;
1585 case trace_stop_reason_unknown:
1586 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1587 break;
1588 default:
1589 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1590 ts->stop_reason);
1591 break;
1592 }
1593 }
1594
1595 if (ts->traceframes_created >= 0
1596 && ts->traceframe_count != ts->traceframes_created)
1597 {
1598 printf_filtered (_("Buffer contains %d trace frames (of %d created total).\n"),
1599 ts->traceframe_count, ts->traceframes_created);
1600 }
1601 else if (ts->traceframe_count >= 0)
1602 {
1603 printf_filtered (_("Collected %d trace frames.\n"),
1604 ts->traceframe_count);
1605 }
1606
1607 if (ts->buffer_free >= 0)
1608 {
1609 if (ts->buffer_size >= 0)
1610 {
1611 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1612 ts->buffer_free, ts->buffer_size);
1613 if (ts->buffer_size > 0)
1614 printf_filtered (_(" (%d%% full)"),
1615 ((int) ((((long long) (ts->buffer_size
1616 - ts->buffer_free)) * 100)
1617 / ts->buffer_size)));
1618 printf_filtered (_(".\n"));
1619 }
1620 else
1621 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1622 ts->buffer_free);
1623 }
1624
1625 /* Now report on what we're doing with tfind. */
1626 if (traceframe_number >= 0)
1627 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1628 traceframe_number, tracepoint_number);
1629 else
1630 printf_filtered (_("Not looking at any trace frame.\n"));
1631 }
1632
1633 /* Report the trace status to uiout, in a way suitable for MI, and not
1634 suitable for CLI. If ON_STOP is true, suppress a few fields that
1635 are not meaningful in the -trace-stop response.
1636
1637 The implementation is essentially parallel to trace_status_command, but
1638 merging them will result in unreadable code. */
1639 void
1640 trace_status_mi (int on_stop)
1641 {
1642 struct trace_status *ts = current_trace_status ();
1643 int status;
1644 char *string_status;
1645
1646 status = target_get_trace_status (ts);
1647
1648 if (status == -1 && !ts->from_file)
1649 {
1650 ui_out_field_string (uiout, "supported", "0");
1651 return;
1652 }
1653
1654 if (ts->from_file)
1655 ui_out_field_string (uiout, "supported", "file");
1656 else if (!on_stop)
1657 ui_out_field_string (uiout, "supported", "1");
1658
1659 gdb_assert (ts->running_known);
1660
1661 if (ts->running)
1662 {
1663 ui_out_field_string (uiout, "running", "1");
1664
1665 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1666 Given that the frontend gets the status either on -trace-stop, or from
1667 -trace-status after re-connection, it does not seem like this
1668 information is necessary for anything. It is not necessary for either
1669 figuring the vital state of the target nor for navigation of trace
1670 frames. If the frontend wants to show the current state is some
1671 configure dialog, it can request the value when such dialog is
1672 invoked by the user. */
1673 }
1674 else
1675 {
1676 char *stop_reason = NULL;
1677 int stopping_tracepoint = -1;
1678
1679 if (!on_stop)
1680 ui_out_field_string (uiout, "running", "0");
1681
1682 if (ts->stop_reason != trace_stop_reason_unknown)
1683 {
1684 switch (ts->stop_reason)
1685 {
1686 case tstop_command:
1687 stop_reason = "request";
1688 break;
1689 case trace_buffer_full:
1690 stop_reason = "overflow";
1691 break;
1692 case trace_disconnected:
1693 stop_reason = "disconnection";
1694 break;
1695 case tracepoint_passcount:
1696 stop_reason = "passcount";
1697 stopping_tracepoint = ts->stopping_tracepoint;
1698 break;
1699 case tracepoint_error:
1700 stop_reason = "error";
1701 stopping_tracepoint = ts->stopping_tracepoint;
1702 break;
1703 }
1704
1705 if (stop_reason)
1706 {
1707 ui_out_field_string (uiout, "stop-reason", stop_reason);
1708 if (stopping_tracepoint != -1)
1709 ui_out_field_int (uiout, "stopping-tracepoint",
1710 stopping_tracepoint);
1711 if (ts->stop_reason == tracepoint_error)
1712 ui_out_field_string (uiout, "error-description",
1713 ts->error_desc);
1714 }
1715 }
1716 }
1717
1718
1719 if ((int) ts->traceframe_count != -1)
1720 ui_out_field_int (uiout, "frames", ts->traceframe_count);
1721 if ((int) ts->buffer_size != -1)
1722 ui_out_field_int (uiout, "buffer-size", (int) ts->buffer_size);
1723 if ((int) ts->buffer_free != -1)
1724 ui_out_field_int (uiout, "buffer-free", (int) ts->buffer_free);
1725 }
1726
1727
1728 void
1729 disconnect_or_stop_tracing (int from_tty)
1730 {
1731 /* It can happen that the target that was tracing went away on its
1732 own, and we didn't notice. Get a status update, and if the
1733 current target doesn't even do tracing, then assume it's not
1734 running anymore. */
1735 if (target_get_trace_status (current_trace_status ()) < 0)
1736 current_trace_status ()->running = 0;
1737
1738 if (current_trace_status ()->running && from_tty)
1739 {
1740 int cont = query (_("Trace is running. Continue tracing after detach? "));
1741 /* Note that we send the query result without affecting the
1742 user's setting of disconnected_tracing, so that the answer is
1743 a one-time-only. */
1744 send_disconnected_tracing_value (cont);
1745
1746 /* Also ensure that we do the equivalent of a tstop command if
1747 tracing is not to continue after the detach. */
1748 if (!cont)
1749 stop_tracing ();
1750 }
1751 }
1752
1753 /* Worker function for the various flavors of the tfind command. */
1754 void
1755 tfind_1 (enum trace_find_type type, int num,
1756 ULONGEST addr1, ULONGEST addr2,
1757 int from_tty)
1758 {
1759 int target_frameno = -1, target_tracept = -1;
1760 struct frame_id old_frame_id;
1761 char *reply;
1762 struct breakpoint *tp;
1763
1764 old_frame_id = get_frame_id (get_current_frame ());
1765
1766 target_frameno = target_trace_find (type, num, addr1, addr2,
1767 &target_tracept);
1768
1769 if (type == tfind_number
1770 && num == -1
1771 && target_frameno == -1)
1772 {
1773 /* We told the target to get out of tfind mode, and it did. */
1774 }
1775 else if (target_frameno == -1)
1776 {
1777 /* A request for a non-existant trace frame has failed.
1778 Our response will be different, depending on FROM_TTY:
1779
1780 If FROM_TTY is true, meaning that this command was
1781 typed interactively by the user, then give an error
1782 and DO NOT change the state of traceframe_number etc.
1783
1784 However if FROM_TTY is false, meaning that we're either
1785 in a script, a loop, or a user-defined command, then
1786 DON'T give an error, but DO change the state of
1787 traceframe_number etc. to invalid.
1788
1789 The rationalle is that if you typed the command, you
1790 might just have committed a typo or something, and you'd
1791 like to NOT lose your current debugging state. However
1792 if you're in a user-defined command or especially in a
1793 loop, then you need a way to detect that the command
1794 failed WITHOUT aborting. This allows you to write
1795 scripts that search thru the trace buffer until the end,
1796 and then continue on to do something else. */
1797
1798 if (from_tty)
1799 error (_("Target failed to find requested trace frame."));
1800 else
1801 {
1802 if (info_verbose)
1803 printf_filtered ("End of trace buffer.\n");
1804 #if 0 /* dubious now? */
1805 /* The following will not recurse, since it's
1806 special-cased. */
1807 trace_find_command ("-1", from_tty);
1808 #endif
1809 }
1810 }
1811
1812 tp = get_tracepoint_by_number_on_target (target_tracept);
1813
1814 reinit_frame_cache ();
1815 registers_changed ();
1816 target_dcache_invalidate ();
1817 set_traceframe_num (target_frameno);
1818 set_tracepoint_num (tp ? tp->number : target_tracept);
1819 if (target_frameno == -1)
1820 set_traceframe_context (NULL);
1821 else
1822 set_traceframe_context (get_current_frame ());
1823
1824 if (traceframe_number >= 0)
1825 {
1826 /* Use different branches for MI and CLI to make CLI messages
1827 i18n-eable. */
1828 if (ui_out_is_mi_like_p (uiout))
1829 {
1830 ui_out_field_string (uiout, "found", "1");
1831 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
1832 ui_out_field_int (uiout, "traceframe", traceframe_number);
1833 }
1834 else
1835 {
1836 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
1837 traceframe_number, tracepoint_number);
1838 }
1839 }
1840 else
1841 {
1842 if (ui_out_is_mi_like_p (uiout))
1843 ui_out_field_string (uiout, "found", "0");
1844 else
1845 printf_unfiltered (_("No trace frame found"));
1846 }
1847
1848 /* If we're in nonstop mode and getting out of looking at trace
1849 frames, there won't be any current frame to go back to and
1850 display. */
1851 if (from_tty
1852 && (has_stack_frames () || traceframe_number >= 0))
1853 {
1854 enum print_what print_what;
1855
1856 /* NOTE: in immitation of the step command, try to determine
1857 whether we have made a transition from one function to
1858 another. If so, we'll print the "stack frame" (ie. the new
1859 function and it's arguments) -- otherwise we'll just show the
1860 new source line. */
1861
1862 if (frame_id_eq (old_frame_id,
1863 get_frame_id (get_current_frame ())))
1864 print_what = SRC_LINE;
1865 else
1866 print_what = SRC_AND_LOC;
1867
1868 print_stack_frame (get_selected_frame (NULL), 1, print_what);
1869 do_displays ();
1870 }
1871 }
1872
1873 /* trace_find_command takes a trace frame number n,
1874 sends "QTFrame:<n>" to the target,
1875 and accepts a reply that may contain several optional pieces
1876 of information: a frame number, a tracepoint number, and an
1877 indication of whether this is a trap frame or a stepping frame.
1878
1879 The minimal response is just "OK" (which indicates that the
1880 target does not give us a frame number or a tracepoint number).
1881 Instead of that, the target may send us a string containing
1882 any combination of:
1883 F<hexnum> (gives the selected frame number)
1884 T<hexnum> (gives the selected tracepoint number)
1885 */
1886
1887 /* tfind command */
1888 static void
1889 trace_find_command (char *args, int from_tty)
1890 { /* this should only be called with a numeric argument */
1891 int frameno = -1;
1892
1893 if (current_trace_status ()->running && !current_trace_status ()->from_file)
1894 error ("May not look at trace frames while trace is running.");
1895
1896 if (args == 0 || *args == 0)
1897 { /* TFIND with no args means find NEXT trace frame. */
1898 if (traceframe_number == -1)
1899 frameno = 0; /* "next" is first one */
1900 else
1901 frameno = traceframe_number + 1;
1902 }
1903 else if (0 == strcmp (args, "-"))
1904 {
1905 if (traceframe_number == -1)
1906 error (_("not debugging trace buffer"));
1907 else if (from_tty && traceframe_number == 0)
1908 error (_("already at start of trace buffer"));
1909
1910 frameno = traceframe_number - 1;
1911 }
1912 /* A hack to work around eval's need for fp to have been collected. */
1913 else if (0 == strcmp (args, "-1"))
1914 frameno = -1;
1915 else
1916 frameno = parse_and_eval_long (args);
1917
1918 if (frameno < -1)
1919 error (_("invalid input (%d is less than zero)"), frameno);
1920
1921 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
1922 }
1923
1924 /* tfind end */
1925 static void
1926 trace_find_end_command (char *args, int from_tty)
1927 {
1928 trace_find_command ("-1", from_tty);
1929 }
1930
1931 /* tfind none */
1932 static void
1933 trace_find_none_command (char *args, int from_tty)
1934 {
1935 trace_find_command ("-1", from_tty);
1936 }
1937
1938 /* tfind start */
1939 static void
1940 trace_find_start_command (char *args, int from_tty)
1941 {
1942 trace_find_command ("0", from_tty);
1943 }
1944
1945 /* tfind pc command */
1946 static void
1947 trace_find_pc_command (char *args, int from_tty)
1948 {
1949 CORE_ADDR pc;
1950 char tmp[40];
1951
1952 if (current_trace_status ()->running && !current_trace_status ()->from_file)
1953 error ("May not look at trace frames while trace is running.");
1954
1955 if (args == 0 || *args == 0)
1956 pc = regcache_read_pc (get_current_regcache ());
1957 else
1958 pc = parse_and_eval_address (args);
1959
1960 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
1961 }
1962
1963 /* tfind tracepoint command */
1964 static void
1965 trace_find_tracepoint_command (char *args, int from_tty)
1966 {
1967 int tdp;
1968 struct breakpoint *tp;
1969
1970 if (current_trace_status ()->running && !current_trace_status ()->from_file)
1971 error ("May not look at trace frames while trace is running.");
1972
1973 if (args == 0 || *args == 0)
1974 {
1975 if (tracepoint_number == -1)
1976 error (_("No current tracepoint -- please supply an argument."));
1977 else
1978 tdp = tracepoint_number; /* default is current TDP */
1979 }
1980 else
1981 tdp = parse_and_eval_long (args);
1982
1983 /* If we have the tracepoint on hand, use the number that the
1984 target knows about (which may be different if we disconnected
1985 and reconnected). */
1986 tp = get_tracepoint (tdp);
1987 if (tp)
1988 tdp = tp->number_on_target;
1989
1990 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
1991 }
1992
1993 /* TFIND LINE command:
1994
1995 This command will take a sourceline for argument, just like BREAK
1996 or TRACE (ie. anything that "decode_line_1" can handle).
1997
1998 With no argument, this command will find the next trace frame
1999 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2000
2001 static void
2002 trace_find_line_command (char *args, int from_tty)
2003 {
2004 static CORE_ADDR start_pc, end_pc;
2005 struct symtabs_and_lines sals;
2006 struct symtab_and_line sal;
2007 struct cleanup *old_chain;
2008 char startpc_str[40], endpc_str[40];
2009
2010 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2011 error ("May not look at trace frames while trace is running.");
2012
2013 if (args == 0 || *args == 0)
2014 {
2015 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2016 sals.nelts = 1;
2017 sals.sals = (struct symtab_and_line *)
2018 xmalloc (sizeof (struct symtab_and_line));
2019 sals.sals[0] = sal;
2020 }
2021 else
2022 {
2023 sals = decode_line_spec (args, 1);
2024 sal = sals.sals[0];
2025 }
2026
2027 old_chain = make_cleanup (xfree, sals.sals);
2028 if (sal.symtab == 0)
2029 {
2030 printf_filtered ("TFIND: No line number information available");
2031 if (sal.pc != 0)
2032 {
2033 /* This is useful for "info line *0x7f34". If we can't
2034 tell the user about a source line, at least let them
2035 have the symbolic address. */
2036 printf_filtered (" for address ");
2037 wrap_here (" ");
2038 print_address (get_current_arch (), sal.pc, gdb_stdout);
2039 printf_filtered (";\n -- will attempt to find by PC. \n");
2040 }
2041 else
2042 {
2043 printf_filtered (".\n");
2044 return; /* No line, no PC; what can we do? */
2045 }
2046 }
2047 else if (sal.line > 0
2048 && find_line_pc_range (sal, &start_pc, &end_pc))
2049 {
2050 if (start_pc == end_pc)
2051 {
2052 printf_filtered ("Line %d of \"%s\"",
2053 sal.line, sal.symtab->filename);
2054 wrap_here (" ");
2055 printf_filtered (" is at address ");
2056 print_address (get_current_arch (), start_pc, gdb_stdout);
2057 wrap_here (" ");
2058 printf_filtered (" but contains no code.\n");
2059 sal = find_pc_line (start_pc, 0);
2060 if (sal.line > 0
2061 && find_line_pc_range (sal, &start_pc, &end_pc)
2062 && start_pc != end_pc)
2063 printf_filtered ("Attempting to find line %d instead.\n",
2064 sal.line);
2065 else
2066 error (_("Cannot find a good line."));
2067 }
2068 }
2069 else
2070 /* Is there any case in which we get here, and have an address
2071 which the user would want to see? If we have debugging
2072 symbols and no line numbers? */
2073 error (_("Line number %d is out of range for \"%s\"."),
2074 sal.line, sal.symtab->filename);
2075
2076 /* Find within range of stated line. */
2077 if (args && *args)
2078 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
2079 else
2080 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
2081 do_cleanups (old_chain);
2082 }
2083
2084 /* tfind range command */
2085 static void
2086 trace_find_range_command (char *args, int from_tty)
2087 {
2088 static CORE_ADDR start, stop;
2089 char start_str[40], stop_str[40];
2090 char *tmp;
2091
2092 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2093 error ("May not look at trace frames while trace is running.");
2094
2095 if (args == 0 || *args == 0)
2096 { /* XXX FIXME: what should default behavior be? */
2097 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2098 return;
2099 }
2100
2101 if (0 != (tmp = strchr (args, ',')))
2102 {
2103 *tmp++ = '\0'; /* terminate start address */
2104 while (isspace ((int) *tmp))
2105 tmp++;
2106 start = parse_and_eval_address (args);
2107 stop = parse_and_eval_address (tmp);
2108 }
2109 else
2110 { /* no explicit end address? */
2111 start = parse_and_eval_address (args);
2112 stop = start + 1; /* ??? */
2113 }
2114
2115 tfind_1 (tfind_range, 0, start, stop, from_tty);
2116 }
2117
2118 /* tfind outside command */
2119 static void
2120 trace_find_outside_command (char *args, int from_tty)
2121 {
2122 CORE_ADDR start, stop;
2123 char start_str[40], stop_str[40];
2124 char *tmp;
2125
2126 if (current_trace_status ()->running && !current_trace_status ()->from_file)
2127 error ("May not look at trace frames while trace is running.");
2128
2129 if (args == 0 || *args == 0)
2130 { /* XXX FIXME: what should default behavior be? */
2131 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2132 return;
2133 }
2134
2135 if (0 != (tmp = strchr (args, ',')))
2136 {
2137 *tmp++ = '\0'; /* terminate start address */
2138 while (isspace ((int) *tmp))
2139 tmp++;
2140 start = parse_and_eval_address (args);
2141 stop = parse_and_eval_address (tmp);
2142 }
2143 else
2144 { /* no explicit end address? */
2145 start = parse_and_eval_address (args);
2146 stop = start + 1; /* ??? */
2147 }
2148
2149 tfind_1 (tfind_outside, 0, start, stop, from_tty);
2150 }
2151
2152 /* info scope command: list the locals for a scope. */
2153 static void
2154 scope_info (char *args, int from_tty)
2155 {
2156 struct symtabs_and_lines sals;
2157 struct symbol *sym;
2158 struct minimal_symbol *msym;
2159 struct block *block;
2160 char **canonical, *symname, *save_args = args;
2161 struct dict_iterator iter;
2162 int j, count = 0;
2163 struct gdbarch *gdbarch;
2164 int regno;
2165
2166 if (args == 0 || *args == 0)
2167 error (_("requires an argument (function, line or *addr) to define a scope"));
2168
2169 sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
2170 if (sals.nelts == 0)
2171 return; /* presumably decode_line_1 has already warned */
2172
2173 /* Resolve line numbers to PC */
2174 resolve_sal_pc (&sals.sals[0]);
2175 block = block_for_pc (sals.sals[0].pc);
2176
2177 while (block != 0)
2178 {
2179 QUIT; /* allow user to bail out with ^C */
2180 ALL_BLOCK_SYMBOLS (block, iter, sym)
2181 {
2182 QUIT; /* allow user to bail out with ^C */
2183 if (count == 0)
2184 printf_filtered ("Scope for %s:\n", save_args);
2185 count++;
2186
2187 symname = SYMBOL_PRINT_NAME (sym);
2188 if (symname == NULL || *symname == '\0')
2189 continue; /* probably botched, certainly useless */
2190
2191 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2192
2193 printf_filtered ("Symbol %s is ", symname);
2194 switch (SYMBOL_CLASS (sym))
2195 {
2196 default:
2197 case LOC_UNDEF: /* messed up symbol? */
2198 printf_filtered ("a bogus symbol, class %d.\n",
2199 SYMBOL_CLASS (sym));
2200 count--; /* don't count this one */
2201 continue;
2202 case LOC_CONST:
2203 printf_filtered ("a constant with value %ld (0x%lx)",
2204 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2205 break;
2206 case LOC_CONST_BYTES:
2207 printf_filtered ("constant bytes: ");
2208 if (SYMBOL_TYPE (sym))
2209 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2210 fprintf_filtered (gdb_stdout, " %02x",
2211 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2212 break;
2213 case LOC_STATIC:
2214 printf_filtered ("in static storage at address ");
2215 printf_filtered ("%s", paddress (gdbarch,
2216 SYMBOL_VALUE_ADDRESS (sym)));
2217 break;
2218 case LOC_REGISTER:
2219 /* GDBARCH is the architecture associated with the objfile
2220 the symbol is defined in; the target architecture may be
2221 different, and may provide additional registers. However,
2222 we do not know the target architecture at this point.
2223 We assume the objfile architecture will contain all the
2224 standard registers that occur in debug info in that
2225 objfile. */
2226 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
2227
2228 if (SYMBOL_IS_ARGUMENT (sym))
2229 printf_filtered ("an argument in register $%s",
2230 gdbarch_register_name (gdbarch, regno));
2231 else
2232 printf_filtered ("a local variable in register $%s",
2233 gdbarch_register_name (gdbarch, regno));
2234 break;
2235 case LOC_ARG:
2236 printf_filtered ("an argument at stack/frame offset %ld",
2237 SYMBOL_VALUE (sym));
2238 break;
2239 case LOC_LOCAL:
2240 printf_filtered ("a local variable at frame offset %ld",
2241 SYMBOL_VALUE (sym));
2242 break;
2243 case LOC_REF_ARG:
2244 printf_filtered ("a reference argument at offset %ld",
2245 SYMBOL_VALUE (sym));
2246 break;
2247 case LOC_REGPARM_ADDR:
2248 /* Note comment at LOC_REGISTER. */
2249 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
2250 printf_filtered ("the address of an argument, in register $%s",
2251 gdbarch_register_name (gdbarch, regno));
2252 break;
2253 case LOC_TYPEDEF:
2254 printf_filtered ("a typedef.\n");
2255 continue;
2256 case LOC_LABEL:
2257 printf_filtered ("a label at address ");
2258 printf_filtered ("%s", paddress (gdbarch,
2259 SYMBOL_VALUE_ADDRESS (sym)));
2260 break;
2261 case LOC_BLOCK:
2262 printf_filtered ("a function at address ");
2263 printf_filtered ("%s",
2264 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2265 break;
2266 case LOC_UNRESOLVED:
2267 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2268 NULL, NULL);
2269 if (msym == NULL)
2270 printf_filtered ("Unresolved Static");
2271 else
2272 {
2273 printf_filtered ("static storage at address ");
2274 printf_filtered ("%s",
2275 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
2276 }
2277 break;
2278 case LOC_OPTIMIZED_OUT:
2279 printf_filtered ("optimized out.\n");
2280 continue;
2281 case LOC_COMPUTED:
2282 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym, gdb_stdout);
2283 break;
2284 }
2285 if (SYMBOL_TYPE (sym))
2286 printf_filtered (", length %d.\n",
2287 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2288 }
2289 if (BLOCK_FUNCTION (block))
2290 break;
2291 else
2292 block = BLOCK_SUPERBLOCK (block);
2293 }
2294 if (count <= 0)
2295 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2296 save_args);
2297 }
2298
2299 /* worker function (cleanup) */
2300 static void
2301 replace_comma (void *data)
2302 {
2303 char *comma = data;
2304 *comma = ',';
2305 }
2306
2307 /* tdump command */
2308 static void
2309 trace_dump_command (char *args, int from_tty)
2310 {
2311 struct regcache *regcache;
2312 struct gdbarch *gdbarch;
2313 struct breakpoint *t;
2314 struct command_line *action;
2315 char *action_exp, *next_comma;
2316 struct cleanup *old_cleanups;
2317 int stepping_actions = 0;
2318 int stepping_frame = 0;
2319 struct bp_location *loc;
2320
2321 if (tracepoint_number == -1)
2322 {
2323 warning (_("No current trace frame."));
2324 return;
2325 }
2326
2327 t = get_tracepoint (tracepoint_number);
2328
2329 if (t == NULL)
2330 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2331 tracepoint_number);
2332
2333 old_cleanups = make_cleanup (null_cleanup, NULL);
2334
2335 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2336 tracepoint_number, traceframe_number);
2337
2338 /* The current frame is a trap frame if the frame PC is equal
2339 to the tracepoint PC. If not, then the current frame was
2340 collected during single-stepping. */
2341
2342 regcache = get_current_regcache ();
2343 gdbarch = get_regcache_arch (regcache);
2344
2345 /* If the traceframe's address matches any of the tracepoint's
2346 locations, assume it is a direct hit rather than a while-stepping
2347 frame. (FIXME this is not reliable, should record each frame's
2348 type.) */
2349 stepping_frame = 1;
2350 for (loc = t->loc; loc; loc = loc->next)
2351 if (loc->address == regcache_read_pc (regcache))
2352 stepping_frame = 0;
2353
2354 for (action = t->commands->commands; action; action = action->next)
2355 {
2356 struct cmd_list_element *cmd;
2357
2358 QUIT; /* allow user to bail out with ^C */
2359 action_exp = action->line;
2360 while (isspace ((int) *action_exp))
2361 action_exp++;
2362
2363 /* The collection actions to be done while stepping are
2364 bracketed by the commands "while-stepping" and "end". */
2365
2366 if (*action_exp == '#') /* comment line */
2367 continue;
2368
2369 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2370 if (cmd == 0)
2371 error (_("Bad action list item: %s"), action_exp);
2372
2373 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2374 stepping_actions = 1;
2375 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
2376 stepping_actions = 0;
2377 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2378 {
2379 /* Display the collected data.
2380 For the trap frame, display only what was collected at
2381 the trap. Likewise for stepping frames, display only
2382 what was collected while stepping. This means that the
2383 two boolean variables, STEPPING_FRAME and
2384 STEPPING_ACTIONS should be equal. */
2385 if (stepping_frame == stepping_actions)
2386 {
2387 do
2388 { /* repeat over a comma-separated list */
2389 QUIT; /* allow user to bail out with ^C */
2390 if (*action_exp == ',')
2391 action_exp++;
2392 while (isspace ((int) *action_exp))
2393 action_exp++;
2394
2395 next_comma = strchr (action_exp, ',');
2396
2397 if (0 == strncasecmp (action_exp, "$reg", 4))
2398 registers_info (NULL, from_tty);
2399 else if (0 == strncasecmp (action_exp, "$loc", 4))
2400 locals_info (NULL, from_tty);
2401 else if (0 == strncasecmp (action_exp, "$arg", 4))
2402 args_info (NULL, from_tty);
2403 else
2404 { /* variable */
2405 if (next_comma)
2406 {
2407 make_cleanup (replace_comma, next_comma);
2408 *next_comma = '\0';
2409 }
2410 printf_filtered ("%s = ", action_exp);
2411 output_command (action_exp, from_tty);
2412 printf_filtered ("\n");
2413 }
2414 if (next_comma)
2415 *next_comma = ',';
2416 action_exp = next_comma;
2417 }
2418 while (action_exp && *action_exp == ',');
2419 }
2420 }
2421 }
2422 discard_cleanups (old_cleanups);
2423 }
2424
2425 extern int trace_regblock_size;
2426
2427 /* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2428 non-zero, the save is performed on the target, otherwise GDB obtains all
2429 trace data and saves it locally. */
2430
2431 void
2432 trace_save (const char *filename, int target_does_save)
2433 {
2434 struct cleanup *cleanup;
2435 char *pathname;
2436 struct trace_status *ts = current_trace_status ();
2437 int err, status;
2438 FILE *fp;
2439 struct uploaded_tp *uploaded_tps = NULL, *utp;
2440 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2441 int a;
2442 LONGEST gotten = 0;
2443 ULONGEST offset = 0;
2444 #define MAX_TRACE_UPLOAD 2000
2445 gdb_byte buf[MAX_TRACE_UPLOAD];
2446 int written;
2447
2448 /* If the target is to save the data to a file on its own, then just
2449 send the command and be done with it. */
2450 if (target_does_save)
2451 {
2452 err = target_save_trace_data (filename);
2453 if (err < 0)
2454 error (_("Target failed to save trace data to '%s'."),
2455 filename);
2456 return;
2457 }
2458
2459 /* Get the trace status first before opening the file, so if the
2460 target is losing, we can get out without touching files. */
2461 status = target_get_trace_status (ts);
2462
2463 pathname = tilde_expand (filename);
2464 cleanup = make_cleanup (xfree, pathname);
2465
2466 fp = fopen (pathname, "w");
2467 if (!fp)
2468 error (_("Unable to open file '%s' for saving trace data (%s)"),
2469 filename, safe_strerror (errno));
2470 make_cleanup_fclose (fp);
2471
2472 /* Write a file header, with a high-bit-set char to indicate a
2473 binary file, plus a hint as what this file is, and a version
2474 number in case of future needs. */
2475 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
2476 if (written < 8)
2477 perror_with_name (pathname);
2478
2479 /* Write descriptive info. */
2480
2481 /* Write out the size of a register block. */
2482 fprintf (fp, "R %x\n", trace_regblock_size);
2483
2484 /* Write out status of the tracing run (aka "tstatus" info). */
2485 fprintf (fp, "status %c;%s",
2486 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
2487 if (ts->stop_reason == tracepoint_error)
2488 {
2489 char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
2490 bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
2491 fprintf (fp, ":%s", buf);
2492 }
2493 fprintf (fp, ":%x", ts->stopping_tracepoint);
2494 if (ts->traceframe_count >= 0)
2495 fprintf (fp, ";tframes:%x", ts->traceframe_count);
2496 if (ts->traceframes_created >= 0)
2497 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2498 if (ts->buffer_free >= 0)
2499 fprintf (fp, ";tfree:%x", ts->buffer_free);
2500 if (ts->buffer_size >= 0)
2501 fprintf (fp, ";tsize:%x", ts->buffer_size);
2502 fprintf (fp, "\n");
2503
2504 /* Note that we want to upload tracepoints and save those, rather
2505 than simply writing out the local ones, because the user may have
2506 changed tracepoints in GDB in preparation for a future tracing
2507 run, or maybe just mass-deleted all types of breakpoints as part
2508 of cleaning up. So as not to contaminate the session, leave the
2509 data in its uploaded form, don't make into real tracepoints. */
2510
2511 /* Get trace state variables first, they may be checked when parsing
2512 uploaded commands. */
2513
2514 target_upload_trace_state_variables (&uploaded_tsvs);
2515
2516 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2517 {
2518 char *buf = "";
2519
2520 if (utsv->name)
2521 {
2522 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2523 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2524 }
2525
2526 fprintf (fp, "tsv %x:%s:%x:%s\n",
2527 utsv->number, phex_nz (utsv->initial_value, 8),
2528 utsv->builtin, buf);
2529
2530 if (utsv->name)
2531 xfree (buf);
2532 }
2533
2534 free_uploaded_tsvs (&uploaded_tsvs);
2535
2536 target_upload_tracepoints (&uploaded_tps);
2537
2538 for (utp = uploaded_tps; utp; utp = utp->next)
2539 {
2540 fprintf (fp, "tp T%x:%s:%c:%x:%x",
2541 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2542 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2543 if (utp->type == bp_fast_tracepoint)
2544 fprintf (fp, ":F%x", utp->orig_size);
2545 if (utp->cond)
2546 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2547 utp->cond);
2548 fprintf (fp, "\n");
2549 for (a = 0; a < utp->numactions; ++a)
2550 fprintf (fp, "tp A%x:%s:%s\n",
2551 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2552 utp->actions[a]);
2553 for (a = 0; a < utp->num_step_actions; ++a)
2554 fprintf (fp, "tp S%x:%s:%s\n",
2555 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2556 utp->step_actions[a]);
2557 }
2558
2559 free_uploaded_tps (&uploaded_tps);
2560
2561 /* Mark the end of the definition section. */
2562 fprintf (fp, "\n");
2563
2564 /* Get and write the trace data proper. We ask for big blocks, in
2565 the hopes of efficiency, but will take less if the target has
2566 packet size limitations or some such. */
2567 while (1)
2568 {
2569 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2570 if (gotten < 0)
2571 error (_("Failure to get requested trace buffer data"));
2572 /* No more data is forthcoming, we're done. */
2573 if (gotten == 0)
2574 break;
2575 written = fwrite (buf, gotten, 1, fp);
2576 if (written < gotten)
2577 perror_with_name (pathname);
2578 offset += gotten;
2579 }
2580
2581 /* Mark the end of trace data. */
2582 written = fwrite (&gotten, 4, 1, fp);
2583 if (written < 4)
2584 perror_with_name (pathname);
2585
2586 do_cleanups (cleanup);
2587 }
2588
2589 static void
2590 trace_save_command (char *args, int from_tty)
2591 {
2592 int target_does_save = 0;
2593 char **argv;
2594 char *filename = NULL;
2595 struct cleanup *back_to;
2596
2597 if (args == NULL)
2598 error_no_arg (_("file in which to save trace data"));
2599
2600 argv = gdb_buildargv (args);
2601 back_to = make_cleanup_freeargv (argv);
2602
2603 for (; *argv; ++argv)
2604 {
2605 if (strcmp (*argv, "-r") == 0)
2606 target_does_save = 1;
2607 else if (**argv == '-')
2608 error (_("unknown option `%s'"), *argv);
2609 else
2610 filename = *argv;
2611 }
2612
2613 if (!filename)
2614 error_no_arg (_("file in which to save trace data"));
2615
2616 trace_save (filename, target_does_save);
2617
2618 if (from_tty)
2619 printf_filtered (_("Trace data saved to file '%s'.\n"), args);
2620
2621 do_cleanups (back_to);
2622 }
2623
2624 /* Tell the target what to do with an ongoing tracing run if GDB
2625 disconnects for some reason. */
2626
2627 void
2628 send_disconnected_tracing_value (int value)
2629 {
2630 target_set_disconnected_tracing (value);
2631 }
2632
2633 static void
2634 set_disconnected_tracing (char *args, int from_tty,
2635 struct cmd_list_element *c)
2636 {
2637 send_disconnected_tracing_value (disconnected_tracing);
2638 }
2639
2640 static void
2641 set_circular_trace_buffer (char *args, int from_tty,
2642 struct cmd_list_element *c)
2643 {
2644 target_set_circular_trace_buffer (circular_trace_buffer);
2645 }
2646
2647 /* Convert the memory pointed to by mem into hex, placing result in buf.
2648 * Return a pointer to the last char put in buf (null)
2649 * "stolen" from sparc-stub.c
2650 */
2651
2652 static const char hexchars[] = "0123456789abcdef";
2653
2654 static char *
2655 mem2hex (gdb_byte *mem, char *buf, int count)
2656 {
2657 gdb_byte ch;
2658
2659 while (count-- > 0)
2660 {
2661 ch = *mem++;
2662
2663 *buf++ = hexchars[ch >> 4];
2664 *buf++ = hexchars[ch & 0xf];
2665 }
2666
2667 *buf = 0;
2668
2669 return buf;
2670 }
2671
2672 int
2673 get_traceframe_number (void)
2674 {
2675 return traceframe_number;
2676 }
2677
2678 /* Make the traceframe NUM be the current trace frame. Does nothing
2679 if NUM is already current. */
2680
2681 void
2682 set_traceframe_number (int num)
2683 {
2684 int newnum;
2685
2686 if (traceframe_number == num)
2687 {
2688 /* Nothing to do. */
2689 return;
2690 }
2691
2692 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
2693
2694 if (newnum != num)
2695 warning (_("could not change traceframe"));
2696
2697 traceframe_number = newnum;
2698
2699 /* Changing the traceframe changes our view of registers and of the
2700 frame chain. */
2701 registers_changed ();
2702 }
2703
2704 /* A cleanup used when switching away and back from tfind mode. */
2705
2706 struct current_traceframe_cleanup
2707 {
2708 /* The traceframe we were inspecting. */
2709 int traceframe_number;
2710 };
2711
2712 static void
2713 do_restore_current_traceframe_cleanup (void *arg)
2714 {
2715 struct current_traceframe_cleanup *old = arg;
2716
2717 set_traceframe_number (old->traceframe_number);
2718 }
2719
2720 static void
2721 restore_current_traceframe_cleanup_dtor (void *arg)
2722 {
2723 struct current_traceframe_cleanup *old = arg;
2724
2725 xfree (old);
2726 }
2727
2728 struct cleanup *
2729 make_cleanup_restore_current_traceframe (void)
2730 {
2731 struct current_traceframe_cleanup *old;
2732
2733 old = xmalloc (sizeof (struct current_traceframe_cleanup));
2734 old->traceframe_number = traceframe_number;
2735
2736 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
2737 restore_current_traceframe_cleanup_dtor);
2738 }
2739
2740 /* Given a number and address, return an uploaded tracepoint with that
2741 number, creating if necessary. */
2742
2743 struct uploaded_tp *
2744 get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
2745 {
2746 struct uploaded_tp *utp;
2747
2748 for (utp = *utpp; utp; utp = utp->next)
2749 if (utp->number == num && utp->addr == addr)
2750 return utp;
2751 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
2752 memset (utp, 0, sizeof (struct uploaded_tp));
2753 utp->number = num;
2754 utp->addr = addr;
2755 utp->next = *utpp;
2756 *utpp = utp;
2757 return utp;
2758 }
2759
2760 static void
2761 free_uploaded_tps (struct uploaded_tp **utpp)
2762 {
2763 struct uploaded_tp *next_one;
2764
2765 while (*utpp)
2766 {
2767 next_one = (*utpp)->next;
2768 xfree (*utpp);
2769 *utpp = next_one;
2770 }
2771 }
2772
2773 /* Given a number and address, return an uploaded tracepoint with that
2774 number, creating if necessary. */
2775
2776 struct uploaded_tsv *
2777 get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
2778 {
2779 struct uploaded_tsv *utsv;
2780
2781 for (utsv = *utsvp; utsv; utsv = utsv->next)
2782 if (utsv->number == num)
2783 return utsv;
2784 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
2785 memset (utsv, 0, sizeof (struct uploaded_tsv));
2786 utsv->number = num;
2787 utsv->next = *utsvp;
2788 *utsvp = utsv;
2789 return utsv;
2790 }
2791
2792 static void
2793 free_uploaded_tsvs (struct uploaded_tsv **utsvp)
2794 {
2795 struct uploaded_tsv *next_one;
2796
2797 while (*utsvp)
2798 {
2799 next_one = (*utsvp)->next;
2800 xfree (*utsvp);
2801 *utsvp = next_one;
2802 }
2803 }
2804
2805 /* Look for an existing tracepoint that seems similar enough to the
2806 uploaded one. Enablement isn't compared, because the user can
2807 toggle that freely, and may have done so in anticipation of the
2808 next trace run. */
2809
2810 struct breakpoint *
2811 find_matching_tracepoint (struct uploaded_tp *utp)
2812 {
2813 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
2814 int ix;
2815 struct breakpoint *t;
2816 struct bp_location *loc;
2817
2818 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
2819 {
2820 if (t->type == utp->type
2821 && t->step_count == utp->step
2822 && t->pass_count == utp->pass
2823 /* FIXME also test conditionals and actions */
2824 )
2825 {
2826 /* Scan the locations for an address match. */
2827 for (loc = t->loc; loc; loc = loc->next)
2828 {
2829 if (loc->address == utp->addr)
2830 return t;
2831 }
2832 }
2833 }
2834 return NULL;
2835 }
2836
2837 /* Given a list of tracepoints uploaded from a target, attempt to
2838 match them up with existing tracepoints, and create new ones if not
2839 found. */
2840
2841 void
2842 merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
2843 {
2844 struct uploaded_tp *utp;
2845 struct breakpoint *t;
2846
2847 /* Look for GDB tracepoints that match up with our uploaded versions. */
2848 for (utp = *uploaded_tps; utp; utp = utp->next)
2849 {
2850 t = find_matching_tracepoint (utp);
2851 if (t)
2852 printf_filtered (_("Assuming tracepoint %d is same as target's tracepoint %d at %s.\n"),
2853 t->number, utp->number, paddress (get_current_arch (), utp->addr));
2854 else
2855 {
2856 t = create_tracepoint_from_upload (utp);
2857 if (t)
2858 printf_filtered (_("Created tracepoint %d for target's tracepoint %d at %s.\n"),
2859 t->number, utp->number, paddress (get_current_arch (), utp->addr));
2860 else
2861 printf_filtered (_("Failed to create tracepoint for target's tracepoint %d at %s, skipping it.\n"),
2862 utp->number, paddress (get_current_arch (), utp->addr));
2863 }
2864 /* Whether found or created, record the number used by the
2865 target, to help with mapping target tracepoints back to their
2866 counterparts here. */
2867 if (t)
2868 t->number_on_target = utp->number;
2869 }
2870
2871 free_uploaded_tps (uploaded_tps);
2872 }
2873
2874 /* Trace state variables don't have much to identify them beyond their
2875 name, so just use that to detect matches. */
2876
2877 struct trace_state_variable *
2878 find_matching_tsv (struct uploaded_tsv *utsv)
2879 {
2880 if (!utsv->name)
2881 return NULL;
2882
2883 return find_trace_state_variable (utsv->name);
2884 }
2885
2886 struct trace_state_variable *
2887 create_tsv_from_upload (struct uploaded_tsv *utsv)
2888 {
2889 const char *namebase;
2890 char buf[20];
2891 int try_num = 0;
2892 struct trace_state_variable *tsv;
2893
2894 if (utsv->name)
2895 {
2896 namebase = utsv->name;
2897 sprintf (buf, "%s", namebase);
2898 }
2899 else
2900 {
2901 namebase = "__tsv";
2902 sprintf (buf, "%s_%d", namebase, try_num++);
2903 }
2904
2905 /* Fish for a name that is not in use. */
2906 /* (should check against all internal vars?) */
2907 while (find_trace_state_variable (buf))
2908 sprintf (buf, "%s_%d", namebase, try_num++);
2909
2910 /* We have an available name, create the variable. */
2911 tsv = create_trace_state_variable (xstrdup (buf));
2912 tsv->initial_value = utsv->initial_value;
2913 tsv->builtin = utsv->builtin;
2914
2915 return tsv;
2916 }
2917
2918 /* Given a list of uploaded trace state variables, try to match them
2919 up with existing variables, or create additional ones. */
2920
2921 void
2922 merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
2923 {
2924 int ix;
2925 struct uploaded_tsv *utsv;
2926 struct trace_state_variable *tsv;
2927 int highest;
2928
2929 /* Most likely some numbers will have to be reassigned as part of
2930 the merge, so clear them all in anticipation. */
2931 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
2932 tsv->number = 0;
2933
2934 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
2935 {
2936 tsv = find_matching_tsv (utsv);
2937 if (tsv)
2938 printf_filtered (_("Assuming trace state variable $%s is same as target's variable %d.\n"),
2939 tsv->name, utsv->number);
2940 else
2941 {
2942 tsv = create_tsv_from_upload (utsv);
2943 printf_filtered (_("Created trace state variable $%s for target's variable %d.\n"),
2944 tsv->name, utsv->number);
2945 }
2946 /* Give precedence to numberings that come from the target. */
2947 if (tsv)
2948 tsv->number = utsv->number;
2949 }
2950
2951 /* Renumber everything that didn't get a target-assigned number. */
2952 highest = 0;
2953 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
2954 if (tsv->number > highest)
2955 highest = tsv->number;
2956
2957 ++highest;
2958 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
2959 if (tsv->number == 0)
2960 tsv->number = highest++;
2961
2962 free_uploaded_tsvs (uploaded_tsvs);
2963 }
2964
2965 /* target tfile command */
2966
2967 struct target_ops tfile_ops;
2968
2969 /* Fill in tfile_ops with its defined operations and properties. */
2970
2971 #define TRACE_HEADER_SIZE 8
2972
2973 char *trace_filename;
2974 int trace_fd = -1;
2975 off_t trace_frames_offset;
2976 off_t cur_offset;
2977 int cur_data_size;
2978 int trace_regblock_size;
2979
2980 static void tfile_interp_line (char *line,
2981 struct uploaded_tp **utpp,
2982 struct uploaded_tsv **utsvp);
2983
2984 static void
2985 tfile_open (char *filename, int from_tty)
2986 {
2987 char *temp;
2988 struct cleanup *old_chain;
2989 int flags;
2990 int scratch_chan;
2991 char header[TRACE_HEADER_SIZE];
2992 char linebuf[1000]; /* should be max remote packet size or so */
2993 char byte;
2994 int bytes, i, gotten;
2995 struct trace_status *ts;
2996 struct uploaded_tp *uploaded_tps = NULL;
2997 struct uploaded_tsv *uploaded_tsvs = NULL;
2998
2999 target_preopen (from_tty);
3000 if (!filename)
3001 error (_("No trace file specified."));
3002
3003 filename = tilde_expand (filename);
3004 if (!IS_ABSOLUTE_PATH(filename))
3005 {
3006 temp = concat (current_directory, "/", filename, (char *)NULL);
3007 xfree (filename);
3008 filename = temp;
3009 }
3010
3011 old_chain = make_cleanup (xfree, filename);
3012
3013 flags = O_BINARY | O_LARGEFILE;
3014 flags |= O_RDONLY;
3015 scratch_chan = open (filename, flags, 0);
3016 if (scratch_chan < 0)
3017 perror_with_name (filename);
3018
3019 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3020
3021 discard_cleanups (old_chain); /* Don't free filename any more */
3022 unpush_target (&tfile_ops);
3023
3024 push_target (&tfile_ops);
3025
3026 trace_filename = xstrdup (filename);
3027 trace_fd = scratch_chan;
3028
3029 bytes = 0;
3030 /* Read the file header and test for validity. */
3031 gotten = read (trace_fd, &header, TRACE_HEADER_SIZE);
3032 if (gotten < 0)
3033 perror_with_name (trace_filename);
3034 else if (gotten < TRACE_HEADER_SIZE)
3035 error (_("Premature end of file while reading trace file"));
3036
3037 bytes += TRACE_HEADER_SIZE;
3038 if (!(header[0] == 0x7f
3039 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3040 error (_("File is not a valid trace file."));
3041
3042 trace_regblock_size = 0;
3043 ts = current_trace_status ();
3044 /* We know we're working with a file. */
3045 ts->from_file = 1;
3046 /* Set defaults in case there is no status line. */
3047 ts->running_known = 0;
3048 ts->stop_reason = trace_stop_reason_unknown;
3049 ts->traceframe_count = -1;
3050 ts->buffer_free = 0;
3051
3052 /* Read through a section of newline-terminated lines that
3053 define things like tracepoints. */
3054 i = 0;
3055 while (1)
3056 {
3057 gotten = read (trace_fd, &byte, 1);
3058 if (gotten < 0)
3059 perror_with_name (trace_filename);
3060 else if (gotten < 1)
3061 error (_("Premature end of file while reading trace file"));
3062
3063 ++bytes;
3064 if (byte == '\n')
3065 {
3066 /* Empty line marks end of the definition section. */
3067 if (i == 0)
3068 break;
3069 linebuf[i] = '\0';
3070 i = 0;
3071 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3072 }
3073 else
3074 linebuf[i++] = byte;
3075 if (i >= 1000)
3076 error (_("Excessively long lines in trace file"));
3077 }
3078
3079 /* Add the file's tracepoints and variables into the current mix. */
3080
3081 /* Get trace state variables first, they may be checked when parsing
3082 uploaded commands. */
3083 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3084
3085 merge_uploaded_tracepoints (&uploaded_tps);
3086
3087 /* Record the starting offset of the binary trace data. */
3088 trace_frames_offset = bytes;
3089
3090 /* If we don't have a blocksize, we can't interpret the
3091 traceframes. */
3092 if (trace_regblock_size == 0)
3093 error (_("No register block size recorded in trace file"));
3094 if (ts->traceframe_count <= 0)
3095 {
3096 warning ("No traceframes present in this file.");
3097 return;
3098 }
3099
3100 #define TFILE_PID (1)
3101 inferior_appeared (current_inferior (), TFILE_PID);
3102 inferior_ptid = pid_to_ptid (TFILE_PID);
3103 add_thread_silent (inferior_ptid);
3104
3105 post_create_inferior (&tfile_ops, from_tty);
3106
3107 #if 0
3108 /* FIXME this will get defined in MI patch submission */
3109 tfind_1 (tfind_number, 0, 0, 0, 0);
3110 #endif
3111 }
3112
3113 /* Interpret the given line from the definitions part of the trace
3114 file. */
3115
3116 static void
3117 tfile_interp_line (char *line,
3118 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3119 {
3120 char *p = line;
3121
3122 if (strncmp (p, "R ", strlen ("R ")) == 0)
3123 {
3124 p += strlen ("R ");
3125 trace_regblock_size = strtol (p, &p, 16);
3126 }
3127 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3128 {
3129 p += strlen ("status ");
3130 parse_trace_status (p, current_trace_status ());
3131 }
3132 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3133 {
3134 p += strlen ("tp ");
3135 parse_tracepoint_definition (p, utpp);
3136 }
3137 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3138 {
3139 p += strlen ("tsv ");
3140 parse_tsv_definition (p, utsvp);
3141 }
3142 else
3143 warning ("Ignoring trace file definition \"%s\"", line);
3144 }
3145
3146 /* Parse the part of trace status syntax that is shared between
3147 the remote protocol and the trace file reader. */
3148
3149 extern char *unpack_varlen_hex (char *buff, ULONGEST *result);
3150
3151 void
3152 parse_trace_status (char *line, struct trace_status *ts)
3153 {
3154 char *p = line, *p1, *p2, *p_temp;
3155 ULONGEST val;
3156
3157 ts->running_known = 1;
3158 ts->running = (*p++ == '1');
3159 ts->stop_reason = trace_stop_reason_unknown;
3160 ts->error_desc = "";
3161 ts->traceframe_count = -1;
3162 ts->traceframes_created = -1;
3163 ts->buffer_free = -1;
3164 ts->buffer_size = -1;
3165
3166 while (*p++)
3167 {
3168 p1 = strchr (p, ':');
3169 if (p1 == NULL)
3170 error (_("Malformed trace status, at %s\n\
3171 Status line: '%s'\n"), p, line);
3172 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3173 {
3174 p = unpack_varlen_hex (++p1, &val);
3175 ts->stop_reason = trace_buffer_full;
3176 }
3177 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3178 {
3179 p = unpack_varlen_hex (++p1, &val);
3180 ts->stop_reason = trace_never_run;
3181 }
3182 else if (strncmp (p, stop_reason_names[tracepoint_passcount], p1 - p) == 0)
3183 {
3184 p = unpack_varlen_hex (++p1, &val);
3185 ts->stop_reason = tracepoint_passcount;
3186 ts->stopping_tracepoint = val;
3187 }
3188 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3189 {
3190 p = unpack_varlen_hex (++p1, &val);
3191 ts->stop_reason = tstop_command;
3192 }
3193 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3194 {
3195 p2 = strchr (++p1, ':');
3196 if (p2 != p1)
3197 {
3198 int end;
3199
3200 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3201 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
3202 ts->error_desc[end] = '\0';
3203 }
3204 p = unpack_varlen_hex (++p2, &val);
3205 ts->stopping_tracepoint = val;
3206 ts->stop_reason = tracepoint_error;
3207 }
3208 else if (strncmp (p, "tframes", p1 - p) == 0)
3209 {
3210 p = unpack_varlen_hex (++p1, &val);
3211 ts->traceframe_count = val;
3212 }
3213 else if (strncmp (p, "tcreated", p1 - p) == 0)
3214 {
3215 p = unpack_varlen_hex (++p1, &val);
3216 ts->traceframes_created = val;
3217 }
3218 else if (strncmp (p, "tfree", p1 - p) == 0)
3219 {
3220 p = unpack_varlen_hex (++p1, &val);
3221 ts->buffer_free = val;
3222 }
3223 else if (strncmp (p, "tsize", p1 - p) == 0)
3224 {
3225 p = unpack_varlen_hex (++p1, &val);
3226 ts->buffer_size = val;
3227 }
3228 else
3229 {
3230 /* Silently skip unknown optional info. */
3231 p_temp = strchr (p1 + 1, ';');
3232 if (p_temp)
3233 p = p_temp;
3234 else
3235 /* Must be at the end. */
3236 break;
3237 }
3238 }
3239 }
3240
3241 /* Given a line of text defining a tracepoint or tracepoint action, parse
3242 it into an "uploaded tracepoint". */
3243
3244 void
3245 parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3246 {
3247 char *p;
3248 char piece;
3249 ULONGEST num, addr, step, pass, orig_size, xlen;
3250 int enabled, i;
3251 enum bptype type;
3252 char *cond;
3253 struct uploaded_tp *utp = NULL;
3254
3255 p = line;
3256 /* Both tracepoint and action definitions start with the same number
3257 and address sequence. */
3258 piece = *p++;
3259 p = unpack_varlen_hex (p, &num);
3260 p++; /* skip a colon */
3261 p = unpack_varlen_hex (p, &addr);
3262 p++; /* skip a colon */
3263 if (piece == 'T')
3264 {
3265 enabled = (*p++ == 'E');
3266 p++; /* skip a colon */
3267 p = unpack_varlen_hex (p, &step);
3268 p++; /* skip a colon */
3269 p = unpack_varlen_hex (p, &pass);
3270 type = bp_tracepoint;
3271 cond = NULL;
3272 /* Thumb through optional fields. */
3273 while (*p == ':')
3274 {
3275 p++; /* skip a colon */
3276 if (*p == 'F')
3277 {
3278 type = bp_fast_tracepoint;
3279 p++;
3280 p = unpack_varlen_hex (p, &orig_size);
3281 }
3282 else if (*p == 'X')
3283 {
3284 p++;
3285 p = unpack_varlen_hex (p, &xlen);
3286 p++; /* skip a comma */
3287 cond = (char *) xmalloc (2 * xlen + 1);
3288 strncpy (cond, p, 2 * xlen);
3289 cond[2 * xlen] = '\0';
3290 p += 2 * xlen;
3291 }
3292 else
3293 warning ("Unrecognized char '%c' in tracepoint definition, skipping rest", *p);
3294 }
3295 utp = get_uploaded_tp (num, addr, utpp);
3296 utp->type = type;
3297 utp->enabled = enabled;
3298 utp->step = step;
3299 utp->pass = pass;
3300 utp->cond = cond;
3301 }
3302 else if (piece == 'A')
3303 {
3304 utp = get_uploaded_tp (num, addr, utpp);
3305 utp->actions[utp->numactions++] = xstrdup (p);
3306 }
3307 else if (piece == 'S')
3308 {
3309 utp = get_uploaded_tp (num, addr, utpp);
3310 utp->step_actions[utp->num_step_actions++] = xstrdup (p);
3311 }
3312 else
3313 {
3314 error ("Invalid tracepoint piece");
3315 }
3316 }
3317
3318 /* Convert a textual description of a trace state variable into an
3319 uploaded object. */
3320
3321 void
3322 parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3323 {
3324 char *p, *buf;
3325 ULONGEST num, initval, builtin;
3326 int end;
3327 struct uploaded_tsv *utsv = NULL;
3328
3329 buf = alloca (strlen (line));
3330
3331 p = line;
3332 p = unpack_varlen_hex (p, &num);
3333 p++; /* skip a colon */
3334 p = unpack_varlen_hex (p, &initval);
3335 p++; /* skip a colon */
3336 p = unpack_varlen_hex (p, &builtin);
3337 p++; /* skip a colon */
3338 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3339 buf[end] = '\0';
3340
3341 utsv = get_uploaded_tsv (num, utsvp);
3342 utsv->initial_value = initval;
3343 utsv->builtin = builtin;
3344 utsv->name = xstrdup (buf);
3345 }
3346
3347 /* Close the trace file and generally clean up. */
3348
3349 static void
3350 tfile_close (int quitting)
3351 {
3352 int pid;
3353
3354 if (trace_fd < 0)
3355 return;
3356
3357 pid = ptid_get_pid (inferior_ptid);
3358 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff */
3359 exit_inferior_silent (pid);
3360
3361 close (trace_fd);
3362 trace_fd = -1;
3363 if (trace_filename)
3364 xfree (trace_filename);
3365 }
3366
3367 static void
3368 tfile_files_info (struct target_ops *t)
3369 {
3370 /* (it would be useful to mention the name of the file) */
3371 printf_filtered ("Looking at a trace file.\n");
3372 }
3373
3374 /* The trace status for a file is that tracing can never be run. */
3375
3376 static int
3377 tfile_get_trace_status (struct trace_status *ts)
3378 {
3379 /* Other bits of trace status were collected as part of opening the
3380 trace files, so nothing to do here. */
3381
3382 return -1;
3383 }
3384
3385 /* Given the position of a traceframe in the file, figure out what
3386 address the frame was collected at. This would normally be the
3387 value of a collected PC register, but if not available, we
3388 improvise. */
3389
3390 static ULONGEST
3391 tfile_get_traceframe_address (off_t tframe_offset)
3392 {
3393 ULONGEST addr = 0;
3394 short tpnum;
3395 struct breakpoint *tp;
3396 off_t saved_offset = cur_offset;
3397 int gotten;
3398
3399 /* FIXME dig pc out of collected registers */
3400
3401 /* Fall back to using tracepoint address. */
3402 lseek (trace_fd, tframe_offset, SEEK_SET);
3403 gotten = read (trace_fd, &tpnum, 2);
3404 if (gotten < 0)
3405 perror_with_name (trace_filename);
3406 else if (gotten < 2)
3407 error (_("Premature end of file while reading trace file"));
3408
3409 tp = get_tracepoint_by_number_on_target (tpnum);
3410 /* FIXME this is a poor heuristic if multiple locations */
3411 if (tp && tp->loc)
3412 addr = tp->loc->address;
3413
3414 /* Restore our seek position. */
3415 cur_offset = saved_offset;
3416 lseek (trace_fd, cur_offset, SEEK_SET);
3417 return addr;
3418 }
3419
3420 /* Given a type of search and some parameters, scan the collection of
3421 traceframes in the file looking for a match. When found, return
3422 both the traceframe and tracepoint number, otherwise -1 for
3423 each. */
3424
3425 static int
3426 tfile_trace_find (enum trace_find_type type, int num,
3427 ULONGEST addr1, ULONGEST addr2, int *tpp)
3428 {
3429 short tpnum;
3430 int tfnum = 0, found = 0, gotten;
3431 int data_size;
3432 struct breakpoint *tp;
3433 off_t offset, tframe_offset;
3434 ULONGEST tfaddr;
3435
3436 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3437 offset = trace_frames_offset;
3438 while (1)
3439 {
3440 tframe_offset = offset;
3441 gotten = read (trace_fd, &tpnum, 2);
3442 if (gotten < 0)
3443 perror_with_name (trace_filename);
3444 else if (gotten < 2)
3445 error (_("Premature end of file while reading trace file"));
3446 offset += 2;
3447 if (tpnum == 0)
3448 break;
3449 gotten = read (trace_fd, &data_size, 4);
3450 if (gotten < 0)
3451 perror_with_name (trace_filename);
3452 else if (gotten < 4)
3453 error (_("Premature end of file while reading trace file"));
3454 offset += 4;
3455 switch (type)
3456 {
3457 case tfind_number:
3458 if (tfnum == num)
3459 found = 1;
3460 break;
3461 case tfind_pc:
3462 tfaddr = tfile_get_traceframe_address (tframe_offset);
3463 if (tfaddr == addr1)
3464 found = 1;
3465 break;
3466 case tfind_tp:
3467 tp = get_tracepoint (num);
3468 if (tp && tpnum == tp->number_on_target)
3469 found = 1;
3470 break;
3471 case tfind_range:
3472 tfaddr = tfile_get_traceframe_address (tframe_offset);
3473 if (addr1 <= tfaddr && tfaddr <= addr2)
3474 found = 1;
3475 break;
3476 case tfind_outside:
3477 tfaddr = tfile_get_traceframe_address (tframe_offset);
3478 if (!(addr1 <= tfaddr && tfaddr <= addr2))
3479 found = 1;
3480 break;
3481 default:
3482 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3483 }
3484 if (found)
3485 {
3486 if (tpp)
3487 *tpp = tpnum;
3488 cur_offset = offset;
3489 cur_data_size = data_size;
3490 return tfnum;
3491 }
3492 /* Skip past the traceframe's data. */
3493 lseek (trace_fd, data_size, SEEK_CUR);
3494 offset += data_size;
3495 /* Update our own count of traceframes. */
3496 ++tfnum;
3497 }
3498 /* Did not find what we were looking for. */
3499 if (tpp)
3500 *tpp = -1;
3501 return -1;
3502 }
3503
3504 /* Look for a block of saved registers in the traceframe, and get the
3505 requested register from it. */
3506
3507 static void
3508 tfile_fetch_registers (struct target_ops *ops,
3509 struct regcache *regcache, int regno)
3510 {
3511 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3512 char block_type;
3513 int i, pos, offset, regn, regsize, gotten;
3514 unsigned short mlen;
3515 char *regs;
3516
3517 /* An uninitialized reg size says we're not going to be
3518 successful at getting register blocks. */
3519 if (!trace_regblock_size)
3520 return;
3521
3522 regs = alloca (trace_regblock_size);
3523
3524 lseek (trace_fd, cur_offset, SEEK_SET);
3525 pos = 0;
3526 while (pos < cur_data_size)
3527 {
3528 gotten = read (trace_fd, &block_type, 1);
3529 if (gotten < 0)
3530 perror_with_name (trace_filename);
3531 else if (gotten < 1)
3532 error (_("Premature end of file while reading trace file"));
3533
3534 ++pos;
3535 switch (block_type)
3536 {
3537 case 'R':
3538 gotten = read (trace_fd, regs, trace_regblock_size);
3539 if (gotten < 0)
3540 perror_with_name (trace_filename);
3541 else if (gotten < trace_regblock_size)
3542 error (_("Premature end of file while reading trace file"));
3543
3544 /* Assume the block is laid out in GDB register number order,
3545 each register with the size that it has in GDB. */
3546 offset = 0;
3547 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
3548 {
3549 regsize = register_size (gdbarch, regn);
3550 /* Make sure we stay within block bounds. */
3551 if (offset + regsize >= trace_regblock_size)
3552 break;
3553 if (!regcache_valid_p (regcache, regn))
3554 {
3555 if (regno == regn)
3556 {
3557 regcache_raw_supply (regcache, regno, regs + offset);
3558 break;
3559 }
3560 else if (regno == -1)
3561 {
3562 regcache_raw_supply (regcache, regn, regs + offset);
3563 }
3564 }
3565 offset += regsize;
3566 }
3567 return;
3568 case 'M':
3569 lseek (trace_fd, 8, SEEK_CUR);
3570 gotten = read (trace_fd, &mlen, 2);
3571 if (gotten < 0)
3572 perror_with_name (trace_filename);
3573 else if (gotten < 2)
3574 error (_("Premature end of file while reading trace file"));
3575 lseek (trace_fd, mlen, SEEK_CUR);
3576 pos += (8 + 2 + mlen);
3577 break;
3578 case 'V':
3579 lseek (trace_fd, 4 + 8, SEEK_CUR);
3580 pos += (4 + 8);
3581 break;
3582 default:
3583 error ("Unknown block type '%c' (0x%x) in trace frame",
3584 block_type, block_type);
3585 break;
3586 }
3587 }
3588 }
3589
3590 static LONGEST
3591 tfile_xfer_partial (struct target_ops *ops, enum target_object object,
3592 const char *annex, gdb_byte *readbuf,
3593 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
3594 {
3595 char block_type;
3596 int pos, gotten;
3597 ULONGEST maddr;
3598 unsigned short mlen;
3599
3600 /* We're only doing regular memory for now. */
3601 if (object != TARGET_OBJECT_MEMORY)
3602 return -1;
3603
3604 if (readbuf == NULL)
3605 error ("tfile_xfer_partial: trace file is read-only");
3606
3607 lseek (trace_fd, cur_offset, SEEK_SET);
3608 pos = 0;
3609 while (pos < cur_data_size)
3610 {
3611 gotten = read (trace_fd, &block_type, 1);
3612 if (gotten < 0)
3613 perror_with_name (trace_filename);
3614 else if (gotten < 1)
3615 error (_("Premature end of file while reading trace file"));
3616 ++pos;
3617 switch (block_type)
3618 {
3619 case 'R':
3620 lseek (trace_fd, trace_regblock_size, SEEK_CUR);
3621 pos += trace_regblock_size;
3622 break;
3623 case 'M':
3624 gotten = read (trace_fd, &maddr, 8);
3625 if (gotten < 0)
3626 perror_with_name (trace_filename);
3627 else if (gotten < 8)
3628 error (_("Premature end of file while reading trace file"));
3629
3630 gotten = read (trace_fd, &mlen, 2);
3631 if (gotten < 0)
3632 perror_with_name (trace_filename);
3633 else if (gotten < 2)
3634 error (_("Premature end of file while reading trace file"));
3635 if (maddr <= offset && (offset + len) <= (maddr + mlen))
3636 {
3637 gotten = read (trace_fd, readbuf, mlen);
3638 if (gotten < 0)
3639 perror_with_name (trace_filename);
3640 else if (gotten < mlen)
3641 error (_("Premature end of file qwhile reading trace file"));
3642
3643 return mlen;
3644 }
3645 lseek (trace_fd, mlen, SEEK_CUR);
3646 pos += (8 + 2 + mlen);
3647 break;
3648 case 'V':
3649 lseek (trace_fd, 4 + 8, SEEK_CUR);
3650 pos += (4 + 8);
3651 break;
3652 default:
3653 error ("Unknown block type '%c' (0x%x) in traceframe",
3654 block_type, block_type);
3655 break;
3656 }
3657 }
3658 /* Indicate failure to find the requested memory block. */
3659 return -1;
3660 }
3661
3662 /* Iterate through the blocks of a trace frame, looking for a 'V'
3663 block with a matching tsv number. */
3664
3665 static int
3666 tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
3667 {
3668 char block_type;
3669 int pos, vnum, gotten;
3670 unsigned short mlen;
3671
3672 lseek (trace_fd, cur_offset, SEEK_SET);
3673 pos = 0;
3674 while (pos < cur_data_size)
3675 {
3676 gotten = read (trace_fd, &block_type, 1);
3677 if (gotten < 0)
3678 perror_with_name (trace_filename);
3679 else if (gotten < 1)
3680 error (_("Premature end of file while reading trace file"));
3681 ++pos;
3682 switch (block_type)
3683 {
3684 case 'R':
3685 lseek (trace_fd, trace_regblock_size, SEEK_CUR);
3686 pos += trace_regblock_size;
3687 break;
3688 case 'M':
3689 lseek (trace_fd, 8, SEEK_CUR);
3690 gotten = read (trace_fd, &mlen, 2);
3691 if (gotten < 0)
3692 perror_with_name (trace_filename);
3693 else if (gotten < 2)
3694 error (_("Premature end of file while reading trace file"));
3695 lseek (trace_fd, mlen, SEEK_CUR);
3696 pos += (8 + 2 + mlen);
3697 break;
3698 case 'V':
3699 gotten = read (trace_fd, &vnum, 4);
3700 if (gotten < 0)
3701 perror_with_name (trace_filename);
3702 else if (gotten < 4)
3703 error (_("Premature end of file while reading trace file"));
3704 if (tsvnum == vnum)
3705 {
3706 gotten = read (trace_fd, val, 8);
3707 if (gotten < 0)
3708 perror_with_name (trace_filename);
3709 else if (gotten < 8)
3710 error (_("Premature end of file while reading trace file"));
3711 return 1;
3712 }
3713 lseek (trace_fd, 8, SEEK_CUR);
3714 pos += (4 + 8);
3715 break;
3716 default:
3717 error ("Unknown block type '%c' (0x%x) in traceframe",
3718 block_type, block_type);
3719 break;
3720 }
3721 }
3722 /* Didn't find anything. */
3723 return 0;
3724 }
3725
3726 static int
3727 tfile_has_memory (struct target_ops *ops)
3728 {
3729 return 1;
3730 }
3731
3732 static int
3733 tfile_has_stack (struct target_ops *ops)
3734 {
3735 return 1;
3736 }
3737
3738 static int
3739 tfile_has_registers (struct target_ops *ops)
3740 {
3741 return 1;
3742 }
3743
3744 static void
3745 init_tfile_ops (void)
3746 {
3747 tfile_ops.to_shortname = "tfile";
3748 tfile_ops.to_longname = "Local trace dump file";
3749 tfile_ops.to_doc =
3750 "Use a trace file as a target. Specify the filename of the trace file.";
3751 tfile_ops.to_open = tfile_open;
3752 tfile_ops.to_close = tfile_close;
3753 tfile_ops.to_fetch_registers = tfile_fetch_registers;
3754 tfile_ops.to_xfer_partial = tfile_xfer_partial;
3755 tfile_ops.to_files_info = tfile_files_info;
3756 tfile_ops.to_get_trace_status = tfile_get_trace_status;
3757 tfile_ops.to_trace_find = tfile_trace_find;
3758 tfile_ops.to_get_trace_state_variable_value = tfile_get_trace_state_variable_value;
3759 /* core_stratum might seem more logical, but GDB doesn't like having
3760 more than one core_stratum vector. */
3761 tfile_ops.to_stratum = process_stratum;
3762 tfile_ops.to_has_memory = tfile_has_memory;
3763 tfile_ops.to_has_stack = tfile_has_stack;
3764 tfile_ops.to_has_registers = tfile_has_registers;
3765 tfile_ops.to_magic = OPS_MAGIC;
3766 }
3767
3768 /* module initialization */
3769 void
3770 _initialize_tracepoint (void)
3771 {
3772 struct cmd_list_element *c;
3773
3774 traceframe_number = -1;
3775 tracepoint_number = -1;
3776
3777 if (tracepoint_list.list == NULL)
3778 {
3779 tracepoint_list.listsize = 128;
3780 tracepoint_list.list = xmalloc
3781 (tracepoint_list.listsize * sizeof (struct memrange));
3782 }
3783 if (tracepoint_list.aexpr_list == NULL)
3784 {
3785 tracepoint_list.aexpr_listsize = 128;
3786 tracepoint_list.aexpr_list = xmalloc
3787 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
3788 }
3789
3790 if (stepping_list.list == NULL)
3791 {
3792 stepping_list.listsize = 128;
3793 stepping_list.list = xmalloc
3794 (stepping_list.listsize * sizeof (struct memrange));
3795 }
3796
3797 if (stepping_list.aexpr_list == NULL)
3798 {
3799 stepping_list.aexpr_listsize = 128;
3800 stepping_list.aexpr_list = xmalloc
3801 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
3802 }
3803
3804 add_info ("scope", scope_info,
3805 _("List the variables local to a scope"));
3806
3807 add_cmd ("tracepoints", class_trace, NULL,
3808 _("Tracing of program execution without stopping the program."),
3809 &cmdlist);
3810
3811 add_com ("tdump", class_trace, trace_dump_command,
3812 _("Print everything collected at the current tracepoint."));
3813
3814 add_com ("tsave", class_trace, trace_save_command, _("\
3815 Save the trace data to a file.\n\
3816 Use the '-r' option to direct the target to save directly to the file,\n\
3817 using its own filesystem."));
3818
3819 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
3820 Define a trace state variable.\n\
3821 Argument is a $-prefixed name, optionally followed\n\
3822 by '=' and an expression that sets the initial value\n\
3823 at the start of tracing."));
3824 set_cmd_completer (c, expression_completer);
3825
3826 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
3827 Delete one or more trace state variables.\n\
3828 Arguments are the names of the variables to delete.\n\
3829 If no arguments are supplied, delete all variables."), &deletelist);
3830 /* FIXME add a trace variable completer */
3831
3832 add_info ("tvariables", tvariables_info, _("\
3833 Status of trace state variables and their values.\n\
3834 "));
3835
3836 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
3837 Select a trace frame;\n\
3838 No argument means forward by one frame; '-' means backward by one frame."),
3839 &tfindlist, "tfind ", 1, &cmdlist);
3840
3841 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
3842 Select a trace frame whose PC is outside the given range (exclusive).\n\
3843 Usage: tfind outside addr1, addr2"),
3844 &tfindlist);
3845
3846 add_cmd ("range", class_trace, trace_find_range_command, _("\
3847 Select a trace frame whose PC is in the given range (inclusive).\n\
3848 Usage: tfind range addr1,addr2"),
3849 &tfindlist);
3850
3851 add_cmd ("line", class_trace, trace_find_line_command, _("\
3852 Select a trace frame by source line.\n\
3853 Argument can be a line number (with optional source file), \n\
3854 a function name, or '*' followed by an address.\n\
3855 Default argument is 'the next source line that was traced'."),
3856 &tfindlist);
3857
3858 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
3859 Select a trace frame by tracepoint number.\n\
3860 Default is the tracepoint for the current trace frame."),
3861 &tfindlist);
3862
3863 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
3864 Select a trace frame by PC.\n\
3865 Default is the current PC, or the PC of the current trace frame."),
3866 &tfindlist);
3867
3868 add_cmd ("end", class_trace, trace_find_end_command, _("\
3869 Synonym for 'none'.\n\
3870 De-select any trace frame and resume 'live' debugging."),
3871 &tfindlist);
3872
3873 add_cmd ("none", class_trace, trace_find_none_command,
3874 _("De-select any trace frame and resume 'live' debugging."),
3875 &tfindlist);
3876
3877 add_cmd ("start", class_trace, trace_find_start_command,
3878 _("Select the first trace frame in the trace buffer."),
3879 &tfindlist);
3880
3881 add_com ("tstatus", class_trace, trace_status_command,
3882 _("Display the status of the current trace data collection."));
3883
3884 add_com ("tstop", class_trace, trace_stop_command,
3885 _("Stop trace data collection."));
3886
3887 add_com ("tstart", class_trace, trace_start_command,
3888 _("Start trace data collection."));
3889
3890 add_com ("end", class_trace, end_actions_pseudocommand, _("\
3891 Ends a list of commands or actions.\n\
3892 Several GDB commands allow you to enter a list of commands or actions.\n\
3893 Entering \"end\" on a line by itself is the normal way to terminate\n\
3894 such a list.\n\n\
3895 Note: the \"end\" command cannot be used at the gdb prompt."));
3896
3897 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
3898 Specify single-stepping behavior at a tracepoint.\n\
3899 Argument is number of instructions to trace in single-step mode\n\
3900 following the tracepoint. This command is normally followed by\n\
3901 one or more \"collect\" commands, to specify what to collect\n\
3902 while single-stepping.\n\n\
3903 Note: this command can only be used in a tracepoint \"actions\" list."));
3904
3905 add_com_alias ("ws", "while-stepping", class_alias, 0);
3906 add_com_alias ("stepping", "while-stepping", class_alias, 0);
3907
3908 add_com ("collect", class_trace, collect_pseudocommand, _("\
3909 Specify one or more data items to be collected at a tracepoint.\n\
3910 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
3911 collect all data (variables, registers) referenced by that expression.\n\
3912 Also accepts the following special arguments:\n\
3913 $regs -- all registers.\n\
3914 $args -- all function arguments.\n\
3915 $locals -- all variables local to the block/function scope.\n\
3916 Note: this command can only be used in a tracepoint \"actions\" list."));
3917
3918 add_com ("teval", class_trace, teval_pseudocommand, _("\
3919 Specify one or more expressions to be evaluated at a tracepoint.\n\
3920 Accepts a comma-separated list of (one or more) expressions.\n\
3921 The result of each evaluation will be discarded.\n\
3922 Note: this command can only be used in a tracepoint \"actions\" list."));
3923
3924 add_com ("actions", class_trace, trace_actions_command, _("\
3925 Specify the actions to be taken at a tracepoint.\n\
3926 Tracepoint actions may include collecting of specified data, \n\
3927 single-stepping, or enabling/disabling other tracepoints, \n\
3928 depending on target's capabilities."));
3929
3930 default_collect = xstrdup ("");
3931 add_setshow_string_cmd ("default-collect", class_trace,
3932 &default_collect, _("\
3933 Set the list of expressions to collect by default"), _("\
3934 Show the list of expressions to collect by default"), NULL,
3935 NULL, NULL,
3936 &setlist, &showlist);
3937
3938 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
3939 &disconnected_tracing, _("\
3940 Set whether tracing continues after GDB disconnects."), _("\
3941 Show whether tracing continues after GDB disconnects."), _("\
3942 Use this to continue a tracing run even if GDB disconnects\n\
3943 or detaches from the target. You can reconnect later and look at\n\
3944 trace data collected in the meantime."),
3945 set_disconnected_tracing,
3946 NULL,
3947 &setlist,
3948 &showlist);
3949
3950 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
3951 &circular_trace_buffer, _("\
3952 Set target's use of circular trace buffer."), _("\
3953 Show target's use of circular trace buffer."), _("\
3954 Use this to make the trace buffer into a circular buffer,\n\
3955 which will discard traceframes (oldest first) instead of filling\n\
3956 up and stopping the trace run."),
3957 set_circular_trace_buffer,
3958 NULL,
3959 &setlist,
3960 &showlist);
3961
3962 init_tfile_ops ();
3963
3964 add_target (&tfile_ops);
3965 }