* varobj.c (varobj_set_display_format): Use xfree.
[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 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 "symtab.h"
23 #include "frame.h"
24 #include "gdbtypes.h"
25 #include "expression.h"
26 #include "gdbcmd.h"
27 #include "value.h"
28 #include "target.h"
29 #include "language.h"
30 #include "gdb_string.h"
31 #include "inferior.h"
32 #include "tracepoint.h"
33 #include "remote.h"
34 #include "linespec.h"
35 #include "regcache.h"
36 #include "completer.h"
37 #include "block.h"
38 #include "dictionary.h"
39 #include "observer.h"
40 #include "user-regs.h"
41
42 #include "ax.h"
43 #include "ax-gdb.h"
44
45 /* readline include files */
46 #include "readline/readline.h"
47 #include "readline/history.h"
48
49 /* readline defines this. */
50 #undef savestring
51
52 #ifdef HAVE_UNISTD_H
53 #include <unistd.h>
54 #endif
55
56 /* Maximum length of an agent aexpression.
57 This accounts for the fact that packets are limited to 400 bytes
58 (which includes everything -- including the checksum), and assumes
59 the worst case of maximum length for each of the pieces of a
60 continuation packet.
61
62 NOTE: expressions get mem2hex'ed otherwise this would be twice as
63 large. (400 - 31)/2 == 184 */
64 #define MAX_AGENT_EXPR_LEN 184
65
66
67 extern void (*deprecated_readline_begin_hook) (char *, ...);
68 extern char *(*deprecated_readline_hook) (char *);
69 extern void (*deprecated_readline_end_hook) (void);
70 extern int addressprint; /* Print machine addresses? */
71
72 /* GDB commands implemented in other modules:
73 */
74
75 extern void output_command (char *, int);
76
77 /*
78 Tracepoint.c:
79
80 This module defines the following debugger commands:
81 trace : set a tracepoint on a function, line, or address.
82 info trace : list all debugger-defined tracepoints.
83 delete trace : delete one or more tracepoints.
84 enable trace : enable one or more tracepoints.
85 disable trace : disable one or more tracepoints.
86 actions : specify actions to be taken at a tracepoint.
87 passcount : specify a pass count for a tracepoint.
88 tstart : start a trace experiment.
89 tstop : stop a trace experiment.
90 tstatus : query the status of a trace experiment.
91 tfind : find a trace frame in the trace buffer.
92 tdump : print everything collected at the current tracepoint.
93 save-tracepoints : write tracepoint setup into a file.
94
95 This module defines the following user-visible debugger variables:
96 $trace_frame : sequence number of trace frame currently being debugged.
97 $trace_line : source line of trace frame currently being debugged.
98 $trace_file : source file of trace frame currently being debugged.
99 $tracepoint : tracepoint number of trace frame currently being debugged.
100 */
101
102
103 /* ======= Important global variables: ======= */
104
105 /* Chain of all tracepoints defined. */
106 struct tracepoint *tracepoint_chain;
107
108 /* Number of last tracepoint made. */
109 static int tracepoint_count;
110
111 /* Number of last traceframe collected. */
112 static int traceframe_number;
113
114 /* Tracepoint for last traceframe collected. */
115 static int tracepoint_number;
116
117 /* Symbol for function for last traceframe collected */
118 static struct symbol *traceframe_fun;
119
120 /* Symtab and line for last traceframe collected */
121 static struct symtab_and_line traceframe_sal;
122
123 /* Tracing command lists */
124 static struct cmd_list_element *tfindlist;
125
126 /* ======= Important command functions: ======= */
127 static void trace_command (char *, int);
128 static void tracepoints_info (char *, int);
129 static void delete_trace_command (char *, int);
130 static void enable_trace_command (char *, int);
131 static void disable_trace_command (char *, int);
132 static void trace_pass_command (char *, int);
133 static void trace_actions_command (char *, int);
134 static void trace_start_command (char *, int);
135 static void trace_stop_command (char *, int);
136 static void trace_status_command (char *, int);
137 static void trace_find_command (char *, int);
138 static void trace_find_pc_command (char *, int);
139 static void trace_find_tracepoint_command (char *, int);
140 static void trace_find_line_command (char *, int);
141 static void trace_find_range_command (char *, int);
142 static void trace_find_outside_command (char *, int);
143 static void tracepoint_save_command (char *, int);
144 static void trace_dump_command (char *, int);
145
146 /* support routines */
147 static void trace_mention (struct tracepoint *);
148
149 struct collection_list;
150 static void add_aexpr (struct collection_list *, struct agent_expr *);
151 static char *mem2hex (gdb_byte *, char *, int);
152 static void add_register (struct collection_list *collection,
153 unsigned int regno);
154 static struct cleanup *make_cleanup_free_actions (struct tracepoint *t);
155 static void free_actions_list (char **actions_list);
156 static void free_actions_list_cleanup_wrapper (void *);
157
158 extern void _initialize_tracepoint (void);
159
160 /* Utility: returns true if "target remote" */
161 static int
162 target_is_remote (void)
163 {
164 if (current_target.to_shortname &&
165 (strcmp (current_target.to_shortname, "remote") == 0
166 || strcmp (current_target.to_shortname, "extended-remote") == 0))
167 return 1;
168 else
169 return 0;
170 }
171
172 /* Utility: generate error from an incoming stub packet. */
173 static void
174 trace_error (char *buf)
175 {
176 if (*buf++ != 'E')
177 return; /* not an error msg */
178 switch (*buf)
179 {
180 case '1': /* malformed packet error */
181 if (*++buf == '0') /* general case: */
182 error (_("tracepoint.c: error in outgoing packet."));
183 else
184 error (_("tracepoint.c: error in outgoing packet at field #%ld."),
185 strtol (buf, NULL, 16));
186 case '2':
187 error (_("trace API error 0x%s."), ++buf);
188 default:
189 error (_("Target returns error code '%s'."), buf);
190 }
191 }
192
193 /* Utility: wait for reply from stub, while accepting "O" packets. */
194 static char *
195 remote_get_noisy_reply (char **buf_p,
196 long *sizeof_buf)
197 {
198 do /* Loop on reply from remote stub. */
199 {
200 char *buf;
201 QUIT; /* allow user to bail out with ^C */
202 getpkt (buf_p, sizeof_buf, 0);
203 buf = *buf_p;
204 if (buf[0] == 0)
205 error (_("Target does not support this command."));
206 else if (buf[0] == 'E')
207 trace_error (buf);
208 else if (buf[0] == 'O' &&
209 buf[1] != 'K')
210 remote_console_output (buf + 1); /* 'O' message from stub */
211 else
212 return buf; /* here's the actual reply */
213 }
214 while (1);
215 }
216
217 /* Set tracepoint count to NUM. */
218 static void
219 set_tracepoint_count (int num)
220 {
221 tracepoint_count = num;
222 set_internalvar (lookup_internalvar ("tpnum"),
223 value_from_longest (builtin_type_int32, (LONGEST) num));
224 }
225
226 /* Set traceframe number to NUM. */
227 static void
228 set_traceframe_num (int num)
229 {
230 traceframe_number = num;
231 set_internalvar (lookup_internalvar ("trace_frame"),
232 value_from_longest (builtin_type_int32, (LONGEST) num));
233 }
234
235 /* Set tracepoint number to NUM. */
236 static void
237 set_tracepoint_num (int num)
238 {
239 tracepoint_number = num;
240 set_internalvar (lookup_internalvar ("tracepoint"),
241 value_from_longest (builtin_type_int32, (LONGEST) num));
242 }
243
244 /* Set externally visible debug variables for querying/printing
245 the traceframe context (line, function, file) */
246
247 static void
248 set_traceframe_context (CORE_ADDR trace_pc)
249 {
250 static struct type *func_string, *file_string;
251 static struct type *func_range, *file_range;
252 struct value *func_val;
253 struct value *file_val;
254 int len;
255
256 if (trace_pc == -1) /* Cease debugging any trace buffers. */
257 {
258 traceframe_fun = 0;
259 traceframe_sal.pc = traceframe_sal.line = 0;
260 traceframe_sal.symtab = NULL;
261 set_internalvar (lookup_internalvar ("trace_func"),
262 allocate_value (builtin_type_void));
263 set_internalvar (lookup_internalvar ("trace_file"),
264 allocate_value (builtin_type_void));
265 set_internalvar (lookup_internalvar ("trace_line"),
266 value_from_longest (builtin_type_int32,
267 (LONGEST) - 1));
268 return;
269 }
270
271 /* Save as globals for internal use. */
272 traceframe_sal = find_pc_line (trace_pc, 0);
273 traceframe_fun = find_pc_function (trace_pc);
274
275 /* Save linenumber as "$trace_line", a debugger variable visible to
276 users. */
277 set_internalvar (lookup_internalvar ("trace_line"),
278 value_from_longest (builtin_type_int32,
279 (LONGEST) traceframe_sal.line));
280
281 /* Save func name as "$trace_func", a debugger variable visible to
282 users. */
283 if (traceframe_fun == NULL ||
284 SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
285 set_internalvar (lookup_internalvar ("trace_func"),
286 allocate_value (builtin_type_void));
287 else
288 {
289 len = strlen (SYMBOL_LINKAGE_NAME (traceframe_fun));
290 func_range = create_range_type (func_range,
291 builtin_type_int32, 0, len - 1);
292 func_string = create_array_type (func_string,
293 builtin_type_true_char, func_range);
294 func_val = allocate_value (func_string);
295 deprecated_set_value_type (func_val, func_string);
296 memcpy (value_contents_raw (func_val),
297 SYMBOL_LINKAGE_NAME (traceframe_fun),
298 len);
299 deprecated_set_value_modifiable (func_val, 0);
300 set_internalvar (lookup_internalvar ("trace_func"), func_val);
301 }
302
303 /* Save file name as "$trace_file", a debugger variable visible to
304 users. */
305 if (traceframe_sal.symtab == NULL ||
306 traceframe_sal.symtab->filename == NULL)
307 set_internalvar (lookup_internalvar ("trace_file"),
308 allocate_value (builtin_type_void));
309 else
310 {
311 len = strlen (traceframe_sal.symtab->filename);
312 file_range = create_range_type (file_range,
313 builtin_type_int32, 0, len - 1);
314 file_string = create_array_type (file_string,
315 builtin_type_true_char, file_range);
316 file_val = allocate_value (file_string);
317 deprecated_set_value_type (file_val, file_string);
318 memcpy (value_contents_raw (file_val),
319 traceframe_sal.symtab->filename,
320 len);
321 deprecated_set_value_modifiable (file_val, 0);
322 set_internalvar (lookup_internalvar ("trace_file"), file_val);
323 }
324 }
325
326 /* Low level routine to set a tracepoint.
327 Returns the tracepoint object so caller can set other things.
328 Does not set the tracepoint number!
329 Does not print anything.
330
331 ==> This routine should not be called if there is a chance of later
332 error(); otherwise it leaves a bogus tracepoint on the chain.
333 Validate your arguments BEFORE calling this routine! */
334
335 static struct tracepoint *
336 set_raw_tracepoint (struct symtab_and_line sal)
337 {
338 struct tracepoint *t, *tc;
339 struct cleanup *old_chain;
340
341 t = (struct tracepoint *) xmalloc (sizeof (struct tracepoint));
342 old_chain = make_cleanup (xfree, t);
343 memset (t, 0, sizeof (*t));
344 t->address = sal.pc;
345 if (sal.symtab == NULL)
346 t->source_file = NULL;
347 else
348 t->source_file = savestring (sal.symtab->filename,
349 strlen (sal.symtab->filename));
350
351 t->section = sal.section;
352 t->language = current_language->la_language;
353 t->input_radix = input_radix;
354 t->line_number = sal.line;
355 t->enabled_p = 1;
356 t->next = 0;
357 t->step_count = 0;
358 t->pass_count = 0;
359 t->addr_string = NULL;
360
361 /* Add this tracepoint to the end of the chain
362 so that a list of tracepoints will come out in order
363 of increasing numbers. */
364
365 tc = tracepoint_chain;
366 if (tc == 0)
367 tracepoint_chain = t;
368 else
369 {
370 while (tc->next)
371 tc = tc->next;
372 tc->next = t;
373 }
374 discard_cleanups (old_chain);
375 return t;
376 }
377
378 /* Set a tracepoint according to ARG (function, linenum or *address). */
379 static void
380 trace_command (char *arg, int from_tty)
381 {
382 char **canonical = (char **) NULL;
383 struct symtabs_and_lines sals;
384 struct symtab_and_line sal;
385 struct tracepoint *t;
386 char *addr_start = 0, *addr_end = 0;
387 int i;
388
389 if (!arg || !*arg)
390 error (_("trace command requires an argument"));
391
392 if (from_tty && info_verbose)
393 printf_filtered ("TRACE %s\n", arg);
394
395 addr_start = arg;
396 sals = decode_line_1 (&arg, 1, (struct symtab *) NULL,
397 0, &canonical, NULL);
398 addr_end = arg;
399 if (!sals.nelts)
400 return; /* ??? Presumably decode_line_1 has already warned? */
401
402 /* Resolve all line numbers to PC's */
403 for (i = 0; i < sals.nelts; i++)
404 resolve_sal_pc (&sals.sals[i]);
405
406 /* Now set all the tracepoints. */
407 for (i = 0; i < sals.nelts; i++)
408 {
409 sal = sals.sals[i];
410
411 t = set_raw_tracepoint (sal);
412 set_tracepoint_count (tracepoint_count + 1);
413 t->number = tracepoint_count;
414
415 /* If a canonical line spec is needed use that instead of the
416 command string. */
417 if (canonical != (char **) NULL && canonical[i] != NULL)
418 t->addr_string = canonical[i];
419 else if (addr_start)
420 t->addr_string = savestring (addr_start, addr_end - addr_start);
421
422 trace_mention (t);
423 }
424
425 if (sals.nelts > 1)
426 {
427 printf_filtered ("Multiple tracepoints were set.\n");
428 printf_filtered ("Use 'delete trace' to delete unwanted tracepoints.\n");
429 }
430 }
431
432 /* Tell the user we have just set a tracepoint TP. */
433
434 static void
435 trace_mention (struct tracepoint *tp)
436 {
437 printf_filtered ("Tracepoint %d", tp->number);
438
439 if (addressprint || (tp->source_file == NULL))
440 {
441 printf_filtered (" at ");
442 printf_filtered ("%s", paddress (tp->address));
443 }
444 if (tp->source_file)
445 printf_filtered (": file %s, line %d.",
446 tp->source_file, tp->line_number);
447
448 printf_filtered ("\n");
449 }
450
451 /* Print information on tracepoint number TPNUM_EXP, or all if
452 omitted. */
453
454 static void
455 tracepoints_info (char *tpnum_exp, int from_tty)
456 {
457 struct tracepoint *t;
458 struct action_line *action;
459 int found_a_tracepoint = 0;
460 char wrap_indent[80];
461 struct symbol *sym;
462 int tpnum = -1;
463
464 if (tpnum_exp)
465 tpnum = parse_and_eval_long (tpnum_exp);
466
467 ALL_TRACEPOINTS (t)
468 if (tpnum == -1 || tpnum == t->number)
469 {
470 extern int addressprint; /* Print machine addresses? */
471
472 if (!found_a_tracepoint++)
473 {
474 printf_filtered ("Num Enb ");
475 if (addressprint)
476 {
477 if (gdbarch_addr_bit (current_gdbarch) <= 32)
478 printf_filtered ("Address ");
479 else
480 printf_filtered ("Address ");
481 }
482 printf_filtered ("PassC StepC What\n");
483 }
484 strcpy (wrap_indent, " ");
485 if (addressprint)
486 {
487 if (gdbarch_addr_bit (current_gdbarch) <= 32)
488 strcat (wrap_indent, " ");
489 else
490 strcat (wrap_indent, " ");
491 }
492
493 printf_filtered ("%-3d %-3s ", t->number,
494 t->enabled_p ? "y" : "n");
495 if (addressprint)
496 {
497 char *tmp;
498
499 if (gdbarch_addr_bit (current_gdbarch) <= 32)
500 tmp = hex_string_custom (t->address & (CORE_ADDR) 0xffffffff,
501 8);
502 else
503 tmp = hex_string_custom (t->address, 16);
504
505 printf_filtered ("%s ", tmp);
506 }
507 printf_filtered ("%-5d %-5ld ", t->pass_count, t->step_count);
508
509 if (t->source_file)
510 {
511 sym = find_pc_sect_function (t->address, t->section);
512 if (sym)
513 {
514 fputs_filtered ("in ", gdb_stdout);
515 fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
516 wrap_here (wrap_indent);
517 fputs_filtered (" at ", gdb_stdout);
518 }
519 fputs_filtered (t->source_file, gdb_stdout);
520 printf_filtered (":%d", t->line_number);
521 }
522 else
523 print_address_symbolic (t->address, gdb_stdout, demangle, " ");
524
525 printf_filtered ("\n");
526 if (t->actions)
527 {
528 printf_filtered (" Actions for tracepoint %d: \n", t->number);
529 for (action = t->actions; action; action = action->next)
530 {
531 printf_filtered ("\t%s\n", action->action);
532 }
533 }
534 }
535 if (!found_a_tracepoint)
536 {
537 if (tpnum == -1)
538 printf_filtered ("No tracepoints.\n");
539 else
540 printf_filtered ("No tracepoint number %d.\n", tpnum);
541 }
542 }
543
544 /* Optimization: the code to parse an enable, disable, or delete TP
545 command is virtually identical except for whether it performs an
546 enable, disable, or delete. Therefore I've combined them into one
547 function with an opcode. */
548 enum tracepoint_opcode
549 {
550 enable_op,
551 disable_op,
552 delete_op
553 };
554
555 /* This function implements enable, disable and delete commands. */
556 static void
557 tracepoint_operation (struct tracepoint *t, int from_tty,
558 enum tracepoint_opcode opcode)
559 {
560 struct tracepoint *t2;
561
562 if (t == NULL) /* no tracepoint operand */
563 return;
564
565 switch (opcode)
566 {
567 case enable_op:
568 t->enabled_p = 1;
569 observer_notify_tracepoint_modified (t->number);
570 break;
571 case disable_op:
572 t->enabled_p = 0;
573 observer_notify_tracepoint_modified (t->number);
574 break;
575 case delete_op:
576 if (tracepoint_chain == t)
577 tracepoint_chain = t->next;
578
579 ALL_TRACEPOINTS (t2)
580 if (t2->next == t)
581 {
582 t2->next = t->next;
583 break;
584 }
585
586 observer_notify_tracepoint_deleted (t->number);
587
588 if (t->addr_string)
589 xfree (t->addr_string);
590 if (t->source_file)
591 xfree (t->source_file);
592 if (t->actions)
593 free_actions (t);
594
595 xfree (t);
596 break;
597 }
598 }
599
600 /* Utility: parse a tracepoint number and look it up in the list.
601 If MULTI_P is true, there might be a range of tracepoints in ARG.
602 if OPTIONAL_P is true, then if the argument is missing, the most
603 recent tracepoint (tracepoint_count) is returned. */
604 struct tracepoint *
605 get_tracepoint_by_number (char **arg, int multi_p, int optional_p)
606 {
607 struct tracepoint *t;
608 int tpnum;
609 char *instring = arg == NULL ? NULL : *arg;
610
611 if (arg == NULL || *arg == NULL || ! **arg)
612 {
613 if (optional_p)
614 tpnum = tracepoint_count;
615 else
616 error_no_arg (_("tracepoint number"));
617 }
618 else
619 tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
620
621 if (tpnum <= 0)
622 {
623 if (instring && *instring)
624 printf_filtered ("bad tracepoint number at or near '%s'\n",
625 instring);
626 else
627 printf_filtered ("Tracepoint argument missing and no previous tracepoint\n");
628 return NULL;
629 }
630
631 ALL_TRACEPOINTS (t)
632 if (t->number == tpnum)
633 {
634 return t;
635 }
636
637 /* FIXME: if we are in the middle of a range we don't want to give
638 a message. The current interface to get_number_or_range doesn't
639 allow us to discover this. */
640 printf_unfiltered ("No tracepoint number %d.\n", tpnum);
641 return NULL;
642 }
643
644 /* Utility:
645 parse a list of tracepoint numbers, and call a func for each. */
646 static void
647 map_args_over_tracepoints (char *args, int from_tty,
648 enum tracepoint_opcode opcode)
649 {
650 struct tracepoint *t, *tmp;
651
652 if (args == 0 || *args == 0) /* do them all */
653 ALL_TRACEPOINTS_SAFE (t, tmp)
654 tracepoint_operation (t, from_tty, opcode);
655 else
656 while (*args)
657 {
658 QUIT; /* Give user option to bail out with ^C. */
659 t = get_tracepoint_by_number (&args, 1, 0);
660 tracepoint_operation (t, from_tty, opcode);
661 while (*args == ' ' || *args == '\t')
662 args++;
663 }
664 }
665
666 /* The 'enable trace' command enables tracepoints.
667 Not supported by all targets. */
668 static void
669 enable_trace_command (char *args, int from_tty)
670 {
671 dont_repeat ();
672 map_args_over_tracepoints (args, from_tty, enable_op);
673 }
674
675 /* The 'disable trace' command disables tracepoints.
676 Not supported by all targets. */
677 static void
678 disable_trace_command (char *args, int from_tty)
679 {
680 dont_repeat ();
681 map_args_over_tracepoints (args, from_tty, disable_op);
682 }
683
684 /* Remove a tracepoint (or all if no argument) */
685 static void
686 delete_trace_command (char *args, int from_tty)
687 {
688 dont_repeat ();
689 if (!args || !*args) /* No args implies all tracepoints; */
690 if (from_tty) /* confirm only if from_tty... */
691 if (tracepoint_chain) /* and if there are tracepoints to
692 delete! */
693 if (!query ("Delete all tracepoints? "))
694 return;
695
696 map_args_over_tracepoints (args, from_tty, delete_op);
697 }
698
699 /* Set passcount for tracepoint.
700
701 First command argument is passcount, second is tracepoint number.
702 If tracepoint number omitted, apply to most recently defined.
703 Also accepts special argument "all". */
704
705 static void
706 trace_pass_command (char *args, int from_tty)
707 {
708 struct tracepoint *t1 = (struct tracepoint *) -1, *t2;
709 unsigned int count;
710 int all = 0;
711
712 if (args == 0 || *args == 0)
713 error (_("passcount command requires an argument (count + optional TP num)"));
714
715 count = strtoul (args, &args, 10); /* Count comes first, then TP num. */
716
717 while (*args && isspace ((int) *args))
718 args++;
719
720 if (*args && strncasecmp (args, "all", 3) == 0)
721 {
722 args += 3; /* Skip special argument "all". */
723 all = 1;
724 if (*args)
725 error (_("Junk at end of arguments."));
726 }
727 else
728 t1 = get_tracepoint_by_number (&args, 1, 1);
729
730 do
731 {
732 if (t1)
733 {
734 ALL_TRACEPOINTS (t2)
735 if (t1 == (struct tracepoint *) -1 || t1 == t2)
736 {
737 t2->pass_count = count;
738 observer_notify_tracepoint_modified (t2->number);
739 if (from_tty)
740 printf_filtered ("Setting tracepoint %d's passcount to %d\n",
741 t2->number, count);
742 }
743 if (! all && *args)
744 t1 = get_tracepoint_by_number (&args, 1, 0);
745 }
746 }
747 while (*args);
748 }
749
750 /* ACTIONS functions: */
751
752 /* Prototypes for action-parsing utility commands */
753 static void read_actions (struct tracepoint *);
754
755 /* The three functions:
756 collect_pseudocommand,
757 while_stepping_pseudocommand, and
758 end_actions_pseudocommand
759 are placeholders for "commands" that are actually ONLY to be used
760 within a tracepoint action list. If the actual function is ever called,
761 it means that somebody issued the "command" at the top level,
762 which is always an error. */
763
764 static void
765 end_actions_pseudocommand (char *args, int from_tty)
766 {
767 error (_("This command cannot be used at the top level."));
768 }
769
770 static void
771 while_stepping_pseudocommand (char *args, int from_tty)
772 {
773 error (_("This command can only be used in a tracepoint actions list."));
774 }
775
776 static void
777 collect_pseudocommand (char *args, int from_tty)
778 {
779 error (_("This command can only be used in a tracepoint actions list."));
780 }
781
782 /* Enter a list of actions for a tracepoint. */
783 static void
784 trace_actions_command (char *args, int from_tty)
785 {
786 struct tracepoint *t;
787 char tmpbuf[128];
788 char *end_msg = "End with a line saying just \"end\".";
789
790 t = get_tracepoint_by_number (&args, 0, 1);
791 if (t)
792 {
793 sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
794 t->number);
795
796 if (from_tty)
797 {
798 if (deprecated_readline_begin_hook)
799 (*deprecated_readline_begin_hook) ("%s %s\n", tmpbuf, end_msg);
800 else if (input_from_terminal_p ())
801 printf_filtered ("%s\n%s\n", tmpbuf, end_msg);
802 }
803
804 free_actions (t);
805 t->step_count = 0; /* read_actions may set this */
806 read_actions (t);
807
808 if (deprecated_readline_end_hook)
809 (*deprecated_readline_end_hook) ();
810 /* tracepoints_changed () */
811 }
812 /* else just return */
813 }
814
815 /* worker function */
816 static void
817 read_actions (struct tracepoint *t)
818 {
819 char *line;
820 char *prompt1 = "> ", *prompt2 = " > ";
821 char *prompt = prompt1;
822 enum actionline_type linetype;
823 extern FILE *instream;
824 struct action_line *next = NULL, *temp;
825 struct cleanup *old_chain;
826
827 /* Control-C quits instantly if typed while in this loop
828 since it should not wait until the user types a newline. */
829 immediate_quit++;
830 /* FIXME: kettenis/20010823: Something is wrong here. In this file
831 STOP_SIGNAL is never defined. So this code has been left out, at
832 least for quite a while now. Replacing STOP_SIGNAL with SIGTSTP
833 leads to compilation failures since the variable job_control
834 isn't declared. Leave this alone for now. */
835 #ifdef STOP_SIGNAL
836 if (job_control)
837 signal (STOP_SIGNAL, handle_stop_sig);
838 #endif
839 old_chain = make_cleanup_free_actions (t);
840 while (1)
841 {
842 /* Make sure that all output has been output. Some machines may
843 let you get away with leaving out some of the gdb_flush, but
844 not all. */
845 wrap_here ("");
846 gdb_flush (gdb_stdout);
847 gdb_flush (gdb_stderr);
848
849 if (deprecated_readline_hook && instream == NULL)
850 line = (*deprecated_readline_hook) (prompt);
851 else if (instream == stdin && ISATTY (instream))
852 {
853 line = gdb_readline_wrapper (prompt);
854 if (line && *line) /* add it to command history */
855 add_history (line);
856 }
857 else
858 line = gdb_readline (0);
859
860 if (!line)
861 {
862 line = xstrdup ("end");
863 printf_filtered ("end\n");
864 }
865
866 linetype = validate_actionline (&line, t);
867 if (linetype == BADLINE)
868 continue; /* already warned -- collect another line */
869
870 temp = xmalloc (sizeof (struct action_line));
871 temp->next = NULL;
872 temp->action = line;
873
874 if (next == NULL) /* first action for this tracepoint? */
875 t->actions = next = temp;
876 else
877 {
878 next->next = temp;
879 next = temp;
880 }
881
882 if (linetype == STEPPING) /* begin "while-stepping" */
883 {
884 if (prompt == prompt2)
885 {
886 warning (_("Already processing 'while-stepping'"));
887 continue;
888 }
889 else
890 prompt = prompt2; /* change prompt for stepping actions */
891 }
892 else if (linetype == END)
893 {
894 if (prompt == prompt2)
895 {
896 prompt = prompt1; /* end of single-stepping actions */
897 }
898 else
899 { /* end of actions */
900 if (t->actions->next == NULL)
901 {
902 /* An "end" all by itself with no other actions
903 means this tracepoint has no actions.
904 Discard empty list. */
905 free_actions (t);
906 }
907 break;
908 }
909 }
910 }
911 #ifdef STOP_SIGNAL
912 if (job_control)
913 signal (STOP_SIGNAL, SIG_DFL);
914 #endif
915 immediate_quit--;
916 discard_cleanups (old_chain);
917 }
918
919 /* worker function */
920 enum actionline_type
921 validate_actionline (char **line, struct tracepoint *t)
922 {
923 struct cmd_list_element *c;
924 struct expression *exp = NULL;
925 struct cleanup *old_chain = NULL;
926 char *p;
927
928 /* if EOF is typed, *line is NULL */
929 if (*line == NULL)
930 return END;
931
932 for (p = *line; isspace ((int) *p);)
933 p++;
934
935 /* Symbol lookup etc. */
936 if (*p == '\0') /* empty line: just prompt for another line. */
937 return BADLINE;
938
939 if (*p == '#') /* comment line */
940 return GENERIC;
941
942 c = lookup_cmd (&p, cmdlist, "", -1, 1);
943 if (c == 0)
944 {
945 warning (_("'%s' is not an action that I know, or is ambiguous."),
946 p);
947 return BADLINE;
948 }
949
950 if (cmd_cfunc_eq (c, collect_pseudocommand))
951 {
952 struct agent_expr *aexpr;
953 struct agent_reqs areqs;
954
955 do
956 { /* repeat over a comma-separated list */
957 QUIT; /* allow user to bail out with ^C */
958 while (isspace ((int) *p))
959 p++;
960
961 if (*p == '$') /* look for special pseudo-symbols */
962 {
963 if ((0 == strncasecmp ("reg", p + 1, 3)) ||
964 (0 == strncasecmp ("arg", p + 1, 3)) ||
965 (0 == strncasecmp ("loc", p + 1, 3)))
966 {
967 p = strchr (p, ',');
968 continue;
969 }
970 /* else fall thru, treat p as an expression and parse it! */
971 }
972 exp = parse_exp_1 (&p, block_for_pc (t->address), 1);
973 old_chain = make_cleanup (free_current_contents, &exp);
974
975 if (exp->elts[0].opcode == OP_VAR_VALUE)
976 {
977 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
978 {
979 warning (_("constant %s (value %ld) will not be collected."),
980 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
981 SYMBOL_VALUE (exp->elts[2].symbol));
982 return BADLINE;
983 }
984 else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
985 {
986 warning (_("%s is optimized away and cannot be collected."),
987 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
988 return BADLINE;
989 }
990 }
991
992 /* We have something to collect, make sure that the expr to
993 bytecode translator can handle it and that it's not too
994 long. */
995 aexpr = gen_trace_for_expr (t->address, exp);
996 make_cleanup_free_agent_expr (aexpr);
997
998 if (aexpr->len > MAX_AGENT_EXPR_LEN)
999 error (_("expression too complicated, try simplifying"));
1000
1001 ax_reqs (aexpr, &areqs);
1002 (void) make_cleanup (xfree, areqs.reg_mask);
1003
1004 if (areqs.flaw != agent_flaw_none)
1005 error (_("malformed expression"));
1006
1007 if (areqs.min_height < 0)
1008 error (_("gdb: Internal error: expression has min height < 0"));
1009
1010 if (areqs.max_height > 20)
1011 error (_("expression too complicated, try simplifying"));
1012
1013 do_cleanups (old_chain);
1014 }
1015 while (p && *p++ == ',');
1016 return GENERIC;
1017 }
1018 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
1019 {
1020 char *steparg; /* in case warning is necessary */
1021
1022 while (isspace ((int) *p))
1023 p++;
1024 steparg = p;
1025
1026 if (*p == '\0' ||
1027 (t->step_count = strtol (p, &p, 0)) == 0)
1028 {
1029 warning (_("'%s': bad step-count; command ignored."), *line);
1030 return BADLINE;
1031 }
1032 return STEPPING;
1033 }
1034 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
1035 return END;
1036 else
1037 {
1038 warning (_("'%s' is not a supported tracepoint action."), *line);
1039 return BADLINE;
1040 }
1041 }
1042
1043 /* worker function */
1044 void
1045 free_actions (struct tracepoint *t)
1046 {
1047 struct action_line *line, *next;
1048
1049 for (line = t->actions; line; line = next)
1050 {
1051 next = line->next;
1052 if (line->action)
1053 xfree (line->action);
1054 xfree (line);
1055 }
1056 t->actions = NULL;
1057 }
1058
1059 static void
1060 do_free_actions_cleanup (void *t)
1061 {
1062 free_actions (t);
1063 }
1064
1065 static struct cleanup *
1066 make_cleanup_free_actions (struct tracepoint *t)
1067 {
1068 return make_cleanup (do_free_actions_cleanup, t);
1069 }
1070
1071 enum {
1072 memrange_absolute = -1
1073 };
1074
1075 struct memrange
1076 {
1077 int type; /* memrange_absolute for absolute memory range,
1078 else basereg number */
1079 bfd_signed_vma start;
1080 bfd_signed_vma end;
1081 };
1082
1083 struct collection_list
1084 {
1085 unsigned char regs_mask[32]; /* room for up to 256 regs */
1086 long listsize;
1087 long next_memrange;
1088 struct memrange *list;
1089 long aexpr_listsize; /* size of array pointed to by expr_list elt */
1090 long next_aexpr_elt;
1091 struct agent_expr **aexpr_list;
1092
1093 }
1094 tracepoint_list, stepping_list;
1095
1096 /* MEMRANGE functions: */
1097
1098 static int memrange_cmp (const void *, const void *);
1099
1100 /* compare memranges for qsort */
1101 static int
1102 memrange_cmp (const void *va, const void *vb)
1103 {
1104 const struct memrange *a = va, *b = vb;
1105
1106 if (a->type < b->type)
1107 return -1;
1108 if (a->type > b->type)
1109 return 1;
1110 if (a->type == memrange_absolute)
1111 {
1112 if ((bfd_vma) a->start < (bfd_vma) b->start)
1113 return -1;
1114 if ((bfd_vma) a->start > (bfd_vma) b->start)
1115 return 1;
1116 }
1117 else
1118 {
1119 if (a->start < b->start)
1120 return -1;
1121 if (a->start > b->start)
1122 return 1;
1123 }
1124 return 0;
1125 }
1126
1127 /* Sort the memrange list using qsort, and merge adjacent memranges. */
1128 static void
1129 memrange_sortmerge (struct collection_list *memranges)
1130 {
1131 int a, b;
1132
1133 qsort (memranges->list, memranges->next_memrange,
1134 sizeof (struct memrange), memrange_cmp);
1135 if (memranges->next_memrange > 0)
1136 {
1137 for (a = 0, b = 1; b < memranges->next_memrange; b++)
1138 {
1139 if (memranges->list[a].type == memranges->list[b].type &&
1140 memranges->list[b].start - memranges->list[a].end <=
1141 MAX_REGISTER_SIZE)
1142 {
1143 /* memrange b starts before memrange a ends; merge them. */
1144 if (memranges->list[b].end > memranges->list[a].end)
1145 memranges->list[a].end = memranges->list[b].end;
1146 continue; /* next b, same a */
1147 }
1148 a++; /* next a */
1149 if (a != b)
1150 memcpy (&memranges->list[a], &memranges->list[b],
1151 sizeof (struct memrange));
1152 }
1153 memranges->next_memrange = a + 1;
1154 }
1155 }
1156
1157 /* Add a register to a collection list. */
1158 static void
1159 add_register (struct collection_list *collection, unsigned int regno)
1160 {
1161 if (info_verbose)
1162 printf_filtered ("collect register %d\n", regno);
1163 if (regno >= (8 * sizeof (collection->regs_mask)))
1164 error (_("Internal: register number %d too large for tracepoint"),
1165 regno);
1166 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
1167 }
1168
1169 /* Add a memrange to a collection list */
1170 static void
1171 add_memrange (struct collection_list *memranges,
1172 int type, bfd_signed_vma base,
1173 unsigned long len)
1174 {
1175 if (info_verbose)
1176 {
1177 printf_filtered ("(%d,", type);
1178 printf_vma (base);
1179 printf_filtered (",%ld)\n", len);
1180 }
1181
1182 /* type: memrange_absolute == memory, other n == basereg */
1183 memranges->list[memranges->next_memrange].type = type;
1184 /* base: addr if memory, offset if reg relative. */
1185 memranges->list[memranges->next_memrange].start = base;
1186 /* len: we actually save end (base + len) for convenience */
1187 memranges->list[memranges->next_memrange].end = base + len;
1188 memranges->next_memrange++;
1189 if (memranges->next_memrange >= memranges->listsize)
1190 {
1191 memranges->listsize *= 2;
1192 memranges->list = xrealloc (memranges->list,
1193 memranges->listsize);
1194 }
1195
1196 if (type != memrange_absolute) /* Better collect the base register! */
1197 add_register (memranges, type);
1198 }
1199
1200 /* Add a symbol to a collection list. */
1201 static void
1202 collect_symbol (struct collection_list *collect,
1203 struct symbol *sym,
1204 long frame_regno, long frame_offset)
1205 {
1206 unsigned long len;
1207 unsigned int reg;
1208 bfd_signed_vma offset;
1209
1210 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
1211 switch (SYMBOL_CLASS (sym))
1212 {
1213 default:
1214 printf_filtered ("%s: don't know symbol class %d\n",
1215 SYMBOL_PRINT_NAME (sym),
1216 SYMBOL_CLASS (sym));
1217 break;
1218 case LOC_CONST:
1219 printf_filtered ("constant %s (value %ld) will not be collected.\n",
1220 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
1221 break;
1222 case LOC_STATIC:
1223 offset = SYMBOL_VALUE_ADDRESS (sym);
1224 if (info_verbose)
1225 {
1226 char tmp[40];
1227
1228 sprintf_vma (tmp, offset);
1229 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
1230 SYMBOL_PRINT_NAME (sym), len,
1231 tmp /* address */);
1232 }
1233 add_memrange (collect, memrange_absolute, offset, len);
1234 break;
1235 case LOC_REGISTER:
1236 reg = SYMBOL_VALUE (sym);
1237 if (info_verbose)
1238 printf_filtered ("LOC_REG[parm] %s: ",
1239 SYMBOL_PRINT_NAME (sym));
1240 add_register (collect, reg);
1241 /* Check for doubles stored in two registers. */
1242 /* FIXME: how about larger types stored in 3 or more regs? */
1243 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
1244 len > register_size (current_gdbarch, reg))
1245 add_register (collect, reg + 1);
1246 break;
1247 case LOC_REF_ARG:
1248 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
1249 printf_filtered (" (will not collect %s)\n",
1250 SYMBOL_PRINT_NAME (sym));
1251 break;
1252 case LOC_ARG:
1253 reg = frame_regno;
1254 offset = frame_offset + SYMBOL_VALUE (sym);
1255 if (info_verbose)
1256 {
1257 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1258 SYMBOL_PRINT_NAME (sym), len);
1259 printf_vma (offset);
1260 printf_filtered (" from frame ptr reg %d\n", reg);
1261 }
1262 add_memrange (collect, reg, offset, len);
1263 break;
1264 case LOC_REGPARM_ADDR:
1265 reg = SYMBOL_VALUE (sym);
1266 offset = 0;
1267 if (info_verbose)
1268 {
1269 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
1270 SYMBOL_PRINT_NAME (sym), len);
1271 printf_vma (offset);
1272 printf_filtered (" from reg %d\n", reg);
1273 }
1274 add_memrange (collect, reg, offset, len);
1275 break;
1276 case LOC_LOCAL:
1277 reg = frame_regno;
1278 offset = frame_offset + SYMBOL_VALUE (sym);
1279 if (info_verbose)
1280 {
1281 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
1282 SYMBOL_PRINT_NAME (sym), len);
1283 printf_vma (offset);
1284 printf_filtered (" from frame ptr reg %d\n", reg);
1285 }
1286 add_memrange (collect, reg, offset, len);
1287 break;
1288 case LOC_UNRESOLVED:
1289 printf_filtered ("Don't know LOC_UNRESOLVED %s\n",
1290 SYMBOL_PRINT_NAME (sym));
1291 break;
1292 case LOC_OPTIMIZED_OUT:
1293 printf_filtered ("%s has been optimized out of existence.\n",
1294 SYMBOL_PRINT_NAME (sym));
1295 break;
1296 }
1297 }
1298
1299 /* Add all locals (or args) symbols to collection list */
1300 static void
1301 add_local_symbols (struct collection_list *collect, CORE_ADDR pc,
1302 long frame_regno, long frame_offset, int type)
1303 {
1304 struct symbol *sym;
1305 struct block *block;
1306 struct dict_iterator iter;
1307 int count = 0;
1308
1309 block = block_for_pc (pc);
1310 while (block != 0)
1311 {
1312 QUIT; /* allow user to bail out with ^C */
1313 ALL_BLOCK_SYMBOLS (block, iter, sym)
1314 {
1315 if (SYMBOL_IS_ARGUMENT (sym)
1316 ? type == 'A' /* collecting Arguments */
1317 : type == 'L') /* collecting Locals */
1318 {
1319 count++;
1320 collect_symbol (collect, sym, frame_regno,
1321 frame_offset);
1322 }
1323 }
1324 if (BLOCK_FUNCTION (block))
1325 break;
1326 else
1327 block = BLOCK_SUPERBLOCK (block);
1328 }
1329 if (count == 0)
1330 warning (_("No %s found in scope."),
1331 type == 'L' ? "locals" : "args");
1332 }
1333
1334 /* worker function */
1335 static void
1336 clear_collection_list (struct collection_list *list)
1337 {
1338 int ndx;
1339
1340 list->next_memrange = 0;
1341 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1342 {
1343 free_agent_expr (list->aexpr_list[ndx]);
1344 list->aexpr_list[ndx] = NULL;
1345 }
1346 list->next_aexpr_elt = 0;
1347 memset (list->regs_mask, 0, sizeof (list->regs_mask));
1348 }
1349
1350 /* reduce a collection list to string form (for gdb protocol) */
1351 static char **
1352 stringify_collection_list (struct collection_list *list, char *string)
1353 {
1354 char temp_buf[2048];
1355 char tmp2[40];
1356 int count;
1357 int ndx = 0;
1358 char *(*str_list)[];
1359 char *end;
1360 long i;
1361
1362 count = 1 + list->next_memrange + list->next_aexpr_elt + 1;
1363 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
1364
1365 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
1366 if (list->regs_mask[i] != 0) /* skip leading zeroes in regs_mask */
1367 break;
1368 if (list->regs_mask[i] != 0) /* prepare to send regs_mask to the stub */
1369 {
1370 if (info_verbose)
1371 printf_filtered ("\nCollecting registers (mask): 0x");
1372 end = temp_buf;
1373 *end++ = 'R';
1374 for (; i >= 0; i--)
1375 {
1376 QUIT; /* allow user to bail out with ^C */
1377 if (info_verbose)
1378 printf_filtered ("%02X", list->regs_mask[i]);
1379 sprintf (end, "%02X", list->regs_mask[i]);
1380 end += 2;
1381 }
1382 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1383 ndx++;
1384 }
1385 if (info_verbose)
1386 printf_filtered ("\n");
1387 if (list->next_memrange > 0 && info_verbose)
1388 printf_filtered ("Collecting memranges: \n");
1389 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1390 {
1391 QUIT; /* allow user to bail out with ^C */
1392 sprintf_vma (tmp2, list->list[i].start);
1393 if (info_verbose)
1394 {
1395 printf_filtered ("(%d, %s, %ld)\n",
1396 list->list[i].type,
1397 tmp2,
1398 (long) (list->list[i].end - list->list[i].start));
1399 }
1400 if (count + 27 > MAX_AGENT_EXPR_LEN)
1401 {
1402 (*str_list)[ndx] = savestring (temp_buf, count);
1403 ndx++;
1404 count = 0;
1405 end = temp_buf;
1406 }
1407
1408 {
1409 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1410
1411 /* The "%X" conversion specifier expects an unsigned argument,
1412 so passing -1 (memrange_absolute) to it directly gives you
1413 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1414 Special-case it. */
1415 if (list->list[i].type == memrange_absolute)
1416 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1417 else
1418 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1419 }
1420
1421 count += strlen (end);
1422 end = temp_buf + count;
1423 }
1424
1425 for (i = 0; i < list->next_aexpr_elt; i++)
1426 {
1427 QUIT; /* allow user to bail out with ^C */
1428 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1429 {
1430 (*str_list)[ndx] = savestring (temp_buf, count);
1431 ndx++;
1432 count = 0;
1433 end = temp_buf;
1434 }
1435 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1436 end += 10; /* 'X' + 8 hex digits + ',' */
1437 count += 10;
1438
1439 end = mem2hex (list->aexpr_list[i]->buf,
1440 end, list->aexpr_list[i]->len);
1441 count += 2 * list->aexpr_list[i]->len;
1442 }
1443
1444 if (count != 0)
1445 {
1446 (*str_list)[ndx] = savestring (temp_buf, count);
1447 ndx++;
1448 count = 0;
1449 end = temp_buf;
1450 }
1451 (*str_list)[ndx] = NULL;
1452
1453 if (ndx == 0)
1454 {
1455 xfree (str_list);
1456 return NULL;
1457 }
1458 else
1459 return *str_list;
1460 }
1461
1462 static void
1463 free_actions_list_cleanup_wrapper (void *al)
1464 {
1465 free_actions_list (al);
1466 }
1467
1468 static void
1469 free_actions_list (char **actions_list)
1470 {
1471 int ndx;
1472
1473 if (actions_list == 0)
1474 return;
1475
1476 for (ndx = 0; actions_list[ndx]; ndx++)
1477 xfree (actions_list[ndx]);
1478
1479 xfree (actions_list);
1480 }
1481
1482 /* Render all actions into gdb protocol. */
1483 static void
1484 encode_actions (struct tracepoint *t, char ***tdp_actions,
1485 char ***stepping_actions)
1486 {
1487 static char tdp_buff[2048], step_buff[2048];
1488 char *action_exp;
1489 struct expression *exp = NULL;
1490 struct action_line *action;
1491 int i;
1492 struct value *tempval;
1493 struct collection_list *collect;
1494 struct cmd_list_element *cmd;
1495 struct agent_expr *aexpr;
1496 int frame_reg;
1497 LONGEST frame_offset;
1498
1499
1500 clear_collection_list (&tracepoint_list);
1501 clear_collection_list (&stepping_list);
1502 collect = &tracepoint_list;
1503
1504 *tdp_actions = NULL;
1505 *stepping_actions = NULL;
1506
1507 gdbarch_virtual_frame_pointer (current_gdbarch,
1508 t->address, &frame_reg, &frame_offset);
1509
1510 for (action = t->actions; action; action = action->next)
1511 {
1512 QUIT; /* allow user to bail out with ^C */
1513 action_exp = action->action;
1514 while (isspace ((int) *action_exp))
1515 action_exp++;
1516
1517 if (*action_exp == '#') /* comment line */
1518 return;
1519
1520 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1521 if (cmd == 0)
1522 error (_("Bad action list item: %s"), action_exp);
1523
1524 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
1525 {
1526 do
1527 { /* repeat over a comma-separated list */
1528 QUIT; /* allow user to bail out with ^C */
1529 while (isspace ((int) *action_exp))
1530 action_exp++;
1531
1532 if (0 == strncasecmp ("$reg", action_exp, 4))
1533 {
1534 for (i = 0; i < gdbarch_num_regs (current_gdbarch); i++)
1535 add_register (collect, i);
1536 action_exp = strchr (action_exp, ','); /* more? */
1537 }
1538 else if (0 == strncasecmp ("$arg", action_exp, 4))
1539 {
1540 add_local_symbols (collect,
1541 t->address,
1542 frame_reg,
1543 frame_offset,
1544 'A');
1545 action_exp = strchr (action_exp, ','); /* more? */
1546 }
1547 else if (0 == strncasecmp ("$loc", action_exp, 4))
1548 {
1549 add_local_symbols (collect,
1550 t->address,
1551 frame_reg,
1552 frame_offset,
1553 'L');
1554 action_exp = strchr (action_exp, ','); /* more? */
1555 }
1556 else
1557 {
1558 unsigned long addr, len;
1559 struct cleanup *old_chain = NULL;
1560 struct cleanup *old_chain1 = NULL;
1561 struct agent_reqs areqs;
1562
1563 exp = parse_exp_1 (&action_exp,
1564 block_for_pc (t->address), 1);
1565 old_chain = make_cleanup (free_current_contents, &exp);
1566
1567 switch (exp->elts[0].opcode)
1568 {
1569 case OP_REGISTER:
1570 {
1571 const char *name = &exp->elts[2].string;
1572
1573 i = user_reg_map_name_to_regnum (current_gdbarch,
1574 name, strlen (name));
1575 if (i == -1)
1576 internal_error (__FILE__, __LINE__,
1577 _("Register $%s not available"),
1578 name);
1579 if (info_verbose)
1580 printf_filtered ("OP_REGISTER: ");
1581 add_register (collect, i);
1582 break;
1583 }
1584
1585 case UNOP_MEMVAL:
1586 /* safe because we know it's a simple expression */
1587 tempval = evaluate_expression (exp);
1588 addr = VALUE_ADDRESS (tempval) + value_offset (tempval);
1589 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
1590 add_memrange (collect, memrange_absolute, addr, len);
1591 break;
1592
1593 case OP_VAR_VALUE:
1594 collect_symbol (collect,
1595 exp->elts[2].symbol,
1596 frame_reg,
1597 frame_offset);
1598 break;
1599
1600 default: /* full-fledged expression */
1601 aexpr = gen_trace_for_expr (t->address, exp);
1602
1603 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1604
1605 ax_reqs (aexpr, &areqs);
1606 if (areqs.flaw != agent_flaw_none)
1607 error (_("malformed expression"));
1608
1609 if (areqs.min_height < 0)
1610 error (_("gdb: Internal error: expression has min height < 0"));
1611 if (areqs.max_height > 20)
1612 error (_("expression too complicated, try simplifying"));
1613
1614 discard_cleanups (old_chain1);
1615 add_aexpr (collect, aexpr);
1616
1617 /* take care of the registers */
1618 if (areqs.reg_mask_len > 0)
1619 {
1620 int ndx1;
1621 int ndx2;
1622
1623 for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
1624 {
1625 QUIT; /* allow user to bail out with ^C */
1626 if (areqs.reg_mask[ndx1] != 0)
1627 {
1628 /* assume chars have 8 bits */
1629 for (ndx2 = 0; ndx2 < 8; ndx2++)
1630 if (areqs.reg_mask[ndx1] & (1 << ndx2))
1631 /* it's used -- record it */
1632 add_register (collect,
1633 ndx1 * 8 + ndx2);
1634 }
1635 }
1636 }
1637 break;
1638 } /* switch */
1639 do_cleanups (old_chain);
1640 } /* do */
1641 }
1642 while (action_exp && *action_exp++ == ',');
1643 } /* if */
1644 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
1645 {
1646 collect = &stepping_list;
1647 }
1648 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
1649 {
1650 if (collect == &stepping_list) /* end stepping actions */
1651 collect = &tracepoint_list;
1652 else
1653 break; /* end tracepoint actions */
1654 }
1655 } /* for */
1656 memrange_sortmerge (&tracepoint_list);
1657 memrange_sortmerge (&stepping_list);
1658
1659 *tdp_actions = stringify_collection_list (&tracepoint_list,
1660 tdp_buff);
1661 *stepping_actions = stringify_collection_list (&stepping_list,
1662 step_buff);
1663 }
1664
1665 static void
1666 add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
1667 {
1668 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1669 {
1670 collect->aexpr_list =
1671 xrealloc (collect->aexpr_list,
1672 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
1673 collect->aexpr_listsize *= 2;
1674 }
1675 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1676 collect->next_aexpr_elt++;
1677 }
1678
1679 static char *target_buf;
1680 static long target_buf_size;
1681
1682 /* Set "transparent" memory ranges
1683
1684 Allow trace mechanism to treat text-like sections
1685 (and perhaps all read-only sections) transparently,
1686 i.e. don't reject memory requests from these address ranges
1687 just because they haven't been collected. */
1688
1689 static void
1690 remote_set_transparent_ranges (void)
1691 {
1692 extern bfd *exec_bfd;
1693 asection *s;
1694 bfd_size_type size;
1695 bfd_vma lma;
1696 int anysecs = 0;
1697
1698 if (!exec_bfd)
1699 return; /* No information to give. */
1700
1701 strcpy (target_buf, "QTro");
1702 for (s = exec_bfd->sections; s; s = s->next)
1703 {
1704 char tmp1[40], tmp2[40];
1705
1706 if ((s->flags & SEC_LOAD) == 0 ||
1707 /* (s->flags & SEC_CODE) == 0 || */
1708 (s->flags & SEC_READONLY) == 0)
1709 continue;
1710
1711 anysecs = 1;
1712 lma = s->lma;
1713 size = bfd_get_section_size (s);
1714 sprintf_vma (tmp1, lma);
1715 sprintf_vma (tmp2, lma + size);
1716 sprintf (target_buf + strlen (target_buf),
1717 ":%s,%s", tmp1, tmp2);
1718 }
1719 if (anysecs)
1720 {
1721 putpkt (target_buf);
1722 getpkt (&target_buf, &target_buf_size, 0);
1723 }
1724 }
1725
1726 /* tstart command:
1727
1728 Tell target to clear any previous trace experiment.
1729 Walk the list of tracepoints, and send them (and their actions)
1730 to the target. If no errors,
1731 Tell target to start a new trace experiment. */
1732
1733 static void
1734 trace_start_command (char *args, int from_tty)
1735 {
1736 struct tracepoint *t;
1737 char buf[2048];
1738 char **tdp_actions;
1739 char **stepping_actions;
1740 int ndx;
1741 struct cleanup *old_chain = NULL;
1742
1743 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1744
1745 if (target_is_remote ())
1746 {
1747 putpkt ("QTinit");
1748 remote_get_noisy_reply (&target_buf, &target_buf_size);
1749 if (strcmp (target_buf, "OK"))
1750 error (_("Target does not support this command."));
1751
1752 ALL_TRACEPOINTS (t)
1753 {
1754 char tmp[40];
1755
1756 sprintf_vma (tmp, t->address);
1757 sprintf (buf, "QTDP:%x:%s:%c:%lx:%x", t->number,
1758 tmp, /* address */
1759 t->enabled_p ? 'E' : 'D',
1760 t->step_count, t->pass_count);
1761
1762 if (t->actions)
1763 strcat (buf, "-");
1764 putpkt (buf);
1765 remote_get_noisy_reply (&target_buf, &target_buf_size);
1766 if (strcmp (target_buf, "OK"))
1767 error (_("Target does not support tracepoints."));
1768
1769 if (t->actions)
1770 {
1771 encode_actions (t, &tdp_actions, &stepping_actions);
1772 old_chain = make_cleanup (free_actions_list_cleanup_wrapper,
1773 tdp_actions);
1774 (void) make_cleanup (free_actions_list_cleanup_wrapper,
1775 stepping_actions);
1776
1777 /* do_single_steps (t); */
1778 if (tdp_actions)
1779 {
1780 for (ndx = 0; tdp_actions[ndx]; ndx++)
1781 {
1782 QUIT; /* allow user to bail out with ^C */
1783 sprintf (buf, "QTDP:-%x:%s:%s%c",
1784 t->number, tmp, /* address */
1785 tdp_actions[ndx],
1786 ((tdp_actions[ndx + 1] || stepping_actions)
1787 ? '-' : 0));
1788 putpkt (buf);
1789 remote_get_noisy_reply (&target_buf,
1790 &target_buf_size);
1791 if (strcmp (target_buf, "OK"))
1792 error (_("Error on target while setting tracepoints."));
1793 }
1794 }
1795 if (stepping_actions)
1796 {
1797 for (ndx = 0; stepping_actions[ndx]; ndx++)
1798 {
1799 QUIT; /* allow user to bail out with ^C */
1800 sprintf (buf, "QTDP:-%x:%s:%s%s%s",
1801 t->number, tmp, /* address */
1802 ((ndx == 0) ? "S" : ""),
1803 stepping_actions[ndx],
1804 (stepping_actions[ndx + 1] ? "-" : ""));
1805 putpkt (buf);
1806 remote_get_noisy_reply (&target_buf,
1807 &target_buf_size);
1808 if (strcmp (target_buf, "OK"))
1809 error (_("Error on target while setting tracepoints."));
1810 }
1811 }
1812
1813 do_cleanups (old_chain);
1814 }
1815 }
1816 /* Tell target to treat text-like sections as transparent. */
1817 remote_set_transparent_ranges ();
1818 /* Now insert traps and begin collecting data. */
1819 putpkt ("QTStart");
1820 remote_get_noisy_reply (&target_buf, &target_buf_size);
1821 if (strcmp (target_buf, "OK"))
1822 error (_("Bogus reply from target: %s"), target_buf);
1823 set_traceframe_num (-1); /* All old traceframes invalidated. */
1824 set_tracepoint_num (-1);
1825 set_traceframe_context (-1);
1826 trace_running_p = 1;
1827 if (deprecated_trace_start_stop_hook)
1828 deprecated_trace_start_stop_hook (1, from_tty);
1829
1830 }
1831 else
1832 error (_("Trace can only be run on remote targets."));
1833 }
1834
1835 /* tstop command */
1836 static void
1837 trace_stop_command (char *args, int from_tty)
1838 {
1839 if (target_is_remote ())
1840 {
1841 putpkt ("QTStop");
1842 remote_get_noisy_reply (&target_buf, &target_buf_size);
1843 if (strcmp (target_buf, "OK"))
1844 error (_("Bogus reply from target: %s"), target_buf);
1845 trace_running_p = 0;
1846 if (deprecated_trace_start_stop_hook)
1847 deprecated_trace_start_stop_hook (0, from_tty);
1848 }
1849 else
1850 error (_("Trace can only be run on remote targets."));
1851 }
1852
1853 unsigned long trace_running_p;
1854
1855 /* tstatus command */
1856 static void
1857 trace_status_command (char *args, int from_tty)
1858 {
1859 if (target_is_remote ())
1860 {
1861 putpkt ("qTStatus");
1862 remote_get_noisy_reply (&target_buf, &target_buf_size);
1863
1864 if (target_buf[0] != 'T' ||
1865 (target_buf[1] != '0' && target_buf[1] != '1'))
1866 error (_("Bogus reply from target: %s"), target_buf);
1867
1868 /* exported for use by the GUI */
1869 trace_running_p = (target_buf[1] == '1');
1870 }
1871 else
1872 error (_("Trace can only be run on remote targets."));
1873 }
1874
1875 /* Worker function for the various flavors of the tfind command. */
1876 static void
1877 finish_tfind_command (char **msg,
1878 long *sizeof_msg,
1879 int from_tty)
1880 {
1881 int target_frameno = -1, target_tracept = -1;
1882 CORE_ADDR old_frame_addr;
1883 struct symbol *old_func;
1884 char *reply;
1885
1886 old_frame_addr = get_frame_base (get_current_frame ());
1887 old_func = find_pc_function (read_pc ());
1888
1889 putpkt (*msg);
1890 reply = remote_get_noisy_reply (msg, sizeof_msg);
1891
1892 while (reply && *reply)
1893 switch (*reply)
1894 {
1895 case 'F':
1896 if ((target_frameno = (int) strtol (++reply, &reply, 16)) == -1)
1897 {
1898 /* A request for a non-existant trace frame has failed.
1899 Our response will be different, depending on FROM_TTY:
1900
1901 If FROM_TTY is true, meaning that this command was
1902 typed interactively by the user, then give an error
1903 and DO NOT change the state of traceframe_number etc.
1904
1905 However if FROM_TTY is false, meaning that we're either
1906 in a script, a loop, or a user-defined command, then
1907 DON'T give an error, but DO change the state of
1908 traceframe_number etc. to invalid.
1909
1910 The rationalle is that if you typed the command, you
1911 might just have committed a typo or something, and you'd
1912 like to NOT lose your current debugging state. However
1913 if you're in a user-defined command or especially in a
1914 loop, then you need a way to detect that the command
1915 failed WITHOUT aborting. This allows you to write
1916 scripts that search thru the trace buffer until the end,
1917 and then continue on to do something else. */
1918
1919 if (from_tty)
1920 error (_("Target failed to find requested trace frame."));
1921 else
1922 {
1923 if (info_verbose)
1924 printf_filtered ("End of trace buffer.\n");
1925 /* The following will not recurse, since it's
1926 special-cased. */
1927 trace_find_command ("-1", from_tty);
1928 reply = NULL; /* Break out of loop
1929 (avoid recursive nonsense). */
1930 }
1931 }
1932 break;
1933 case 'T':
1934 if ((target_tracept = (int) strtol (++reply, &reply, 16)) == -1)
1935 error (_("Target failed to find requested trace frame."));
1936 break;
1937 case 'O': /* "OK"? */
1938 if (reply[1] == 'K' && reply[2] == '\0')
1939 reply += 2;
1940 else
1941 error (_("Bogus reply from target: %s"), reply);
1942 break;
1943 default:
1944 error (_("Bogus reply from target: %s"), reply);
1945 }
1946
1947 reinit_frame_cache ();
1948 registers_changed ();
1949 set_traceframe_num (target_frameno);
1950 set_tracepoint_num (target_tracept);
1951 if (target_frameno == -1)
1952 set_traceframe_context (-1);
1953 else
1954 set_traceframe_context (read_pc ());
1955
1956 if (from_tty)
1957 {
1958 enum print_what print_what;
1959
1960 /* NOTE: in immitation of the step command, try to determine
1961 whether we have made a transition from one function to
1962 another. If so, we'll print the "stack frame" (ie. the new
1963 function and it's arguments) -- otherwise we'll just show the
1964 new source line.
1965
1966 This determination is made by checking (1) whether the
1967 current function has changed, and (2) whether the current FP
1968 has changed. Hack: if the FP wasn't collected, either at the
1969 current or the previous frame, assume that the FP has NOT
1970 changed. */
1971
1972 if (old_func == find_pc_function (read_pc ()) &&
1973 (old_frame_addr == 0 ||
1974 get_frame_base (get_current_frame ()) == 0 ||
1975 old_frame_addr == get_frame_base (get_current_frame ())))
1976 print_what = SRC_LINE;
1977 else
1978 print_what = SRC_AND_LOC;
1979
1980 print_stack_frame (get_selected_frame (NULL), 1, print_what);
1981 do_displays ();
1982 }
1983 }
1984
1985 /* trace_find_command takes a trace frame number n,
1986 sends "QTFrame:<n>" to the target,
1987 and accepts a reply that may contain several optional pieces
1988 of information: a frame number, a tracepoint number, and an
1989 indication of whether this is a trap frame or a stepping frame.
1990
1991 The minimal response is just "OK" (which indicates that the
1992 target does not give us a frame number or a tracepoint number).
1993 Instead of that, the target may send us a string containing
1994 any combination of:
1995 F<hexnum> (gives the selected frame number)
1996 T<hexnum> (gives the selected tracepoint number)
1997 */
1998
1999 /* tfind command */
2000 static void
2001 trace_find_command (char *args, int from_tty)
2002 { /* this should only be called with a numeric argument */
2003 int frameno = -1;
2004
2005 if (target_is_remote ())
2006 {
2007 if (deprecated_trace_find_hook)
2008 deprecated_trace_find_hook (args, from_tty);
2009
2010 if (args == 0 || *args == 0)
2011 { /* TFIND with no args means find NEXT trace frame. */
2012 if (traceframe_number == -1)
2013 frameno = 0; /* "next" is first one */
2014 else
2015 frameno = traceframe_number + 1;
2016 }
2017 else if (0 == strcmp (args, "-"))
2018 {
2019 if (traceframe_number == -1)
2020 error (_("not debugging trace buffer"));
2021 else if (from_tty && traceframe_number == 0)
2022 error (_("already at start of trace buffer"));
2023
2024 frameno = traceframe_number - 1;
2025 }
2026 else
2027 frameno = parse_and_eval_long (args);
2028
2029 if (frameno < -1)
2030 error (_("invalid input (%d is less than zero)"), frameno);
2031
2032 sprintf (target_buf, "QTFrame:%x", frameno);
2033 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
2034 }
2035 else
2036 error (_("Trace can only be run on remote targets."));
2037 }
2038
2039 /* tfind end */
2040 static void
2041 trace_find_end_command (char *args, int from_tty)
2042 {
2043 trace_find_command ("-1", from_tty);
2044 }
2045
2046 /* tfind none */
2047 static void
2048 trace_find_none_command (char *args, int from_tty)
2049 {
2050 trace_find_command ("-1", from_tty);
2051 }
2052
2053 /* tfind start */
2054 static void
2055 trace_find_start_command (char *args, int from_tty)
2056 {
2057 trace_find_command ("0", from_tty);
2058 }
2059
2060 /* tfind pc command */
2061 static void
2062 trace_find_pc_command (char *args, int from_tty)
2063 {
2064 CORE_ADDR pc;
2065 char tmp[40];
2066
2067 if (target_is_remote ())
2068 {
2069 if (args == 0 || *args == 0)
2070 pc = read_pc (); /* default is current pc */
2071 else
2072 pc = parse_and_eval_address (args);
2073
2074 sprintf_vma (tmp, pc);
2075 sprintf (target_buf, "QTFrame:pc:%s", tmp);
2076 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
2077 }
2078 else
2079 error (_("Trace can only be run on remote targets."));
2080 }
2081
2082 /* tfind tracepoint command */
2083 static void
2084 trace_find_tracepoint_command (char *args, int from_tty)
2085 {
2086 int tdp;
2087
2088 if (target_is_remote ())
2089 {
2090 if (args == 0 || *args == 0)
2091 {
2092 if (tracepoint_number == -1)
2093 error (_("No current tracepoint -- please supply an argument."));
2094 else
2095 tdp = tracepoint_number; /* default is current TDP */
2096 }
2097 else
2098 tdp = parse_and_eval_long (args);
2099
2100 sprintf (target_buf, "QTFrame:tdp:%x", tdp);
2101 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
2102 }
2103 else
2104 error (_("Trace can only be run on remote targets."));
2105 }
2106
2107 /* TFIND LINE command:
2108
2109 This command will take a sourceline for argument, just like BREAK
2110 or TRACE (ie. anything that "decode_line_1" can handle).
2111
2112 With no argument, this command will find the next trace frame
2113 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2114
2115 static void
2116 trace_find_line_command (char *args, int from_tty)
2117 {
2118 static CORE_ADDR start_pc, end_pc;
2119 struct symtabs_and_lines sals;
2120 struct symtab_and_line sal;
2121 struct cleanup *old_chain;
2122 char startpc_str[40], endpc_str[40];
2123
2124 if (target_is_remote ())
2125 {
2126 if (args == 0 || *args == 0)
2127 {
2128 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2129 sals.nelts = 1;
2130 sals.sals = (struct symtab_and_line *)
2131 xmalloc (sizeof (struct symtab_and_line));
2132 sals.sals[0] = sal;
2133 }
2134 else
2135 {
2136 sals = decode_line_spec (args, 1);
2137 sal = sals.sals[0];
2138 }
2139
2140 old_chain = make_cleanup (xfree, sals.sals);
2141 if (sal.symtab == 0)
2142 {
2143 printf_filtered ("TFIND: No line number information available");
2144 if (sal.pc != 0)
2145 {
2146 /* This is useful for "info line *0x7f34". If we can't
2147 tell the user about a source line, at least let them
2148 have the symbolic address. */
2149 printf_filtered (" for address ");
2150 wrap_here (" ");
2151 print_address (sal.pc, gdb_stdout);
2152 printf_filtered (";\n -- will attempt to find by PC. \n");
2153 }
2154 else
2155 {
2156 printf_filtered (".\n");
2157 return; /* No line, no PC; what can we do? */
2158 }
2159 }
2160 else if (sal.line > 0
2161 && find_line_pc_range (sal, &start_pc, &end_pc))
2162 {
2163 if (start_pc == end_pc)
2164 {
2165 printf_filtered ("Line %d of \"%s\"",
2166 sal.line, sal.symtab->filename);
2167 wrap_here (" ");
2168 printf_filtered (" is at address ");
2169 print_address (start_pc, gdb_stdout);
2170 wrap_here (" ");
2171 printf_filtered (" but contains no code.\n");
2172 sal = find_pc_line (start_pc, 0);
2173 if (sal.line > 0 &&
2174 find_line_pc_range (sal, &start_pc, &end_pc) &&
2175 start_pc != end_pc)
2176 printf_filtered ("Attempting to find line %d instead.\n",
2177 sal.line);
2178 else
2179 error (_("Cannot find a good line."));
2180 }
2181 }
2182 else
2183 /* Is there any case in which we get here, and have an address
2184 which the user would want to see? If we have debugging
2185 symbols and no line numbers? */
2186 error (_("Line number %d is out of range for \"%s\"."),
2187 sal.line, sal.symtab->filename);
2188
2189 sprintf_vma (startpc_str, start_pc);
2190 sprintf_vma (endpc_str, end_pc - 1);
2191 /* Find within range of stated line. */
2192 if (args && *args)
2193 sprintf (target_buf, "QTFrame:range:%s:%s",
2194 startpc_str, endpc_str);
2195 /* Find OUTSIDE OF range of CURRENT line. */
2196 else
2197 sprintf (target_buf, "QTFrame:outside:%s:%s",
2198 startpc_str, endpc_str);
2199 finish_tfind_command (&target_buf, &target_buf_size,
2200 from_tty);
2201 do_cleanups (old_chain);
2202 }
2203 else
2204 error (_("Trace can only be run on remote targets."));
2205 }
2206
2207 /* tfind range command */
2208 static void
2209 trace_find_range_command (char *args, int from_tty)
2210 {
2211 static CORE_ADDR start, stop;
2212 char start_str[40], stop_str[40];
2213 char *tmp;
2214
2215 if (target_is_remote ())
2216 {
2217 if (args == 0 || *args == 0)
2218 { /* XXX FIXME: what should default behavior be? */
2219 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2220 return;
2221 }
2222
2223 if (0 != (tmp = strchr (args, ',')))
2224 {
2225 *tmp++ = '\0'; /* terminate start address */
2226 while (isspace ((int) *tmp))
2227 tmp++;
2228 start = parse_and_eval_address (args);
2229 stop = parse_and_eval_address (tmp);
2230 }
2231 else
2232 { /* no explicit end address? */
2233 start = parse_and_eval_address (args);
2234 stop = start + 1; /* ??? */
2235 }
2236
2237 sprintf_vma (start_str, start);
2238 sprintf_vma (stop_str, stop);
2239 sprintf (target_buf, "QTFrame:range:%s:%s", start_str, stop_str);
2240 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
2241 }
2242 else
2243 error (_("Trace can only be run on remote targets."));
2244 }
2245
2246 /* tfind outside command */
2247 static void
2248 trace_find_outside_command (char *args, int from_tty)
2249 {
2250 CORE_ADDR start, stop;
2251 char start_str[40], stop_str[40];
2252 char *tmp;
2253
2254 if (target_is_remote ())
2255 {
2256 if (args == 0 || *args == 0)
2257 { /* XXX FIXME: what should default behavior be? */
2258 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2259 return;
2260 }
2261
2262 if (0 != (tmp = strchr (args, ',')))
2263 {
2264 *tmp++ = '\0'; /* terminate start address */
2265 while (isspace ((int) *tmp))
2266 tmp++;
2267 start = parse_and_eval_address (args);
2268 stop = parse_and_eval_address (tmp);
2269 }
2270 else
2271 { /* no explicit end address? */
2272 start = parse_and_eval_address (args);
2273 stop = start + 1; /* ??? */
2274 }
2275
2276 sprintf_vma (start_str, start);
2277 sprintf_vma (stop_str, stop);
2278 sprintf (target_buf, "QTFrame:outside:%s:%s", start_str, stop_str);
2279 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
2280 }
2281 else
2282 error (_("Trace can only be run on remote targets."));
2283 }
2284
2285 /* save-tracepoints command */
2286 static void
2287 tracepoint_save_command (char *args, int from_tty)
2288 {
2289 struct tracepoint *tp;
2290 struct action_line *line;
2291 FILE *fp;
2292 char *i1 = " ", *i2 = " ";
2293 char *indent, *actionline, *pathname;
2294 char tmp[40];
2295
2296 if (args == 0 || *args == 0)
2297 error (_("Argument required (file name in which to save tracepoints)"));
2298
2299 if (tracepoint_chain == 0)
2300 {
2301 warning (_("save-tracepoints: no tracepoints to save."));
2302 return;
2303 }
2304
2305 pathname = tilde_expand (args);
2306 if (!(fp = fopen (pathname, "w")))
2307 error (_("Unable to open file '%s' for saving tracepoints (%s)"),
2308 args, safe_strerror (errno));
2309 xfree (pathname);
2310
2311 ALL_TRACEPOINTS (tp)
2312 {
2313 if (tp->addr_string)
2314 fprintf (fp, "trace %s\n", tp->addr_string);
2315 else
2316 {
2317 sprintf_vma (tmp, tp->address);
2318 fprintf (fp, "trace *0x%s\n", tmp);
2319 }
2320
2321 if (tp->pass_count)
2322 fprintf (fp, " passcount %d\n", tp->pass_count);
2323
2324 if (tp->actions)
2325 {
2326 fprintf (fp, " actions\n");
2327 indent = i1;
2328 for (line = tp->actions; line; line = line->next)
2329 {
2330 struct cmd_list_element *cmd;
2331
2332 QUIT; /* allow user to bail out with ^C */
2333 actionline = line->action;
2334 while (isspace ((int) *actionline))
2335 actionline++;
2336
2337 fprintf (fp, "%s%s\n", indent, actionline);
2338 if (*actionline != '#') /* skip for comment lines */
2339 {
2340 cmd = lookup_cmd (&actionline, cmdlist, "", -1, 1);
2341 if (cmd == 0)
2342 error (_("Bad action list item: %s"), actionline);
2343 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2344 indent = i2;
2345 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
2346 indent = i1;
2347 }
2348 }
2349 }
2350 }
2351 fclose (fp);
2352 if (from_tty)
2353 printf_filtered ("Tracepoints saved to file '%s'.\n", args);
2354 return;
2355 }
2356
2357 /* info scope command: list the locals for a scope. */
2358 static void
2359 scope_info (char *args, int from_tty)
2360 {
2361 struct symtabs_and_lines sals;
2362 struct symbol *sym;
2363 struct minimal_symbol *msym;
2364 struct block *block;
2365 char **canonical, *symname, *save_args = args;
2366 struct dict_iterator iter;
2367 int j, count = 0;
2368
2369 if (args == 0 || *args == 0)
2370 error (_("requires an argument (function, line or *addr) to define a scope"));
2371
2372 sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
2373 if (sals.nelts == 0)
2374 return; /* presumably decode_line_1 has already warned */
2375
2376 /* Resolve line numbers to PC */
2377 resolve_sal_pc (&sals.sals[0]);
2378 block = block_for_pc (sals.sals[0].pc);
2379
2380 while (block != 0)
2381 {
2382 QUIT; /* allow user to bail out with ^C */
2383 ALL_BLOCK_SYMBOLS (block, iter, sym)
2384 {
2385 QUIT; /* allow user to bail out with ^C */
2386 if (count == 0)
2387 printf_filtered ("Scope for %s:\n", save_args);
2388 count++;
2389
2390 symname = SYMBOL_PRINT_NAME (sym);
2391 if (symname == NULL || *symname == '\0')
2392 continue; /* probably botched, certainly useless */
2393
2394 printf_filtered ("Symbol %s is ", symname);
2395 switch (SYMBOL_CLASS (sym))
2396 {
2397 default:
2398 case LOC_UNDEF: /* messed up symbol? */
2399 printf_filtered ("a bogus symbol, class %d.\n",
2400 SYMBOL_CLASS (sym));
2401 count--; /* don't count this one */
2402 continue;
2403 case LOC_CONST:
2404 printf_filtered ("a constant with value %ld (0x%lx)",
2405 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2406 break;
2407 case LOC_CONST_BYTES:
2408 printf_filtered ("constant bytes: ");
2409 if (SYMBOL_TYPE (sym))
2410 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2411 fprintf_filtered (gdb_stdout, " %02x",
2412 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2413 break;
2414 case LOC_STATIC:
2415 printf_filtered ("in static storage at address ");
2416 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
2417 break;
2418 case LOC_REGISTER:
2419 if (SYMBOL_IS_ARGUMENT (sym))
2420 printf_filtered ("an argument in register $%s",
2421 gdbarch_register_name
2422 (current_gdbarch, SYMBOL_VALUE (sym)));
2423 else
2424 printf_filtered ("a local variable in register $%s",
2425 gdbarch_register_name
2426 (current_gdbarch, SYMBOL_VALUE (sym)));
2427 break;
2428 case LOC_ARG:
2429 printf_filtered ("an argument at stack/frame offset %ld",
2430 SYMBOL_VALUE (sym));
2431 break;
2432 case LOC_LOCAL:
2433 printf_filtered ("a local variable at frame offset %ld",
2434 SYMBOL_VALUE (sym));
2435 break;
2436 case LOC_REF_ARG:
2437 printf_filtered ("a reference argument at offset %ld",
2438 SYMBOL_VALUE (sym));
2439 break;
2440 case LOC_REGPARM_ADDR:
2441 printf_filtered ("the address of an argument, in register $%s",
2442 gdbarch_register_name
2443 (current_gdbarch, SYMBOL_VALUE (sym)));
2444 break;
2445 case LOC_TYPEDEF:
2446 printf_filtered ("a typedef.\n");
2447 continue;
2448 case LOC_LABEL:
2449 printf_filtered ("a label at address ");
2450 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
2451 break;
2452 case LOC_BLOCK:
2453 printf_filtered ("a function at address ");
2454 printf_filtered ("%s", paddress (BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
2455 break;
2456 case LOC_UNRESOLVED:
2457 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
2458 NULL, NULL);
2459 if (msym == NULL)
2460 printf_filtered ("Unresolved Static");
2461 else
2462 {
2463 printf_filtered ("static storage at address ");
2464 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (msym)));
2465 }
2466 break;
2467 case LOC_OPTIMIZED_OUT:
2468 printf_filtered ("optimized out.\n");
2469 continue;
2470 case LOC_COMPUTED:
2471 SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
2472 break;
2473 }
2474 if (SYMBOL_TYPE (sym))
2475 printf_filtered (", length %d.\n",
2476 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
2477 }
2478 if (BLOCK_FUNCTION (block))
2479 break;
2480 else
2481 block = BLOCK_SUPERBLOCK (block);
2482 }
2483 if (count <= 0)
2484 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2485 save_args);
2486 }
2487
2488 /* worker function (cleanup) */
2489 static void
2490 replace_comma (void *data)
2491 {
2492 char *comma = data;
2493 *comma = ',';
2494 }
2495
2496 /* tdump command */
2497 static void
2498 trace_dump_command (char *args, int from_tty)
2499 {
2500 struct regcache *regcache;
2501 struct gdbarch *gdbarch;
2502 struct tracepoint *t;
2503 struct action_line *action;
2504 char *action_exp, *next_comma;
2505 struct cleanup *old_cleanups;
2506 int stepping_actions = 0;
2507 int stepping_frame = 0;
2508
2509 if (!target_is_remote ())
2510 {
2511 error (_("Trace can only be run on remote targets."));
2512 return;
2513 }
2514
2515 if (tracepoint_number == -1)
2516 {
2517 warning (_("No current trace frame."));
2518 return;
2519 }
2520
2521 ALL_TRACEPOINTS (t)
2522 if (t->number == tracepoint_number)
2523 break;
2524
2525 if (t == NULL)
2526 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2527 tracepoint_number);
2528
2529 old_cleanups = make_cleanup (null_cleanup, NULL);
2530
2531 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2532 tracepoint_number, traceframe_number);
2533
2534 /* The current frame is a trap frame if the frame PC is equal
2535 to the tracepoint PC. If not, then the current frame was
2536 collected during single-stepping. */
2537
2538 regcache = get_current_regcache ();
2539 gdbarch = get_regcache_arch (regcache);
2540
2541 stepping_frame = (t->address != (regcache_read_pc (regcache)
2542 - gdbarch_decr_pc_after_break (gdbarch)));
2543
2544 for (action = t->actions; action; action = action->next)
2545 {
2546 struct cmd_list_element *cmd;
2547
2548 QUIT; /* allow user to bail out with ^C */
2549 action_exp = action->action;
2550 while (isspace ((int) *action_exp))
2551 action_exp++;
2552
2553 /* The collection actions to be done while stepping are
2554 bracketed by the commands "while-stepping" and "end". */
2555
2556 if (*action_exp == '#') /* comment line */
2557 continue;
2558
2559 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2560 if (cmd == 0)
2561 error (_("Bad action list item: %s"), action_exp);
2562
2563 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
2564 stepping_actions = 1;
2565 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
2566 stepping_actions = 0;
2567 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
2568 {
2569 /* Display the collected data.
2570 For the trap frame, display only what was collected at
2571 the trap. Likewise for stepping frames, display only
2572 what was collected while stepping. This means that the
2573 two boolean variables, STEPPING_FRAME and
2574 STEPPING_ACTIONS should be equal. */
2575 if (stepping_frame == stepping_actions)
2576 {
2577 do
2578 { /* repeat over a comma-separated list */
2579 QUIT; /* allow user to bail out with ^C */
2580 if (*action_exp == ',')
2581 action_exp++;
2582 while (isspace ((int) *action_exp))
2583 action_exp++;
2584
2585 next_comma = strchr (action_exp, ',');
2586
2587 if (0 == strncasecmp (action_exp, "$reg", 4))
2588 registers_info (NULL, from_tty);
2589 else if (0 == strncasecmp (action_exp, "$loc", 4))
2590 locals_info (NULL, from_tty);
2591 else if (0 == strncasecmp (action_exp, "$arg", 4))
2592 args_info (NULL, from_tty);
2593 else
2594 { /* variable */
2595 if (next_comma)
2596 {
2597 make_cleanup (replace_comma, next_comma);
2598 *next_comma = '\0';
2599 }
2600 printf_filtered ("%s = ", action_exp);
2601 output_command (action_exp, from_tty);
2602 printf_filtered ("\n");
2603 }
2604 if (next_comma)
2605 *next_comma = ',';
2606 action_exp = next_comma;
2607 }
2608 while (action_exp && *action_exp == ',');
2609 }
2610 }
2611 }
2612 discard_cleanups (old_cleanups);
2613 }
2614
2615 /* Convert the memory pointed to by mem into hex, placing result in buf.
2616 * Return a pointer to the last char put in buf (null)
2617 * "stolen" from sparc-stub.c
2618 */
2619
2620 static const char hexchars[] = "0123456789abcdef";
2621
2622 static char *
2623 mem2hex (gdb_byte *mem, char *buf, int count)
2624 {
2625 gdb_byte ch;
2626
2627 while (count-- > 0)
2628 {
2629 ch = *mem++;
2630
2631 *buf++ = hexchars[ch >> 4];
2632 *buf++ = hexchars[ch & 0xf];
2633 }
2634
2635 *buf = 0;
2636
2637 return buf;
2638 }
2639
2640 int
2641 get_traceframe_number (void)
2642 {
2643 return traceframe_number;
2644 }
2645
2646
2647 /* module initialization */
2648 void
2649 _initialize_tracepoint (void)
2650 {
2651 struct cmd_list_element *c;
2652
2653 tracepoint_chain = 0;
2654 tracepoint_count = 0;
2655 traceframe_number = -1;
2656 tracepoint_number = -1;
2657
2658 if (tracepoint_list.list == NULL)
2659 {
2660 tracepoint_list.listsize = 128;
2661 tracepoint_list.list = xmalloc
2662 (tracepoint_list.listsize * sizeof (struct memrange));
2663 }
2664 if (tracepoint_list.aexpr_list == NULL)
2665 {
2666 tracepoint_list.aexpr_listsize = 128;
2667 tracepoint_list.aexpr_list = xmalloc
2668 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
2669 }
2670
2671 if (stepping_list.list == NULL)
2672 {
2673 stepping_list.listsize = 128;
2674 stepping_list.list = xmalloc
2675 (stepping_list.listsize * sizeof (struct memrange));
2676 }
2677
2678 if (stepping_list.aexpr_list == NULL)
2679 {
2680 stepping_list.aexpr_listsize = 128;
2681 stepping_list.aexpr_list = xmalloc
2682 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
2683 }
2684
2685 add_info ("scope", scope_info,
2686 _("List the variables local to a scope"));
2687
2688 add_cmd ("tracepoints", class_trace, NULL,
2689 _("Tracing of program execution without stopping the program."),
2690 &cmdlist);
2691
2692 add_info ("tracepoints", tracepoints_info, _("\
2693 Status of tracepoints, or tracepoint number NUMBER.\n\
2694 Convenience variable \"$tpnum\" contains the number of the\n\
2695 last tracepoint set."));
2696
2697 add_info_alias ("tp", "tracepoints", 1);
2698
2699 c = add_com ("save-tracepoints", class_trace, tracepoint_save_command, _("\
2700 Save current tracepoint definitions as a script.\n\
2701 Use the 'source' command in another debug session to restore them."));
2702 set_cmd_completer (c, filename_completer);
2703
2704 add_com ("tdump", class_trace, trace_dump_command,
2705 _("Print everything collected at the current tracepoint."));
2706
2707 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
2708 Select a trace frame;\n\
2709 No argument means forward by one frame; '-' means backward by one frame."),
2710 &tfindlist, "tfind ", 1, &cmdlist);
2711
2712 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
2713 Select a trace frame whose PC is outside the given range.\n\
2714 Usage: tfind outside addr1, addr2"),
2715 &tfindlist);
2716
2717 add_cmd ("range", class_trace, trace_find_range_command, _("\
2718 Select a trace frame whose PC is in the given range.\n\
2719 Usage: tfind range addr1,addr2"),
2720 &tfindlist);
2721
2722 add_cmd ("line", class_trace, trace_find_line_command, _("\
2723 Select a trace frame by source line.\n\
2724 Argument can be a line number (with optional source file), \n\
2725 a function name, or '*' followed by an address.\n\
2726 Default argument is 'the next source line that was traced'."),
2727 &tfindlist);
2728
2729 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
2730 Select a trace frame by tracepoint number.\n\
2731 Default is the tracepoint for the current trace frame."),
2732 &tfindlist);
2733
2734 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
2735 Select a trace frame by PC.\n\
2736 Default is the current PC, or the PC of the current trace frame."),
2737 &tfindlist);
2738
2739 add_cmd ("end", class_trace, trace_find_end_command, _("\
2740 Synonym for 'none'.\n\
2741 De-select any trace frame and resume 'live' debugging."),
2742 &tfindlist);
2743
2744 add_cmd ("none", class_trace, trace_find_none_command,
2745 _("De-select any trace frame and resume 'live' debugging."),
2746 &tfindlist);
2747
2748 add_cmd ("start", class_trace, trace_find_start_command,
2749 _("Select the first trace frame in the trace buffer."),
2750 &tfindlist);
2751
2752 add_com ("tstatus", class_trace, trace_status_command,
2753 _("Display the status of the current trace data collection."));
2754
2755 add_com ("tstop", class_trace, trace_stop_command,
2756 _("Stop trace data collection."));
2757
2758 add_com ("tstart", class_trace, trace_start_command,
2759 _("Start trace data collection."));
2760
2761 add_com ("passcount", class_trace, trace_pass_command, _("\
2762 Set the passcount for a tracepoint.\n\
2763 The trace will end when the tracepoint has been passed 'count' times.\n\
2764 Usage: passcount COUNT TPNUM, where TPNUM may also be \"all\";\n\
2765 if TPNUM is omitted, passcount refers to the last tracepoint defined."));
2766
2767 add_com ("end", class_trace, end_actions_pseudocommand, _("\
2768 Ends a list of commands or actions.\n\
2769 Several GDB commands allow you to enter a list of commands or actions.\n\
2770 Entering \"end\" on a line by itself is the normal way to terminate\n\
2771 such a list.\n\n\
2772 Note: the \"end\" command cannot be used at the gdb prompt."));
2773
2774 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
2775 Specify single-stepping behavior at a tracepoint.\n\
2776 Argument is number of instructions to trace in single-step mode\n\
2777 following the tracepoint. This command is normally followed by\n\
2778 one or more \"collect\" commands, to specify what to collect\n\
2779 while single-stepping.\n\n\
2780 Note: this command can only be used in a tracepoint \"actions\" list."));
2781
2782 add_com_alias ("ws", "while-stepping", class_alias, 0);
2783 add_com_alias ("stepping", "while-stepping", class_alias, 0);
2784
2785 add_com ("collect", class_trace, collect_pseudocommand, _("\
2786 Specify one or more data items to be collected at a tracepoint.\n\
2787 Accepts a comma-separated list of (one or more) expressions. GDB will\n\
2788 collect all data (variables, registers) referenced by that expression.\n\
2789 Also accepts the following special arguments:\n\
2790 $regs -- all registers.\n\
2791 $args -- all function arguments.\n\
2792 $locals -- all variables local to the block/function scope.\n\
2793 Note: this command can only be used in a tracepoint \"actions\" list."));
2794
2795 add_com ("actions", class_trace, trace_actions_command, _("\
2796 Specify the actions to be taken at a tracepoint.\n\
2797 Tracepoint actions may include collecting of specified data, \n\
2798 single-stepping, or enabling/disabling other tracepoints, \n\
2799 depending on target's capabilities."));
2800
2801 add_cmd ("tracepoints", class_trace, delete_trace_command, _("\
2802 Delete specified tracepoints.\n\
2803 Arguments are tracepoint numbers, separated by spaces.\n\
2804 No argument means delete all tracepoints."),
2805 &deletelist);
2806
2807 add_cmd ("tracepoints", class_trace, disable_trace_command, _("\
2808 Disable specified tracepoints.\n\
2809 Arguments are tracepoint numbers, separated by spaces.\n\
2810 No argument means disable all tracepoints."),
2811 &disablelist);
2812
2813 add_cmd ("tracepoints", class_trace, enable_trace_command, _("\
2814 Enable specified tracepoints.\n\
2815 Arguments are tracepoint numbers, separated by spaces.\n\
2816 No argument means enable all tracepoints."),
2817 &enablelist);
2818
2819 c = add_com ("trace", class_trace, trace_command, _("\
2820 Set a tracepoint at a specified line or function or address.\n\
2821 Argument may be a line number, function name, or '*' plus an address.\n\
2822 For a line number or function, trace at the start of its code.\n\
2823 If an address is specified, trace at that exact address.\n\n\
2824 Do \"help tracepoints\" for info on other tracepoint commands."));
2825 set_cmd_completer (c, location_completer);
2826
2827 add_com_alias ("tp", "trace", class_alias, 0);
2828 add_com_alias ("tr", "trace", class_alias, 1);
2829 add_com_alias ("tra", "trace", class_alias, 1);
2830 add_com_alias ("trac", "trace", class_alias, 1);
2831
2832 target_buf_size = 2048;
2833 target_buf = xmalloc (target_buf_size);
2834 }
This page took 0.096726 seconds and 4 git commands to generate.