Remove spurious gdb/ ...
[deliverable/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 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 "remote.h"
36 extern int remote_supports_cond_tracepoints (void);
37 #include "linespec.h"
38 #include "regcache.h"
39 #include "completer.h"
40 #include "block.h"
41 #include "dictionary.h"
42 #include "observer.h"
43 #include "user-regs.h"
44 #include "valprint.h"
45 #include "gdbcore.h"
46 #include "objfiles.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 /* Maximum length of an agent aexpression.
63 This accounts for the fact that packets are limited to 400 bytes
64 (which includes everything -- including the checksum), and assumes
65 the worst case of maximum length for each of the pieces of a
66 continuation packet.
67
68 NOTE: expressions get mem2hex'ed otherwise this would be twice as
69 large. (400 - 31)/2 == 184 */
70 #define MAX_AGENT_EXPR_LEN 184
71
72
73 extern void (*deprecated_readline_begin_hook) (char *, ...);
74 extern char *(*deprecated_readline_hook) (char *);
75 extern void (*deprecated_readline_end_hook) (void);
76
77 /* GDB commands implemented in other modules:
78 */
79
80 extern void output_command (char *, int);
81
82 /*
83 Tracepoint.c:
84
85 This module defines the following debugger commands:
86 trace : set a tracepoint on a function, line, or address.
87 info trace : list all debugger-defined tracepoints.
88 delete trace : delete one or more tracepoints.
89 enable trace : enable one or more tracepoints.
90 disable trace : disable one or more tracepoints.
91 actions : specify actions to be taken at a tracepoint.
92 passcount : specify a pass count for a tracepoint.
93 tstart : start a trace experiment.
94 tstop : stop a trace experiment.
95 tstatus : query the status of a trace experiment.
96 tfind : find a trace frame in the trace buffer.
97 tdump : print everything collected at the current tracepoint.
98 save-tracepoints : write tracepoint setup into a file.
99
100 This module defines the following user-visible debugger variables:
101 $trace_frame : sequence number of trace frame currently being debugged.
102 $trace_line : source line of trace frame currently being debugged.
103 $trace_file : source file of trace frame currently being debugged.
104 $tracepoint : tracepoint number of trace frame currently being debugged.
105 */
106
107
108 /* ======= Important global variables: ======= */
109
110 /* Number of last traceframe collected. */
111 static int traceframe_number;
112
113 /* Tracepoint for last traceframe collected. */
114 static int tracepoint_number;
115
116 /* Symbol for function for last traceframe collected */
117 static struct symbol *traceframe_fun;
118
119 /* Symtab and line for last traceframe collected */
120 static struct symtab_and_line traceframe_sal;
121
122 /* Tracing command lists */
123 static struct cmd_list_element *tfindlist;
124
125 /* ======= Important command functions: ======= */
126 static void trace_actions_command (char *, int);
127 static void trace_start_command (char *, int);
128 static void trace_stop_command (char *, int);
129 static void trace_status_command (char *, int);
130 static void trace_find_command (char *, int);
131 static void trace_find_pc_command (char *, int);
132 static void trace_find_tracepoint_command (char *, int);
133 static void trace_find_line_command (char *, int);
134 static void trace_find_range_command (char *, int);
135 static void trace_find_outside_command (char *, int);
136 static void tracepoint_save_command (char *, int);
137 static void trace_dump_command (char *, int);
138
139 /* support routines */
140
141 struct collection_list;
142 static void add_aexpr (struct collection_list *, struct agent_expr *);
143 static char *mem2hex (gdb_byte *, char *, int);
144 static void add_register (struct collection_list *collection,
145 unsigned int regno);
146 static struct cleanup *make_cleanup_free_actions (struct breakpoint *t);
147 static void free_actions_list (char **actions_list);
148 static void free_actions_list_cleanup_wrapper (void *);
149
150 extern void _initialize_tracepoint (void);
151
152 /* Utility: returns true if "target remote" */
153 static int
154 target_is_remote (void)
155 {
156 if (current_target.to_shortname &&
157 (strcmp (current_target.to_shortname, "remote") == 0
158 || strcmp (current_target.to_shortname, "extended-remote") == 0))
159 return 1;
160 else
161 return 0;
162 }
163
164 /* Utility: generate error from an incoming stub packet. */
165 static void
166 trace_error (char *buf)
167 {
168 if (*buf++ != 'E')
169 return; /* not an error msg */
170 switch (*buf)
171 {
172 case '1': /* malformed packet error */
173 if (*++buf == '0') /* general case: */
174 error (_("tracepoint.c: error in outgoing packet."));
175 else
176 error (_("tracepoint.c: error in outgoing packet at field #%ld."),
177 strtol (buf, NULL, 16));
178 case '2':
179 error (_("trace API error 0x%s."), ++buf);
180 default:
181 error (_("Target returns error code '%s'."), buf);
182 }
183 }
184
185 /* Utility: wait for reply from stub, while accepting "O" packets. */
186 static char *
187 remote_get_noisy_reply (char **buf_p,
188 long *sizeof_buf)
189 {
190 do /* Loop on reply from remote stub. */
191 {
192 char *buf;
193 QUIT; /* allow user to bail out with ^C */
194 getpkt (buf_p, sizeof_buf, 0);
195 buf = *buf_p;
196 if (buf[0] == 0)
197 error (_("Target does not support this command."));
198 else if (buf[0] == 'E')
199 trace_error (buf);
200 else if (buf[0] == 'O' &&
201 buf[1] != 'K')
202 remote_console_output (buf + 1); /* 'O' message from stub */
203 else
204 return buf; /* here's the actual reply */
205 }
206 while (1);
207 }
208
209 /* Set traceframe number to NUM. */
210 static void
211 set_traceframe_num (int num)
212 {
213 traceframe_number = num;
214 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
215 }
216
217 /* Set tracepoint number to NUM. */
218 static void
219 set_tracepoint_num (int num)
220 {
221 tracepoint_number = num;
222 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
223 }
224
225 /* Set externally visible debug variables for querying/printing
226 the traceframe context (line, function, file) */
227
228 static void
229 set_traceframe_context (struct frame_info *trace_frame)
230 {
231 CORE_ADDR trace_pc;
232
233 if (trace_frame == NULL) /* Cease debugging any trace buffers. */
234 {
235 traceframe_fun = 0;
236 traceframe_sal.pc = traceframe_sal.line = 0;
237 traceframe_sal.symtab = NULL;
238 clear_internalvar (lookup_internalvar ("trace_func"));
239 clear_internalvar (lookup_internalvar ("trace_file"));
240 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
241 return;
242 }
243
244 /* Save as globals for internal use. */
245 trace_pc = get_frame_pc (trace_frame);
246 traceframe_sal = find_pc_line (trace_pc, 0);
247 traceframe_fun = find_pc_function (trace_pc);
248
249 /* Save linenumber as "$trace_line", a debugger variable visible to
250 users. */
251 set_internalvar_integer (lookup_internalvar ("trace_line"),
252 traceframe_sal.line);
253
254 /* Save func name as "$trace_func", a debugger variable visible to
255 users. */
256 if (traceframe_fun == NULL
257 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
258 clear_internalvar (lookup_internalvar ("trace_func"));
259 else
260 set_internalvar_string (lookup_internalvar ("trace_func"),
261 SYMBOL_LINKAGE_NAME (traceframe_fun));
262
263 /* Save file name as "$trace_file", a debugger variable visible to
264 users. */
265 if (traceframe_sal.symtab == NULL
266 || traceframe_sal.symtab->filename == NULL)
267 clear_internalvar (lookup_internalvar ("trace_file"));
268 else
269 set_internalvar_string (lookup_internalvar ("trace_file"),
270 traceframe_sal.symtab->filename);
271 }
272
273 /* ACTIONS functions: */
274
275 /* Prototypes for action-parsing utility commands */
276 static void read_actions (struct breakpoint *);
277
278 /* The three functions:
279 collect_pseudocommand,
280 while_stepping_pseudocommand, and
281 end_actions_pseudocommand
282 are placeholders for "commands" that are actually ONLY to be used
283 within a tracepoint action list. If the actual function is ever called,
284 it means that somebody issued the "command" at the top level,
285 which is always an error. */
286
287 void
288 end_actions_pseudocommand (char *args, int from_tty)
289 {
290 error (_("This command cannot be used at the top level."));
291 }
292
293 void
294 while_stepping_pseudocommand (char *args, int from_tty)
295 {
296 error (_("This command can only be used in a tracepoint actions list."));
297 }
298
299 static void
300 collect_pseudocommand (char *args, int from_tty)
301 {
302 error (_("This command can only be used in a tracepoint actions list."));
303 }
304
305 /* Enter a list of actions for a tracepoint. */
306 static void
307 trace_actions_command (char *args, int from_tty)
308 {
309 struct breakpoint *t;
310 char tmpbuf[128];
311 char *end_msg = "End with a line saying just \"end\".";
312
313 t = get_tracepoint_by_number (&args, 0, 1);
314 if (t)
315 {
316 sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
317 t->number);
318
319 if (from_tty)
320 {
321 if (deprecated_readline_begin_hook)
322 (*deprecated_readline_begin_hook) ("%s %s\n", tmpbuf, end_msg);
323 else if (input_from_terminal_p ())
324 printf_filtered ("%s\n%s\n", tmpbuf, end_msg);
325 }
326
327 free_actions (t);
328 t->step_count = 0; /* read_actions may set this */
329 read_actions (t);
330
331 if (deprecated_readline_end_hook)
332 (*deprecated_readline_end_hook) ();
333 /* tracepoints_changed () */
334 }
335 /* else just return */
336 }
337
338 /* worker function */
339 static void
340 read_actions (struct breakpoint *t)
341 {
342 char *line;
343 char *prompt1 = "> ", *prompt2 = " > ";
344 char *prompt = prompt1;
345 enum actionline_type linetype;
346 extern FILE *instream;
347 struct action_line *next = NULL, *temp;
348 struct cleanup *old_chain;
349
350 /* Control-C quits instantly if typed while in this loop
351 since it should not wait until the user types a newline. */
352 immediate_quit++;
353 /* FIXME: kettenis/20010823: Something is wrong here. In this file
354 STOP_SIGNAL is never defined. So this code has been left out, at
355 least for quite a while now. Replacing STOP_SIGNAL with SIGTSTP
356 leads to compilation failures since the variable job_control
357 isn't declared. Leave this alone for now. */
358 #ifdef STOP_SIGNAL
359 if (job_control)
360 signal (STOP_SIGNAL, handle_stop_sig);
361 #endif
362 old_chain = make_cleanup_free_actions (t);
363 while (1)
364 {
365 /* Make sure that all output has been output. Some machines may
366 let you get away with leaving out some of the gdb_flush, but
367 not all. */
368 wrap_here ("");
369 gdb_flush (gdb_stdout);
370 gdb_flush (gdb_stderr);
371
372 if (deprecated_readline_hook && instream == NULL)
373 line = (*deprecated_readline_hook) (prompt);
374 else if (instream == stdin && ISATTY (instream))
375 {
376 line = gdb_readline_wrapper (prompt);
377 if (line && *line) /* add it to command history */
378 add_history (line);
379 }
380 else
381 line = gdb_readline (0);
382
383 if (!line)
384 {
385 line = xstrdup ("end");
386 printf_filtered ("end\n");
387 }
388
389 linetype = validate_actionline (&line, t);
390 if (linetype == BADLINE)
391 continue; /* already warned -- collect another line */
392
393 temp = xmalloc (sizeof (struct action_line));
394 temp->next = NULL;
395 temp->action = line;
396
397 if (next == NULL) /* first action for this tracepoint? */
398 t->actions = next = temp;
399 else
400 {
401 next->next = temp;
402 next = temp;
403 }
404
405 if (linetype == STEPPING) /* begin "while-stepping" */
406 {
407 if (prompt == prompt2)
408 {
409 warning (_("Already processing 'while-stepping'"));
410 continue;
411 }
412 else
413 prompt = prompt2; /* change prompt for stepping actions */
414 }
415 else if (linetype == END)
416 {
417 if (prompt == prompt2)
418 {
419 prompt = prompt1; /* end of single-stepping actions */
420 }
421 else
422 { /* end of actions */
423 if (t->actions->next == NULL)
424 {
425 /* An "end" all by itself with no other actions
426 means this tracepoint has no actions.
427 Discard empty list. */
428 free_actions (t);
429 }
430 break;
431 }
432 }
433 }
434 #ifdef STOP_SIGNAL
435 if (job_control)
436 signal (STOP_SIGNAL, SIG_DFL);
437 #endif
438 immediate_quit--;
439 discard_cleanups (old_chain);
440 }
441
442 /* worker function */
443 enum actionline_type
444 validate_actionline (char **line, struct breakpoint *t)
445 {
446 struct cmd_list_element *c;
447 struct expression *exp = NULL;
448 struct cleanup *old_chain = NULL;
449 char *p;
450
451 /* if EOF is typed, *line is NULL */
452 if (*line == NULL)
453 return END;
454
455 for (p = *line; isspace ((int) *p);)
456 p++;
457
458 /* Symbol lookup etc. */
459 if (*p == '\0') /* empty line: just prompt for another line. */
460 return BADLINE;
461
462 if (*p == '#') /* comment line */
463 return GENERIC;
464
465 c = lookup_cmd (&p, cmdlist, "", -1, 1);
466 if (c == 0)
467 {
468 warning (_("'%s' is not an action that I know, or is ambiguous."),
469 p);
470 return BADLINE;
471 }
472
473 if (cmd_cfunc_eq (c, collect_pseudocommand))
474 {
475 struct agent_expr *aexpr;
476 struct agent_reqs areqs;
477
478 do
479 { /* repeat over a comma-separated list */
480 QUIT; /* allow user to bail out with ^C */
481 while (isspace ((int) *p))
482 p++;
483
484 if (*p == '$') /* look for special pseudo-symbols */
485 {
486 if ((0 == strncasecmp ("reg", p + 1, 3)) ||
487 (0 == strncasecmp ("arg", p + 1, 3)) ||
488 (0 == strncasecmp ("loc", p + 1, 3)))
489 {
490 p = strchr (p, ',');
491 continue;
492 }
493 /* else fall thru, treat p as an expression and parse it! */
494 }
495 exp = parse_exp_1 (&p, block_for_pc (t->loc->address), 1);
496 old_chain = make_cleanup (free_current_contents, &exp);
497
498 if (exp->elts[0].opcode == OP_VAR_VALUE)
499 {
500 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
501 {
502 warning (_("constant %s (value %ld) will not be collected."),
503 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
504 SYMBOL_VALUE (exp->elts[2].symbol));
505 return BADLINE;
506 }
507 else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
508 {
509 warning (_("%s is optimized away and cannot be collected."),
510 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
511 return BADLINE;
512 }
513 }
514
515 /* We have something to collect, make sure that the expr to
516 bytecode translator can handle it and that it's not too
517 long. */
518 aexpr = gen_trace_for_expr (t->loc->address, exp);
519 make_cleanup_free_agent_expr (aexpr);
520
521 if (aexpr->len > MAX_AGENT_EXPR_LEN)
522 error (_("expression too complicated, try simplifying"));
523
524 ax_reqs (aexpr, &areqs);
525 (void) make_cleanup (xfree, areqs.reg_mask);
526
527 if (areqs.flaw != agent_flaw_none)
528 error (_("malformed expression"));
529
530 if (areqs.min_height < 0)
531 error (_("gdb: Internal error: expression has min height < 0"));
532
533 if (areqs.max_height > 20)
534 error (_("expression too complicated, try simplifying"));
535
536 do_cleanups (old_chain);
537 }
538 while (p && *p++ == ',');
539 return GENERIC;
540 }
541 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
542 {
543 char *steparg; /* in case warning is necessary */
544
545 while (isspace ((int) *p))
546 p++;
547 steparg = p;
548
549 if (*p == '\0' ||
550 (t->step_count = strtol (p, &p, 0)) == 0)
551 {
552 warning (_("'%s': bad step-count; command ignored."), *line);
553 return BADLINE;
554 }
555 return STEPPING;
556 }
557 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
558 return END;
559 else
560 {
561 warning (_("'%s' is not a supported tracepoint action."), *line);
562 return BADLINE;
563 }
564 }
565
566 /* worker function */
567 void
568 free_actions (struct breakpoint *t)
569 {
570 struct action_line *line, *next;
571
572 for (line = t->actions; line; line = next)
573 {
574 next = line->next;
575 if (line->action)
576 xfree (line->action);
577 xfree (line);
578 }
579 t->actions = NULL;
580 }
581
582 static void
583 do_free_actions_cleanup (void *t)
584 {
585 free_actions (t);
586 }
587
588 static struct cleanup *
589 make_cleanup_free_actions (struct breakpoint *t)
590 {
591 return make_cleanup (do_free_actions_cleanup, t);
592 }
593
594 enum {
595 memrange_absolute = -1
596 };
597
598 struct memrange
599 {
600 int type; /* memrange_absolute for absolute memory range,
601 else basereg number */
602 bfd_signed_vma start;
603 bfd_signed_vma end;
604 };
605
606 struct collection_list
607 {
608 unsigned char regs_mask[32]; /* room for up to 256 regs */
609 long listsize;
610 long next_memrange;
611 struct memrange *list;
612 long aexpr_listsize; /* size of array pointed to by expr_list elt */
613 long next_aexpr_elt;
614 struct agent_expr **aexpr_list;
615
616 }
617 tracepoint_list, stepping_list;
618
619 /* MEMRANGE functions: */
620
621 static int memrange_cmp (const void *, const void *);
622
623 /* compare memranges for qsort */
624 static int
625 memrange_cmp (const void *va, const void *vb)
626 {
627 const struct memrange *a = va, *b = vb;
628
629 if (a->type < b->type)
630 return -1;
631 if (a->type > b->type)
632 return 1;
633 if (a->type == memrange_absolute)
634 {
635 if ((bfd_vma) a->start < (bfd_vma) b->start)
636 return -1;
637 if ((bfd_vma) a->start > (bfd_vma) b->start)
638 return 1;
639 }
640 else
641 {
642 if (a->start < b->start)
643 return -1;
644 if (a->start > b->start)
645 return 1;
646 }
647 return 0;
648 }
649
650 /* Sort the memrange list using qsort, and merge adjacent memranges. */
651 static void
652 memrange_sortmerge (struct collection_list *memranges)
653 {
654 int a, b;
655
656 qsort (memranges->list, memranges->next_memrange,
657 sizeof (struct memrange), memrange_cmp);
658 if (memranges->next_memrange > 0)
659 {
660 for (a = 0, b = 1; b < memranges->next_memrange; b++)
661 {
662 if (memranges->list[a].type == memranges->list[b].type &&
663 memranges->list[b].start - memranges->list[a].end <=
664 MAX_REGISTER_SIZE)
665 {
666 /* memrange b starts before memrange a ends; merge them. */
667 if (memranges->list[b].end > memranges->list[a].end)
668 memranges->list[a].end = memranges->list[b].end;
669 continue; /* next b, same a */
670 }
671 a++; /* next a */
672 if (a != b)
673 memcpy (&memranges->list[a], &memranges->list[b],
674 sizeof (struct memrange));
675 }
676 memranges->next_memrange = a + 1;
677 }
678 }
679
680 /* Add a register to a collection list. */
681 static void
682 add_register (struct collection_list *collection, unsigned int regno)
683 {
684 if (info_verbose)
685 printf_filtered ("collect register %d\n", regno);
686 if (regno >= (8 * sizeof (collection->regs_mask)))
687 error (_("Internal: register number %d too large for tracepoint"),
688 regno);
689 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
690 }
691
692 /* Add a memrange to a collection list */
693 static void
694 add_memrange (struct collection_list *memranges,
695 int type, bfd_signed_vma base,
696 unsigned long len)
697 {
698 if (info_verbose)
699 {
700 printf_filtered ("(%d,", type);
701 printf_vma (base);
702 printf_filtered (",%ld)\n", len);
703 }
704
705 /* type: memrange_absolute == memory, other n == basereg */
706 memranges->list[memranges->next_memrange].type = type;
707 /* base: addr if memory, offset if reg relative. */
708 memranges->list[memranges->next_memrange].start = base;
709 /* len: we actually save end (base + len) for convenience */
710 memranges->list[memranges->next_memrange].end = base + len;
711 memranges->next_memrange++;
712 if (memranges->next_memrange >= memranges->listsize)
713 {
714 memranges->listsize *= 2;
715 memranges->list = xrealloc (memranges->list,
716 memranges->listsize);
717 }
718
719 if (type != memrange_absolute) /* Better collect the base register! */
720 add_register (memranges, type);
721 }
722
723 /* Add a symbol to a collection list. */
724 static void
725 collect_symbol (struct collection_list *collect,
726 struct symbol *sym,
727 struct gdbarch *gdbarch,
728 long frame_regno, long frame_offset)
729 {
730 unsigned long len;
731 unsigned int reg;
732 bfd_signed_vma offset;
733
734 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
735 switch (SYMBOL_CLASS (sym))
736 {
737 default:
738 printf_filtered ("%s: don't know symbol class %d\n",
739 SYMBOL_PRINT_NAME (sym),
740 SYMBOL_CLASS (sym));
741 break;
742 case LOC_CONST:
743 printf_filtered ("constant %s (value %ld) will not be collected.\n",
744 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
745 break;
746 case LOC_STATIC:
747 offset = SYMBOL_VALUE_ADDRESS (sym);
748 if (info_verbose)
749 {
750 char tmp[40];
751
752 sprintf_vma (tmp, offset);
753 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
754 SYMBOL_PRINT_NAME (sym), len,
755 tmp /* address */);
756 }
757 add_memrange (collect, memrange_absolute, offset, len);
758 break;
759 case LOC_REGISTER:
760 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
761 if (info_verbose)
762 printf_filtered ("LOC_REG[parm] %s: ",
763 SYMBOL_PRINT_NAME (sym));
764 add_register (collect, reg);
765 /* Check for doubles stored in two registers. */
766 /* FIXME: how about larger types stored in 3 or more regs? */
767 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
768 len > register_size (gdbarch, reg))
769 add_register (collect, reg + 1);
770 break;
771 case LOC_REF_ARG:
772 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
773 printf_filtered (" (will not collect %s)\n",
774 SYMBOL_PRINT_NAME (sym));
775 break;
776 case LOC_ARG:
777 reg = frame_regno;
778 offset = frame_offset + SYMBOL_VALUE (sym);
779 if (info_verbose)
780 {
781 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
782 SYMBOL_PRINT_NAME (sym), len);
783 printf_vma (offset);
784 printf_filtered (" from frame ptr reg %d\n", reg);
785 }
786 add_memrange (collect, reg, offset, len);
787 break;
788 case LOC_REGPARM_ADDR:
789 reg = SYMBOL_VALUE (sym);
790 offset = 0;
791 if (info_verbose)
792 {
793 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
794 SYMBOL_PRINT_NAME (sym), len);
795 printf_vma (offset);
796 printf_filtered (" from reg %d\n", reg);
797 }
798 add_memrange (collect, reg, offset, len);
799 break;
800 case LOC_LOCAL:
801 reg = frame_regno;
802 offset = frame_offset + SYMBOL_VALUE (sym);
803 if (info_verbose)
804 {
805 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
806 SYMBOL_PRINT_NAME (sym), len);
807 printf_vma (offset);
808 printf_filtered (" from frame ptr reg %d\n", reg);
809 }
810 add_memrange (collect, reg, offset, len);
811 break;
812 case LOC_UNRESOLVED:
813 printf_filtered ("Don't know LOC_UNRESOLVED %s\n",
814 SYMBOL_PRINT_NAME (sym));
815 break;
816 case LOC_OPTIMIZED_OUT:
817 printf_filtered ("%s has been optimized out of existence.\n",
818 SYMBOL_PRINT_NAME (sym));
819 break;
820 }
821 }
822
823 /* Add all locals (or args) symbols to collection list */
824 static void
825 add_local_symbols (struct collection_list *collect,
826 struct gdbarch *gdbarch, CORE_ADDR pc,
827 long frame_regno, long frame_offset, int type)
828 {
829 struct symbol *sym;
830 struct block *block;
831 struct dict_iterator iter;
832 int count = 0;
833
834 block = block_for_pc (pc);
835 while (block != 0)
836 {
837 QUIT; /* allow user to bail out with ^C */
838 ALL_BLOCK_SYMBOLS (block, iter, sym)
839 {
840 if (SYMBOL_IS_ARGUMENT (sym)
841 ? type == 'A' /* collecting Arguments */
842 : type == 'L') /* collecting Locals */
843 {
844 count++;
845 collect_symbol (collect, sym, gdbarch,
846 frame_regno, frame_offset);
847 }
848 }
849 if (BLOCK_FUNCTION (block))
850 break;
851 else
852 block = BLOCK_SUPERBLOCK (block);
853 }
854 if (count == 0)
855 warning (_("No %s found in scope."),
856 type == 'L' ? "locals" : "args");
857 }
858
859 /* worker function */
860 static void
861 clear_collection_list (struct collection_list *list)
862 {
863 int ndx;
864
865 list->next_memrange = 0;
866 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
867 {
868 free_agent_expr (list->aexpr_list[ndx]);
869 list->aexpr_list[ndx] = NULL;
870 }
871 list->next_aexpr_elt = 0;
872 memset (list->regs_mask, 0, sizeof (list->regs_mask));
873 }
874
875 /* reduce a collection list to string form (for gdb protocol) */
876 static char **
877 stringify_collection_list (struct collection_list *list, char *string)
878 {
879 char temp_buf[2048];
880 char tmp2[40];
881 int count;
882 int ndx = 0;
883 char *(*str_list)[];
884 char *end;
885 long i;
886
887 count = 1 + list->next_memrange + list->next_aexpr_elt + 1;
888 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
889
890 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
891 if (list->regs_mask[i] != 0) /* skip leading zeroes in regs_mask */
892 break;
893 if (list->regs_mask[i] != 0) /* prepare to send regs_mask to the stub */
894 {
895 if (info_verbose)
896 printf_filtered ("\nCollecting registers (mask): 0x");
897 end = temp_buf;
898 *end++ = 'R';
899 for (; i >= 0; i--)
900 {
901 QUIT; /* allow user to bail out with ^C */
902 if (info_verbose)
903 printf_filtered ("%02X", list->regs_mask[i]);
904 sprintf (end, "%02X", list->regs_mask[i]);
905 end += 2;
906 }
907 (*str_list)[ndx] = xstrdup (temp_buf);
908 ndx++;
909 }
910 if (info_verbose)
911 printf_filtered ("\n");
912 if (list->next_memrange > 0 && info_verbose)
913 printf_filtered ("Collecting memranges: \n");
914 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
915 {
916 QUIT; /* allow user to bail out with ^C */
917 sprintf_vma (tmp2, list->list[i].start);
918 if (info_verbose)
919 {
920 printf_filtered ("(%d, %s, %ld)\n",
921 list->list[i].type,
922 tmp2,
923 (long) (list->list[i].end - list->list[i].start));
924 }
925 if (count + 27 > MAX_AGENT_EXPR_LEN)
926 {
927 (*str_list)[ndx] = savestring (temp_buf, count);
928 ndx++;
929 count = 0;
930 end = temp_buf;
931 }
932
933 {
934 bfd_signed_vma length = list->list[i].end - list->list[i].start;
935
936 /* The "%X" conversion specifier expects an unsigned argument,
937 so passing -1 (memrange_absolute) to it directly gives you
938 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
939 Special-case it. */
940 if (list->list[i].type == memrange_absolute)
941 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
942 else
943 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
944 }
945
946 count += strlen (end);
947 end = temp_buf + count;
948 }
949
950 for (i = 0; i < list->next_aexpr_elt; i++)
951 {
952 QUIT; /* allow user to bail out with ^C */
953 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
954 {
955 (*str_list)[ndx] = savestring (temp_buf, count);
956 ndx++;
957 count = 0;
958 end = temp_buf;
959 }
960 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
961 end += 10; /* 'X' + 8 hex digits + ',' */
962 count += 10;
963
964 end = mem2hex (list->aexpr_list[i]->buf,
965 end, list->aexpr_list[i]->len);
966 count += 2 * list->aexpr_list[i]->len;
967 }
968
969 if (count != 0)
970 {
971 (*str_list)[ndx] = savestring (temp_buf, count);
972 ndx++;
973 count = 0;
974 end = temp_buf;
975 }
976 (*str_list)[ndx] = NULL;
977
978 if (ndx == 0)
979 {
980 xfree (str_list);
981 return NULL;
982 }
983 else
984 return *str_list;
985 }
986
987 static void
988 free_actions_list_cleanup_wrapper (void *al)
989 {
990 free_actions_list (al);
991 }
992
993 static void
994 free_actions_list (char **actions_list)
995 {
996 int ndx;
997
998 if (actions_list == 0)
999 return;
1000
1001 for (ndx = 0; actions_list[ndx]; ndx++)
1002 xfree (actions_list[ndx]);
1003
1004 xfree (actions_list);
1005 }
1006
1007 /* Render all actions into gdb protocol. */
1008 static void
1009 encode_actions (struct breakpoint *t, char ***tdp_actions,
1010 char ***stepping_actions)
1011 {
1012 static char tdp_buff[2048], step_buff[2048];
1013 char *action_exp;
1014 struct expression *exp = NULL;
1015 struct action_line *action;
1016 int i;
1017 struct value *tempval;
1018 struct collection_list *collect;
1019 struct cmd_list_element *cmd;
1020 struct agent_expr *aexpr;
1021 int frame_reg;
1022 LONGEST frame_offset;
1023
1024
1025 clear_collection_list (&tracepoint_list);
1026 clear_collection_list (&stepping_list);
1027 collect = &tracepoint_list;
1028
1029 *tdp_actions = NULL;
1030 *stepping_actions = NULL;
1031
1032 gdbarch_virtual_frame_pointer (t->gdbarch,
1033 t->loc->address, &frame_reg, &frame_offset);
1034
1035 for (action = t->actions; action; action = action->next)
1036 {
1037 QUIT; /* allow user to bail out with ^C */
1038 action_exp = action->action;
1039 while (isspace ((int) *action_exp))
1040 action_exp++;
1041
1042 if (*action_exp == '#') /* comment line */
1043 return;
1044
1045 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1046 if (cmd == 0)
1047 error (_("Bad action list item: %s"), action_exp);
1048
1049 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1050 {
1051 do
1052 { /* repeat over a comma-separated list */
1053 QUIT; /* allow user to bail out with ^C */
1054 while (isspace ((int) *action_exp))
1055 action_exp++;
1056
1057 if (0 == strncasecmp ("$reg", action_exp, 4))
1058 {
1059 for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
1060 add_register (collect, i);
1061 action_exp = strchr (action_exp, ','); /* more? */
1062 }
1063 else if (0 == strncasecmp ("$arg", action_exp, 4))
1064 {
1065 add_local_symbols (collect,
1066 t->gdbarch,
1067 t->loc->address,
1068 frame_reg,
1069 frame_offset,
1070 'A');
1071 action_exp = strchr (action_exp, ','); /* more? */
1072 }
1073 else if (0 == strncasecmp ("$loc", action_exp, 4))
1074 {
1075 add_local_symbols (collect,
1076 t->gdbarch,
1077 t->loc->address,
1078 frame_reg,
1079 frame_offset,
1080 'L');
1081 action_exp = strchr (action_exp, ','); /* more? */
1082 }
1083 else
1084 {
1085 unsigned long addr, len;
1086 struct cleanup *old_chain = NULL;
1087 struct cleanup *old_chain1 = NULL;
1088 struct agent_reqs areqs;
1089
1090 exp = parse_exp_1 (&action_exp,
1091 block_for_pc (t->loc->address), 1);
1092 old_chain = make_cleanup (free_current_contents, &exp);
1093
1094 switch (exp->elts[0].opcode)
1095 {
1096 case OP_REGISTER:
1097 {
1098 const char *name = &exp->elts[2].string;
1099
1100 i = user_reg_map_name_to_regnum (t->gdbarch,
1101 name, strlen (name));
1102 if (i == -1)
1103 internal_error (__FILE__, __LINE__,
1104 _("Register $%s not available"),
1105 name);
1106 if (info_verbose)
1107 printf_filtered ("OP_REGISTER: ");
1108 add_register (collect, i);
1109 break;
1110 }
1111
1112 case UNOP_MEMVAL:
1113 /* safe because we know it's a simple expression */
1114 tempval = evaluate_expression (exp);
1115 addr = value_address (tempval);
1116 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1117 add_memrange (collect, memrange_absolute, addr, len);
1118 break;
1119
1120 case OP_VAR_VALUE:
1121 collect_symbol (collect,
1122 exp->elts[2].symbol,
1123 t->gdbarch,
1124 frame_reg,
1125 frame_offset);
1126 break;
1127
1128 default: /* full-fledged expression */
1129 aexpr = gen_trace_for_expr (t->loc->address, exp);
1130
1131 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1132
1133 ax_reqs (aexpr, &areqs);
1134 if (areqs.flaw != agent_flaw_none)
1135 error (_("malformed expression"));
1136
1137 if (areqs.min_height < 0)
1138 error (_("gdb: Internal error: expression has min height < 0"));
1139 if (areqs.max_height > 20)
1140 error (_("expression too complicated, try simplifying"));
1141
1142 discard_cleanups (old_chain1);
1143 add_aexpr (collect, aexpr);
1144
1145 /* take care of the registers */
1146 if (areqs.reg_mask_len > 0)
1147 {
1148 int ndx1;
1149 int ndx2;
1150
1151 for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
1152 {
1153 QUIT; /* allow user to bail out with ^C */
1154 if (areqs.reg_mask[ndx1] != 0)
1155 {
1156 /* assume chars have 8 bits */
1157 for (ndx2 = 0; ndx2 < 8; ndx2++)
1158 if (areqs.reg_mask[ndx1] & (1 << ndx2))
1159 /* it's used -- record it */
1160 add_register (collect,
1161 ndx1 * 8 + ndx2);
1162 }
1163 }
1164 }
1165 break;
1166 } /* switch */
1167 do_cleanups (old_chain);
1168 } /* do */
1169 }
1170 while (action_exp && *action_exp++ == ',');
1171 } /* if */
1172 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1173 {
1174 collect = &stepping_list;
1175 }
1176 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
1177 {
1178 if (collect == &stepping_list) /* end stepping actions */
1179 collect = &tracepoint_list;
1180 else
1181 break; /* end tracepoint actions */
1182 }
1183 } /* for */
1184 memrange_sortmerge (&tracepoint_list);
1185 memrange_sortmerge (&stepping_list);
1186
1187 *tdp_actions = stringify_collection_list (&tracepoint_list,
1188 tdp_buff);
1189 *stepping_actions = stringify_collection_list (&stepping_list,
1190 step_buff);
1191 }
1192
1193 static void
1194 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1195 {
1196 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1197 {
1198 collect->aexpr_list =
1199 xrealloc (collect->aexpr_list,
1200 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1201 collect->aexpr_listsize *= 2;
1202 }
1203 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1204 collect->next_aexpr_elt++;
1205 }
1206
1207 static char *target_buf;
1208 static long target_buf_size;
1209
1210 /* Set "transparent" memory ranges
1211
1212 Allow trace mechanism to treat text-like sections
1213 (and perhaps all read-only sections) transparently,
1214 i.e. don't reject memory requests from these address ranges
1215 just because they haven't been collected. */
1216
1217 static void
1218 remote_set_transparent_ranges (void)
1219 {
1220 asection *s;
1221 bfd_size_type size;
1222 bfd_vma lma;
1223 int anysecs = 0;
1224
1225 if (!exec_bfd)
1226 return; /* No information to give. */
1227
1228 strcpy (target_buf, "QTro");
1229 for (s = exec_bfd->sections; s; s = s->next)
1230 {
1231 char tmp1[40], tmp2[40];
1232
1233 if ((s->flags & SEC_LOAD) == 0 ||
1234 /* (s->flags & SEC_CODE) == 0 || */
1235 (s->flags & SEC_READONLY) == 0)
1236 continue;
1237
1238 anysecs = 1;
1239 lma = s->lma;
1240 size = bfd_get_section_size (s);
1241 sprintf_vma (tmp1, lma);
1242 sprintf_vma (tmp2, lma + size);
1243 sprintf (target_buf + strlen (target_buf),
1244 ":%s,%s", tmp1, tmp2);
1245 }
1246 if (anysecs)
1247 {
1248 putpkt (target_buf);
1249 getpkt (&target_buf, &target_buf_size, 0);
1250 }
1251 }
1252
1253 /* tstart command:
1254
1255 Tell target to clear any previous trace experiment.
1256 Walk the list of tracepoints, and send them (and their actions)
1257 to the target. If no errors,
1258 Tell target to start a new trace experiment. */
1259
1260 void download_tracepoint (struct breakpoint *t);
1261
1262 static void
1263 trace_start_command (char *args, int from_tty)
1264 {
1265 VEC(breakpoint_p) *tp_vec = NULL;
1266 int ix;
1267 struct breakpoint *t;
1268
1269 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1270
1271 if (target_is_remote ())
1272 {
1273 putpkt ("QTinit");
1274 remote_get_noisy_reply (&target_buf, &target_buf_size);
1275 if (strcmp (target_buf, "OK"))
1276 error (_("Target does not support this command."));
1277
1278 tp_vec = all_tracepoints ();
1279 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1280 {
1281 download_tracepoint (t);
1282 }
1283 VEC_free (breakpoint_p, tp_vec);
1284
1285 /* Tell target to treat text-like sections as transparent. */
1286 remote_set_transparent_ranges ();
1287 /* Now insert traps and begin collecting data. */
1288 putpkt ("QTStart");
1289 remote_get_noisy_reply (&target_buf, &target_buf_size);
1290 if (strcmp (target_buf, "OK"))
1291 error (_("Bogus reply from target: %s"), target_buf);
1292 set_traceframe_num (-1); /* All old traceframes invalidated. */
1293 set_tracepoint_num (-1);
1294 set_traceframe_context (NULL);
1295 trace_running_p = 1;
1296 if (deprecated_trace_start_stop_hook)
1297 deprecated_trace_start_stop_hook (1, from_tty);
1298
1299 }
1300 else
1301 error (_("Trace can only be run on remote targets."));
1302 }
1303
1304 /* Send the definition of a single tracepoint to the target. */
1305
1306 void
1307 download_tracepoint (struct breakpoint *t)
1308 {
1309 char tmp[40];
1310 char buf[2048];
1311 char **tdp_actions;
1312 char **stepping_actions;
1313 int ndx;
1314 struct cleanup *old_chain = NULL;
1315 struct agent_expr *aexpr;
1316 struct cleanup *aexpr_chain = NULL;
1317
1318 sprintf_vma (tmp, (t->loc ? t->loc->address : 0));
1319 sprintf (buf, "QTDP:%x:%s:%c:%lx:%x", t->number,
1320 tmp, /* address */
1321 (t->enable_state == bp_enabled ? 'E' : 'D'),
1322 t->step_count, t->pass_count);
1323 /* If the tracepoint has a conditional, make it into an agent
1324 expression and append to the definition. */
1325 if (t->loc->cond)
1326 {
1327 /* Only test support at download time, we may not know target
1328 capabilities at definition time. */
1329 if (remote_supports_cond_tracepoints ())
1330 {
1331 aexpr = gen_eval_for_expr (t->loc->address, t->loc->cond);
1332 aexpr_chain = make_cleanup_free_agent_expr (aexpr);
1333 sprintf (buf + strlen (buf), ":X%x,", aexpr->len);
1334 mem2hex (aexpr->buf, buf + strlen (buf), aexpr->len);
1335 do_cleanups (aexpr_chain);
1336 }
1337 else
1338 warning (_("Target does not support conditional tracepoints, ignoring tp %d cond"), t->number);
1339 }
1340
1341 if (t->actions)
1342 strcat (buf, "-");
1343 putpkt (buf);
1344 remote_get_noisy_reply (&target_buf, &target_buf_size);
1345 if (strcmp (target_buf, "OK"))
1346 error (_("Target does not support tracepoints."));
1347
1348 if (!t->actions)
1349 return;
1350
1351 encode_actions (t, &tdp_actions, &stepping_actions);
1352 old_chain = make_cleanup (free_actions_list_cleanup_wrapper,
1353 tdp_actions);
1354 (void) make_cleanup (free_actions_list_cleanup_wrapper, stepping_actions);
1355
1356 /* do_single_steps (t); */
1357 if (tdp_actions)
1358 {
1359 for (ndx = 0; tdp_actions[ndx]; ndx++)
1360 {
1361 QUIT; /* allow user to bail out with ^C */
1362 sprintf (buf, "QTDP:-%x:%s:%s%c",
1363 t->number, tmp, /* address */
1364 tdp_actions[ndx],
1365 ((tdp_actions[ndx + 1] || stepping_actions)
1366 ? '-' : 0));
1367 putpkt (buf);
1368 remote_get_noisy_reply (&target_buf,
1369 &target_buf_size);
1370 if (strcmp (target_buf, "OK"))
1371 error (_("Error on target while setting tracepoints."));
1372 }
1373 }
1374 if (stepping_actions)
1375 {
1376 for (ndx = 0; stepping_actions[ndx]; ndx++)
1377 {
1378 QUIT; /* allow user to bail out with ^C */
1379 sprintf (buf, "QTDP:-%x:%s:%s%s%s",
1380 t->number, tmp, /* address */
1381 ((ndx == 0) ? "S" : ""),
1382 stepping_actions[ndx],
1383 (stepping_actions[ndx + 1] ? "-" : ""));
1384 putpkt (buf);
1385 remote_get_noisy_reply (&target_buf,
1386 &target_buf_size);
1387 if (strcmp (target_buf, "OK"))
1388 error (_("Error on target while setting tracepoints."));
1389 }
1390 }
1391 do_cleanups (old_chain);
1392 }
1393
1394 /* tstop command */
1395 static void
1396 trace_stop_command (char *args, int from_tty)
1397 {
1398 if (target_is_remote ())
1399 {
1400 putpkt ("QTStop");
1401 remote_get_noisy_reply (&target_buf, &target_buf_size);
1402 if (strcmp (target_buf, "OK"))
1403 error (_("Bogus reply from target: %s"), target_buf);
1404 trace_running_p = 0;
1405 if (deprecated_trace_start_stop_hook)
1406 deprecated_trace_start_stop_hook (0, from_tty);
1407 }
1408 else
1409 error (_("Trace can only be run on remote targets."));
1410 }
1411
1412 unsigned long trace_running_p;
1413
1414 /* tstatus command */
1415 static void
1416 trace_status_command (char *args, int from_tty)
1417 {
1418 if (target_is_remote ())
1419 {
1420 putpkt ("qTStatus");
1421 remote_get_noisy_reply (&target_buf, &target_buf_size);
1422
1423 if (target_buf[0] != 'T' ||
1424 (target_buf[1] != '0' && target_buf[1] != '1'))
1425 error (_("Bogus reply from target: %s"), target_buf);
1426
1427 /* exported for use by the GUI */
1428 trace_running_p = (target_buf[1] == '1');
1429 }
1430 else
1431 error (_("Trace can only be run on remote targets."));
1432 }
1433
1434 /* Worker function for the various flavors of the tfind command. */
1435 static void
1436 finish_tfind_command (char **msg,
1437 long *sizeof_msg,
1438 int from_tty)
1439 {
1440 int target_frameno = -1, target_tracept = -1;
1441 struct frame_id old_frame_id;
1442 char *reply;
1443
1444 old_frame_id = get_frame_id (get_current_frame ());
1445
1446 putpkt (*msg);
1447 reply = remote_get_noisy_reply (msg, sizeof_msg);
1448
1449 while (reply && *reply)
1450 switch (*reply)
1451 {
1452 case 'F':
1453 if ((target_frameno = (int) strtol (++reply, &reply, 16)) == -1)
1454 {
1455 /* A request for a non-existant trace frame has failed.
1456 Our response will be different, depending on FROM_TTY:
1457
1458 If FROM_TTY is true, meaning that this command was
1459 typed interactively by the user, then give an error
1460 and DO NOT change the state of traceframe_number etc.
1461
1462 However if FROM_TTY is false, meaning that we're either
1463 in a script, a loop, or a user-defined command, then
1464 DON'T give an error, but DO change the state of
1465 traceframe_number etc. to invalid.
1466
1467 The rationalle is that if you typed the command, you
1468 might just have committed a typo or something, and you'd
1469 like to NOT lose your current debugging state. However
1470 if you're in a user-defined command or especially in a
1471 loop, then you need a way to detect that the command
1472 failed WITHOUT aborting. This allows you to write
1473 scripts that search thru the trace buffer until the end,
1474 and then continue on to do something else. */
1475
1476 if (from_tty)
1477 error (_("Target failed to find requested trace frame."));
1478 else
1479 {
1480 if (info_verbose)
1481 printf_filtered ("End of trace buffer.\n");
1482 /* The following will not recurse, since it's
1483 special-cased. */
1484 trace_find_command ("-1", from_tty);
1485 reply = NULL; /* Break out of loop
1486 (avoid recursive nonsense). */
1487 }
1488 }
1489 break;
1490 case 'T':
1491 if ((target_tracept = (int) strtol (++reply, &reply, 16)) == -1)
1492 error (_("Target failed to find requested trace frame."));
1493 break;
1494 case 'O': /* "OK"? */
1495 if (reply[1] == 'K' && reply[2] == '\0')
1496 reply += 2;
1497 else
1498 error (_("Bogus reply from target: %s"), reply);
1499 break;
1500 default:
1501 error (_("Bogus reply from target: %s"), reply);
1502 }
1503
1504 reinit_frame_cache ();
1505 registers_changed ();
1506 set_traceframe_num (target_frameno);
1507 set_tracepoint_num (target_tracept);
1508 if (target_frameno == -1)
1509 set_traceframe_context (NULL);
1510 else
1511 set_traceframe_context (get_current_frame ());
1512
1513 if (from_tty)
1514 {
1515 enum print_what print_what;
1516
1517 /* NOTE: in immitation of the step command, try to determine
1518 whether we have made a transition from one function to
1519 another. If so, we'll print the "stack frame" (ie. the new
1520 function and it's arguments) -- otherwise we'll just show the
1521 new source line. */
1522
1523 if (frame_id_eq (old_frame_id,
1524 get_frame_id (get_current_frame ())))
1525 print_what = SRC_LINE;
1526 else
1527 print_what = SRC_AND_LOC;
1528
1529 print_stack_frame (get_selected_frame (NULL), 1, print_what);
1530 do_displays ();
1531 }
1532 }
1533
1534 /* trace_find_command takes a trace frame number n,
1535 sends "QTFrame:<n>" to the target,
1536 and accepts a reply that may contain several optional pieces
1537 of information: a frame number, a tracepoint number, and an
1538 indication of whether this is a trap frame or a stepping frame.
1539
1540 The minimal response is just "OK" (which indicates that the
1541 target does not give us a frame number or a tracepoint number).
1542 Instead of that, the target may send us a string containing
1543 any combination of:
1544 F<hexnum> (gives the selected frame number)
1545 T<hexnum> (gives the selected tracepoint number)
1546 */
1547
1548 /* tfind command */
1549 static void
1550 trace_find_command (char *args, int from_tty)
1551 { /* this should only be called with a numeric argument */
1552 int frameno = -1;
1553
1554 if (target_is_remote ())
1555 {
1556 if (deprecated_trace_find_hook)
1557 deprecated_trace_find_hook (args, from_tty);
1558
1559 if (args == 0 || *args == 0)
1560 { /* TFIND with no args means find NEXT trace frame. */
1561 if (traceframe_number == -1)
1562 frameno = 0; /* "next" is first one */
1563 else
1564 frameno = traceframe_number + 1;
1565 }
1566 else if (0 == strcmp (args, "-"))
1567 {
1568 if (traceframe_number == -1)
1569 error (_("not debugging trace buffer"));
1570 else if (from_tty && traceframe_number == 0)
1571 error (_("already at start of trace buffer"));
1572
1573 frameno = traceframe_number - 1;
1574 }
1575 else
1576 frameno = parse_and_eval_long (args);
1577
1578 if (frameno < -1)
1579 error (_("invalid input (%d is less than zero)"), frameno);
1580
1581 sprintf (target_buf, "QTFrame:%x", frameno);
1582 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
1583 }
1584 else
1585 error (_("Trace can only be run on remote targets."));
1586 }
1587
1588 /* tfind end */
1589 static void
1590 trace_find_end_command (char *args, int from_tty)
1591 {
1592 trace_find_command ("-1", from_tty);
1593 }
1594
1595 /* tfind none */
1596 static void
1597 trace_find_none_command (char *args, int from_tty)
1598 {
1599 trace_find_command ("-1", from_tty);
1600 }
1601
1602 /* tfind start */
1603 static void
1604 trace_find_start_command (char *args, int from_tty)
1605 {
1606 trace_find_command ("0", from_tty);
1607 }
1608
1609 /* tfind pc command */
1610 static void
1611 trace_find_pc_command (char *args, int from_tty)
1612 {
1613 CORE_ADDR pc;
1614 char tmp[40];
1615
1616 if (target_is_remote ())
1617 {
1618 if (args == 0 || *args == 0)
1619 pc = regcache_read_pc (get_current_regcache ());
1620 else
1621 pc = parse_and_eval_address (args);
1622
1623 sprintf_vma (tmp, pc);
1624 sprintf (target_buf, "QTFrame:pc:%s", tmp);
1625 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
1626 }
1627 else
1628 error (_("Trace can only be run on remote targets."));
1629 }
1630
1631 /* tfind tracepoint command */
1632 static void
1633 trace_find_tracepoint_command (char *args, int from_tty)
1634 {
1635 int tdp;
1636
1637 if (target_is_remote ())
1638 {
1639 if (args == 0 || *args == 0)
1640 {
1641 if (tracepoint_number == -1)
1642 error (_("No current tracepoint -- please supply an argument."));
1643 else
1644 tdp = tracepoint_number; /* default is current TDP */
1645 }
1646 else
1647 tdp = parse_and_eval_long (args);
1648
1649 sprintf (target_buf, "QTFrame:tdp:%x", tdp);
1650 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
1651 }
1652 else
1653 error (_("Trace can only be run on remote targets."));
1654 }
1655
1656 /* TFIND LINE command:
1657
1658 This command will take a sourceline for argument, just like BREAK
1659 or TRACE (ie. anything that "decode_line_1" can handle).
1660
1661 With no argument, this command will find the next trace frame
1662 corresponding to a source line OTHER THAN THE CURRENT ONE. */
1663
1664 static void
1665 trace_find_line_command (char *args, int from_tty)
1666 {
1667 static CORE_ADDR start_pc, end_pc;
1668 struct symtabs_and_lines sals;
1669 struct symtab_and_line sal;
1670 struct cleanup *old_chain;
1671 char startpc_str[40], endpc_str[40];
1672
1673 if (target_is_remote ())
1674 {
1675 if (args == 0 || *args == 0)
1676 {
1677 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
1678 sals.nelts = 1;
1679 sals.sals = (struct symtab_and_line *)
1680 xmalloc (sizeof (struct symtab_and_line));
1681 sals.sals[0] = sal;
1682 }
1683 else
1684 {
1685 sals = decode_line_spec (args, 1);
1686 sal = sals.sals[0];
1687 }
1688
1689 old_chain = make_cleanup (xfree, sals.sals);
1690 if (sal.symtab == 0)
1691 {
1692 struct gdbarch *gdbarch = get_current_arch ();
1693
1694 printf_filtered ("TFIND: No line number information available");
1695 if (sal.pc != 0)
1696 {
1697 /* This is useful for "info line *0x7f34". If we can't
1698 tell the user about a source line, at least let them
1699 have the symbolic address. */
1700 printf_filtered (" for address ");
1701 wrap_here (" ");
1702 print_address (gdbarch, sal.pc, gdb_stdout);
1703 printf_filtered (";\n -- will attempt to find by PC. \n");
1704 }
1705 else
1706 {
1707 printf_filtered (".\n");
1708 return; /* No line, no PC; what can we do? */
1709 }
1710 }
1711 else if (sal.line > 0
1712 && find_line_pc_range (sal, &start_pc, &end_pc))
1713 {
1714 struct gdbarch *gdbarch = get_objfile_arch (sal.symtab->objfile);
1715
1716 if (start_pc == end_pc)
1717 {
1718 printf_filtered ("Line %d of \"%s\"",
1719 sal.line, sal.symtab->filename);
1720 wrap_here (" ");
1721 printf_filtered (" is at address ");
1722 print_address (gdbarch, start_pc, gdb_stdout);
1723 wrap_here (" ");
1724 printf_filtered (" but contains no code.\n");
1725 sal = find_pc_line (start_pc, 0);
1726 if (sal.line > 0 &&
1727 find_line_pc_range (sal, &start_pc, &end_pc) &&
1728 start_pc != end_pc)
1729 printf_filtered ("Attempting to find line %d instead.\n",
1730 sal.line);
1731 else
1732 error (_("Cannot find a good line."));
1733 }
1734 }
1735 else
1736 /* Is there any case in which we get here, and have an address
1737 which the user would want to see? If we have debugging
1738 symbols and no line numbers? */
1739 error (_("Line number %d is out of range for \"%s\"."),
1740 sal.line, sal.symtab->filename);
1741
1742 sprintf_vma (startpc_str, start_pc);
1743 sprintf_vma (endpc_str, end_pc - 1);
1744 /* Find within range of stated line. */
1745 if (args && *args)
1746 sprintf (target_buf, "QTFrame:range:%s:%s",
1747 startpc_str, endpc_str);
1748 /* Find OUTSIDE OF range of CURRENT line. */
1749 else
1750 sprintf (target_buf, "QTFrame:outside:%s:%s",
1751 startpc_str, endpc_str);
1752 finish_tfind_command (&target_buf, &target_buf_size,
1753 from_tty);
1754 do_cleanups (old_chain);
1755 }
1756 else
1757 error (_("Trace can only be run on remote targets."));
1758 }
1759
1760 /* tfind range command */
1761 static void
1762 trace_find_range_command (char *args, int from_tty)
1763 {
1764 static CORE_ADDR start, stop;
1765 char start_str[40], stop_str[40];
1766 char *tmp;
1767
1768 if (target_is_remote ())
1769 {
1770 if (args == 0 || *args == 0)
1771 { /* XXX FIXME: what should default behavior be? */
1772 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
1773 return;
1774 }
1775
1776 if (0 != (tmp = strchr (args, ',')))
1777 {
1778 *tmp++ = '\0'; /* terminate start address */
1779 while (isspace ((int) *tmp))
1780 tmp++;
1781 start = parse_and_eval_address (args);
1782 stop = parse_and_eval_address (tmp);
1783 }
1784 else
1785 { /* no explicit end address? */
1786 start = parse_and_eval_address (args);
1787 stop = start + 1; /* ??? */
1788 }
1789
1790 sprintf_vma (start_str, start);
1791 sprintf_vma (stop_str, stop);
1792 sprintf (target_buf, "QTFrame:range:%s:%s", start_str, stop_str);
1793 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
1794 }
1795 else
1796 error (_("Trace can only be run on remote targets."));
1797 }
1798
1799 /* tfind outside command */
1800 static void
1801 trace_find_outside_command (char *args, int from_tty)
1802 {
1803 CORE_ADDR start, stop;
1804 char start_str[40], stop_str[40];
1805 char *tmp;
1806
1807 if (target_is_remote ())
1808 {
1809 if (args == 0 || *args == 0)
1810 { /* XXX FIXME: what should default behavior be? */
1811 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
1812 return;
1813 }
1814
1815 if (0 != (tmp = strchr (args, ',')))
1816 {
1817 *tmp++ = '\0'; /* terminate start address */
1818 while (isspace ((int) *tmp))
1819 tmp++;
1820 start = parse_and_eval_address (args);
1821 stop = parse_and_eval_address (tmp);
1822 }
1823 else
1824 { /* no explicit end address? */
1825 start = parse_and_eval_address (args);
1826 stop = start + 1; /* ??? */
1827 }
1828
1829 sprintf_vma (start_str, start);
1830 sprintf_vma (stop_str, stop);
1831 sprintf (target_buf, "QTFrame:outside:%s:%s", start_str, stop_str);
1832 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
1833 }
1834 else
1835 error (_("Trace can only be run on remote targets."));
1836 }
1837
1838 /* info scope command: list the locals for a scope. */
1839 static void
1840 scope_info (char *args, int from_tty)
1841 {
1842 struct symtabs_and_lines sals;
1843 struct symbol *sym;
1844 struct minimal_symbol *msym;
1845 struct block *block;
1846 char **canonical, *symname, *save_args = args;
1847 struct dict_iterator iter;
1848 int j, count = 0;
1849 struct gdbarch *gdbarch;
1850 int regno;
1851
1852 if (args == 0 || *args == 0)
1853 error (_("requires an argument (function, line or *addr) to define a scope"));
1854
1855 sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
1856 if (sals.nelts == 0)
1857 return; /* presumably decode_line_1 has already warned */
1858
1859 /* Resolve line numbers to PC */
1860 resolve_sal_pc (&sals.sals[0]);
1861 block = block_for_pc (sals.sals[0].pc);
1862
1863 while (block != 0)
1864 {
1865 QUIT; /* allow user to bail out with ^C */
1866 ALL_BLOCK_SYMBOLS (block, iter, sym)
1867 {
1868 QUIT; /* allow user to bail out with ^C */
1869 if (count == 0)
1870 printf_filtered ("Scope for %s:\n", save_args);
1871 count++;
1872
1873 symname = SYMBOL_PRINT_NAME (sym);
1874 if (symname == NULL || *symname == '\0')
1875 continue; /* probably botched, certainly useless */
1876
1877 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
1878
1879 printf_filtered ("Symbol %s is ", symname);
1880 switch (SYMBOL_CLASS (sym))
1881 {
1882 default:
1883 case LOC_UNDEF: /* messed up symbol? */
1884 printf_filtered ("a bogus symbol, class %d.\n",
1885 SYMBOL_CLASS (sym));
1886 count--; /* don't count this one */
1887 continue;
1888 case LOC_CONST:
1889 printf_filtered ("a constant with value %ld (0x%lx)",
1890 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
1891 break;
1892 case LOC_CONST_BYTES:
1893 printf_filtered ("constant bytes: ");
1894 if (SYMBOL_TYPE (sym))
1895 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
1896 fprintf_filtered (gdb_stdout, " %02x",
1897 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
1898 break;
1899 case LOC_STATIC:
1900 printf_filtered ("in static storage at address ");
1901 printf_filtered ("%s", paddress (gdbarch,
1902 SYMBOL_VALUE_ADDRESS (sym)));
1903 break;
1904 case LOC_REGISTER:
1905 /* GDBARCH is the architecture associated with the objfile
1906 the symbol is defined in; the target architecture may be
1907 different, and may provide additional registers. However,
1908 we do not know the target architecture at this point.
1909 We assume the objfile architecture will contain all the
1910 standard registers that occur in debug info in that
1911 objfile. */
1912 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
1913
1914 if (SYMBOL_IS_ARGUMENT (sym))
1915 printf_filtered ("an argument in register $%s",
1916 gdbarch_register_name (gdbarch, regno));
1917 else
1918 printf_filtered ("a local variable in register $%s",
1919 gdbarch_register_name (gdbarch, regno));
1920 break;
1921 case LOC_ARG:
1922 printf_filtered ("an argument at stack/frame offset %ld",
1923 SYMBOL_VALUE (sym));
1924 break;
1925 case LOC_LOCAL:
1926 printf_filtered ("a local variable at frame offset %ld",
1927 SYMBOL_VALUE (sym));
1928 break;
1929 case LOC_REF_ARG:
1930 printf_filtered ("a reference argument at offset %ld",
1931 SYMBOL_VALUE (sym));
1932 break;
1933 case LOC_REGPARM_ADDR:
1934 /* Note comment at LOC_REGISTER. */
1935 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
1936 printf_filtered ("the address of an argument, in register $%s",
1937 gdbarch_register_name (gdbarch, regno));
1938 break;
1939 case LOC_TYPEDEF:
1940 printf_filtered ("a typedef.\n");
1941 continue;
1942 case LOC_LABEL:
1943 printf_filtered ("a label at address ");
1944 printf_filtered ("%s", paddress (gdbarch,
1945 SYMBOL_VALUE_ADDRESS (sym)));
1946 break;
1947 case LOC_BLOCK:
1948 printf_filtered ("a function at address ");
1949 printf_filtered ("%s",
1950 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
1951 break;
1952 case LOC_UNRESOLVED:
1953 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
1954 NULL, NULL);
1955 if (msym == NULL)
1956 printf_filtered ("Unresolved Static");
1957 else
1958 {
1959 printf_filtered ("static storage at address ");
1960 printf_filtered ("%s",
1961 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
1962 }
1963 break;
1964 case LOC_OPTIMIZED_OUT:
1965 printf_filtered ("optimized out.\n");
1966 continue;
1967 case LOC_COMPUTED:
1968 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym, gdb_stdout);
1969 break;
1970 }
1971 if (SYMBOL_TYPE (sym))
1972 printf_filtered (", length %d.\n",
1973 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
1974 }
1975 if (BLOCK_FUNCTION (block))
1976 break;
1977 else
1978 block = BLOCK_SUPERBLOCK (block);
1979 }
1980 if (count <= 0)
1981 printf_filtered ("Scope for %s contains no locals or arguments.\n",
1982 save_args);
1983 }
1984
1985 /* worker function (cleanup) */
1986 static void
1987 replace_comma (void *data)
1988 {
1989 char *comma = data;
1990 *comma = ',';
1991 }
1992
1993 /* tdump command */
1994 static void
1995 trace_dump_command (char *args, int from_tty)
1996 {
1997 struct regcache *regcache;
1998 struct gdbarch *gdbarch;
1999 struct breakpoint *t;
2000 struct action_line *action;
2001 char *action_exp, *next_comma;
2002 struct cleanup *old_cleanups;
2003 int stepping_actions = 0;
2004 int stepping_frame = 0;
2005
2006 if (!target_is_remote ())
2007 {
2008 error (_("Trace can only be run on remote targets."));
2009 return;
2010 }
2011
2012 if (tracepoint_number == -1)
2013 {
2014 warning (_("No current trace frame."));
2015 return;
2016 }
2017
2018 t = get_tracepoint (tracepoint_number);
2019
2020 if (t == NULL)
2021 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2022 tracepoint_number);
2023
2024 old_cleanups = make_cleanup (null_cleanup, NULL);
2025
2026 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2027 tracepoint_number, traceframe_number);
2028
2029 /* The current frame is a trap frame if the frame PC is equal
2030 to the tracepoint PC. If not, then the current frame was
2031 collected during single-stepping. */
2032
2033 regcache = get_current_regcache ();
2034 gdbarch = get_regcache_arch (regcache);
2035
2036 stepping_frame = (t->loc->address != (regcache_read_pc (regcache)
2037 - gdbarch_decr_pc_after_break (gdbarch)));
2038
2039 for (action = t->actions; action; action = action->next)
2040 {
2041 struct cmd_list_element *cmd;
2042
2043 QUIT; /* allow user to bail out with ^C */
2044 action_exp = action->action;
2045 while (isspace ((int) *action_exp))
2046 action_exp++;
2047
2048 /* The collection actions to be done while stepping are
2049 bracketed by the commands "while-stepping" and "end". */
2050
2051 if (*action_exp == '#') /* comment line */
2052 continue;
2053
2054 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2055 if (cmd == 0)
2056 error (_("Bad action list item: %s"), action_exp);
2057
2058 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2059 stepping_actions = 1;
2060 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
2061 stepping_actions = 0;
2062 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2063 {
2064 /* Display the collected data.
2065 For the trap frame, display only what was collected at
2066 the trap. Likewise for stepping frames, display only
2067 what was collected while stepping. This means that the
2068 two boolean variables, STEPPING_FRAME and
2069 STEPPING_ACTIONS should be equal. */
2070 if (stepping_frame == stepping_actions)
2071 {
2072 do
2073 { /* repeat over a comma-separated list */
2074 QUIT; /* allow user to bail out with ^C */
2075 if (*action_exp == ',')
2076 action_exp++;
2077 while (isspace ((int) *action_exp))
2078 action_exp++;
2079
2080 next_comma = strchr (action_exp, ',');
2081
2082 if (0 == strncasecmp (action_exp, "$reg", 4))
2083 registers_info (NULL, from_tty);
2084 else if (0 == strncasecmp (action_exp, "$loc", 4))
2085 locals_info (NULL, from_tty);
2086 else if (0 == strncasecmp (action_exp, "$arg", 4))
2087 args_info (NULL, from_tty);
2088 else
2089 { /* variable */
2090 if (next_comma)
2091 {
2092 make_cleanup (replace_comma, next_comma);
2093 *next_comma = '\0';
2094 }
2095 printf_filtered ("%s = ", action_exp);
2096 output_command (action_exp, from_tty);
2097 printf_filtered ("\n");
2098 }
2099 if (next_comma)
2100 *next_comma = ',';
2101 action_exp = next_comma;
2102 }
2103 while (action_exp && *action_exp == ',');
2104 }
2105 }
2106 }
2107 discard_cleanups (old_cleanups);
2108 }
2109
2110 /* Convert the memory pointed to by mem into hex, placing result in buf.
2111 * Return a pointer to the last char put in buf (null)
2112 * "stolen" from sparc-stub.c
2113 */
2114
2115 static const char hexchars[] = "0123456789abcdef";
2116
2117 static char *
2118 mem2hex (gdb_byte *mem, char *buf, int count)
2119 {
2120 gdb_byte ch;
2121
2122 while (count-- > 0)
2123 {
2124 ch = *mem++;
2125
2126 *buf++ = hexchars[ch >> 4];
2127 *buf++ = hexchars[ch & 0xf];
2128 }
2129
2130 *buf = 0;
2131
2132 return buf;
2133 }
2134
2135 int
2136 get_traceframe_number (void)
2137 {
2138 return traceframe_number;
2139 }
2140
2141
2142 /* module initialization */
2143 void
2144 _initialize_tracepoint (void)
2145 {
2146 struct cmd_list_element *c;
2147
2148 traceframe_number = -1;
2149 tracepoint_number = -1;
2150
2151 if (tracepoint_list.list == NULL)
2152 {
2153 tracepoint_list.listsize = 128;
2154 tracepoint_list.list = xmalloc
2155 (tracepoint_list.listsize * sizeof (struct memrange));
2156 }
2157 if (tracepoint_list.aexpr_list == NULL)
2158 {
2159 tracepoint_list.aexpr_listsize = 128;
2160 tracepoint_list.aexpr_list = xmalloc
2161 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
2162 }
2163
2164 if (stepping_list.list == NULL)
2165 {
2166 stepping_list.listsize = 128;
2167 stepping_list.list = xmalloc
2168 (stepping_list.listsize * sizeof (struct memrange));
2169 }
2170
2171 if (stepping_list.aexpr_list == NULL)
2172 {
2173 stepping_list.aexpr_listsize = 128;
2174 stepping_list.aexpr_list = xmalloc
2175 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
2176 }
2177
2178 add_info ("scope", scope_info,
2179 _("List the variables local to a scope"));
2180
2181 add_cmd ("tracepoints", class_trace, NULL,
2182 _("Tracing of program execution without stopping the program."),
2183 &cmdlist);
2184
2185 add_com ("tdump", class_trace, trace_dump_command,
2186 _("Print everything collected at the current tracepoint."));
2187
2188 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
2189 Select a trace frame;\n\
2190 No argument means forward by one frame; '-' means backward by one frame."),
2191 &tfindlist, "tfind ", 1, &cmdlist);
2192
2193 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
2194 Select a trace frame whose PC is outside the given range.\n\
2195 Usage: tfind outside addr1, addr2"),
2196 &tfindlist);
2197
2198 add_cmd ("range", class_trace, trace_find_range_command, _("\
2199 Select a trace frame whose PC is in the given range.\n\
2200 Usage: tfind range addr1,addr2"),
2201 &tfindlist);
2202
2203 add_cmd ("line", class_trace, trace_find_line_command, _("\
2204 Select a trace frame by source line.\n\
2205 Argument can be a line number (with optional source file), \n\
2206 a function name, or '*' followed by an address.\n\
2207 Default argument is 'the next source line that was traced'."),
2208 &tfindlist);
2209
2210 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
2211 Select a trace frame by tracepoint number.\n\
2212 Default is the tracepoint for the current trace frame."),
2213 &tfindlist);
2214
2215 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
2216 Select a trace frame by PC.\n\
2217 Default is the current PC, or the PC of the current trace frame."),
2218 &tfindlist);
2219
2220 add_cmd ("end", class_trace, trace_find_end_command, _("\
2221 Synonym for 'none'.\n\
2222 De-select any trace frame and resume 'live' debugging."),
2223 &tfindlist);
2224
2225 add_cmd ("none", class_trace, trace_find_none_command,
2226 _("De-select any trace frame and resume 'live' debugging."),
2227 &tfindlist);
2228
2229 add_cmd ("start", class_trace, trace_find_start_command,
2230 _("Select the first trace frame in the trace buffer."),
2231 &tfindlist);
2232
2233 add_com ("tstatus", class_trace, trace_status_command,
2234 _("Display the status of the current trace data collection."));
2235
2236 add_com ("tstop", class_trace, trace_stop_command,
2237 _("Stop trace data collection."));
2238
2239 add_com ("tstart", class_trace, trace_start_command,
2240 _("Start trace data collection."));
2241
2242 add_com ("end", class_trace, end_actions_pseudocommand, _("\
2243 Ends a list of commands or actions.\n\
2244 Several GDB commands allow you to enter a list of commands or actions.\n\
2245 Entering \"end\" on a line by itself is the normal way to terminate\n\
2246 such a list.\n\n\
2247 Note: the \"end\" command cannot be used at the gdb prompt."));
2248
2249 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
2250 Specify single-stepping behavior at a tracepoint.\n\
2251 Argument is number of instructions to trace in single-step mode\n\
2252 following the tracepoint. This command is normally followed by\n\
2253 one or more \"collect\" commands, to specify what to collect\n\
2254 while single-stepping.\n\n\
2255 Note: this command can only be used in a tracepoint \"actions\" list."));
2256
2257 add_com_alias ("ws", "while-stepping", class_alias, 0);
2258 add_com_alias ("stepping", "while-stepping", class_alias, 0);
2259
2260 add_com ("collect", class_trace, collect_pseudocommand, _("\
2261 Specify one or more data items to be collected at a tracepoint.\n\
2262 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
2263 collect all data (variables, registers) referenced by that expression.\n\
2264 Also accepts the following special arguments:\n\
2265 $regs -- all registers.\n\
2266 $args -- all function arguments.\n\
2267 $locals -- all variables local to the block/function scope.\n\
2268 Note: this command can only be used in a tracepoint \"actions\" list."));
2269
2270 add_com ("actions", class_trace, trace_actions_command, _("\
2271 Specify the actions to be taken at a tracepoint.\n\
2272 Tracepoint actions may include collecting of specified data, \n\
2273 single-stepping, or enabling/disabling other tracepoints, \n\
2274 depending on target's capabilities."));
2275
2276 target_buf_size = 2048;
2277 target_buf = xmalloc (target_buf_size);
2278 }
This page took 0.122697 seconds and 4 git commands to generate.