* varobj.c (varobj_set_display_format): Use xfree.
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
CommitLineData
c906108c 1/* Tracing functionality for remote targets in custom GDB protocol
9f60d481 2
6aba47ca 3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
9b254dd1 4 2007, 2008 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
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
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
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.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
22#include "symtab.h"
23#include "frame.h"
c906108c
SS
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"
104c1213
JM
31#include "inferior.h"
32#include "tracepoint.h"
c2c6d25f 33#include "remote.h"
c5f0f3d0 34#include "linespec.h"
4e052eda 35#include "regcache.h"
c94fdfd0 36#include "completer.h"
fe898f56 37#include "block.h"
de4f826b 38#include "dictionary.h"
383f836e 39#include "observer.h"
029a67e4 40#include "user-regs.h"
c906108c
SS
41
42#include "ax.h"
43#include "ax-gdb.h"
44
45/* readline include files */
dbda9972
AC
46#include "readline/readline.h"
47#include "readline/history.h"
c906108c
SS
48
49/* readline defines this. */
50#undef savestring
51
52#ifdef HAVE_UNISTD_H
53#include <unistd.h>
54#endif
55
d183932d
MS
56/* Maximum length of an agent aexpression.
57 This accounts for the fact that packets are limited to 400 bytes
c906108c
SS
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.
c5aa993b 61
c906108c
SS
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
9a4105ab
AC
67extern void (*deprecated_readline_begin_hook) (char *, ...);
68extern char *(*deprecated_readline_hook) (char *);
69extern void (*deprecated_readline_end_hook) (void);
c5aa993b 70extern int addressprint; /* Print machine addresses? */
c906108c 71
104c1213
JM
72/* GDB commands implemented in other modules:
73 */
74
a14ed312 75extern void output_command (char *, int);
104c1213 76
c906108c
SS
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.
c5aa993b 100 */
c906108c
SS
101
102
103/* ======= Important global variables: ======= */
104
105/* Chain of all tracepoints defined. */
106struct tracepoint *tracepoint_chain;
107
108/* Number of last tracepoint made. */
109static int tracepoint_count;
110
111/* Number of last traceframe collected. */
112static int traceframe_number;
113
114/* Tracepoint for last traceframe collected. */
115static int tracepoint_number;
116
117/* Symbol for function for last traceframe collected */
118static struct symbol *traceframe_fun;
119
120/* Symtab and line for last traceframe collected */
121static struct symtab_and_line traceframe_sal;
122
123/* Tracing command lists */
124static struct cmd_list_element *tfindlist;
125
126/* ======= Important command functions: ======= */
a14ed312
KB
127static void trace_command (char *, int);
128static void tracepoints_info (char *, int);
129static void delete_trace_command (char *, int);
130static void enable_trace_command (char *, int);
131static void disable_trace_command (char *, int);
132static void trace_pass_command (char *, int);
133static void trace_actions_command (char *, int);
134static void trace_start_command (char *, int);
135static void trace_stop_command (char *, int);
136static void trace_status_command (char *, int);
137static void trace_find_command (char *, int);
138static void trace_find_pc_command (char *, int);
139static void trace_find_tracepoint_command (char *, int);
140static void trace_find_line_command (char *, int);
141static void trace_find_range_command (char *, int);
142static void trace_find_outside_command (char *, int);
143static void tracepoint_save_command (char *, int);
144static void trace_dump_command (char *, int);
c906108c
SS
145
146/* support routines */
a14ed312 147static void trace_mention (struct tracepoint *);
c906108c
SS
148
149struct collection_list;
a14ed312 150static void add_aexpr (struct collection_list *, struct agent_expr *);
47b667de 151static char *mem2hex (gdb_byte *, char *, int);
a14ed312
KB
152static void add_register (struct collection_list *collection,
153 unsigned int regno);
74b7792f 154static struct cleanup *make_cleanup_free_actions (struct tracepoint *t);
a14ed312
KB
155static void free_actions_list (char **actions_list);
156static void free_actions_list_cleanup_wrapper (void *);
392a587b 157
a14ed312 158extern void _initialize_tracepoint (void);
c906108c
SS
159
160/* Utility: returns true if "target remote" */
161static int
fba45db2 162target_is_remote (void)
c906108c
SS
163{
164 if (current_target.to_shortname &&
549678da
NS
165 (strcmp (current_target.to_shortname, "remote") == 0
166 || strcmp (current_target.to_shortname, "extended-remote") == 0))
c906108c
SS
167 return 1;
168 else
169 return 0;
170}
171
172/* Utility: generate error from an incoming stub packet. */
c5aa993b 173static void
fba45db2 174trace_error (char *buf)
c906108c
SS
175{
176 if (*buf++ != 'E')
177 return; /* not an error msg */
c5aa993b 178 switch (*buf)
c906108c
SS
179 {
180 case '1': /* malformed packet error */
181 if (*++buf == '0') /* general case: */
8a3fe4f8 182 error (_("tracepoint.c: error in outgoing packet."));
c906108c 183 else
8a3fe4f8 184 error (_("tracepoint.c: error in outgoing packet at field #%ld."),
c906108c
SS
185 strtol (buf, NULL, 16));
186 case '2':
8a3fe4f8 187 error (_("trace API error 0x%s."), ++buf);
c906108c 188 default:
8a3fe4f8 189 error (_("Target returns error code '%s'."), buf);
c906108c
SS
190 }
191}
192
d183932d 193/* Utility: wait for reply from stub, while accepting "O" packets. */
c906108c 194static char *
6d820c5c
DJ
195remote_get_noisy_reply (char **buf_p,
196 long *sizeof_buf)
c906108c 197{
d183932d 198 do /* Loop on reply from remote stub. */
c906108c 199 {
6d820c5c 200 char *buf;
c5aa993b 201 QUIT; /* allow user to bail out with ^C */
6d820c5c
DJ
202 getpkt (buf_p, sizeof_buf, 0);
203 buf = *buf_p;
c906108c 204 if (buf[0] == 0)
8a3fe4f8 205 error (_("Target does not support this command."));
c906108c
SS
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
c5aa993b
JM
212 return buf; /* here's the actual reply */
213 }
214 while (1);
c906108c
SS
215}
216
217/* Set tracepoint count to NUM. */
218static void
fba45db2 219set_tracepoint_count (int num)
c906108c
SS
220{
221 tracepoint_count = num;
222 set_internalvar (lookup_internalvar ("tpnum"),
8b9b9e1a 223 value_from_longest (builtin_type_int32, (LONGEST) num));
c906108c
SS
224}
225
226/* Set traceframe number to NUM. */
227static void
fba45db2 228set_traceframe_num (int num)
c906108c
SS
229{
230 traceframe_number = num;
231 set_internalvar (lookup_internalvar ("trace_frame"),
8b9b9e1a 232 value_from_longest (builtin_type_int32, (LONGEST) num));
c906108c
SS
233}
234
235/* Set tracepoint number to NUM. */
236static void
fba45db2 237set_tracepoint_num (int num)
c906108c
SS
238{
239 tracepoint_number = num;
240 set_internalvar (lookup_internalvar ("tracepoint"),
8b9b9e1a 241 value_from_longest (builtin_type_int32, (LONGEST) num));
c906108c
SS
242}
243
244/* Set externally visible debug variables for querying/printing
245 the traceframe context (line, function, file) */
246
247static void
fba45db2 248set_traceframe_context (CORE_ADDR trace_pc)
c906108c
SS
249{
250 static struct type *func_string, *file_string;
c5aa993b 251 static struct type *func_range, *file_range;
f976f6d4
AC
252 struct value *func_val;
253 struct value *file_val;
c906108c
SS
254 int len;
255
d183932d 256 if (trace_pc == -1) /* Cease debugging any trace buffers. */
c906108c
SS
257 {
258 traceframe_fun = 0;
259 traceframe_sal.pc = traceframe_sal.line = 0;
260 traceframe_sal.symtab = NULL;
c5aa993b 261 set_internalvar (lookup_internalvar ("trace_func"),
8b9b9e1a 262 allocate_value (builtin_type_void));
c5aa993b 263 set_internalvar (lookup_internalvar ("trace_file"),
8b9b9e1a 264 allocate_value (builtin_type_void));
c906108c 265 set_internalvar (lookup_internalvar ("trace_line"),
8b9b9e1a 266 value_from_longest (builtin_type_int32,
d183932d 267 (LONGEST) - 1));
c906108c
SS
268 return;
269 }
270
d183932d 271 /* Save as globals for internal use. */
c906108c
SS
272 traceframe_sal = find_pc_line (trace_pc, 0);
273 traceframe_fun = find_pc_function (trace_pc);
274
d183932d
MS
275 /* Save linenumber as "$trace_line", a debugger variable visible to
276 users. */
c906108c 277 set_internalvar (lookup_internalvar ("trace_line"),
8b9b9e1a 278 value_from_longest (builtin_type_int32,
c906108c
SS
279 (LONGEST) traceframe_sal.line));
280
d183932d
MS
281 /* Save func name as "$trace_func", a debugger variable visible to
282 users. */
c5aa993b 283 if (traceframe_fun == NULL ||
3567439c 284 SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
c5aa993b 285 set_internalvar (lookup_internalvar ("trace_func"),
8b9b9e1a 286 allocate_value (builtin_type_void));
c906108c
SS
287 else
288 {
3567439c 289 len = strlen (SYMBOL_LINKAGE_NAME (traceframe_fun));
c5aa993b 290 func_range = create_range_type (func_range,
8b9b9e1a 291 builtin_type_int32, 0, len - 1);
c5aa993b 292 func_string = create_array_type (func_string,
8b9b9e1a 293 builtin_type_true_char, func_range);
c906108c 294 func_val = allocate_value (func_string);
04624583 295 deprecated_set_value_type (func_val, func_string);
990a07ab 296 memcpy (value_contents_raw (func_val),
3567439c 297 SYMBOL_LINKAGE_NAME (traceframe_fun),
c906108c 298 len);
88e3b34b 299 deprecated_set_value_modifiable (func_val, 0);
c906108c
SS
300 set_internalvar (lookup_internalvar ("trace_func"), func_val);
301 }
302
d183932d
MS
303 /* Save file name as "$trace_file", a debugger variable visible to
304 users. */
c5aa993b 305 if (traceframe_sal.symtab == NULL ||
c906108c 306 traceframe_sal.symtab->filename == NULL)
c5aa993b 307 set_internalvar (lookup_internalvar ("trace_file"),
8b9b9e1a 308 allocate_value (builtin_type_void));
c906108c
SS
309 else
310 {
311 len = strlen (traceframe_sal.symtab->filename);
c5aa993b 312 file_range = create_range_type (file_range,
8b9b9e1a 313 builtin_type_int32, 0, len - 1);
c5aa993b 314 file_string = create_array_type (file_string,
8b9b9e1a 315 builtin_type_true_char, file_range);
c906108c 316 file_val = allocate_value (file_string);
04624583 317 deprecated_set_value_type (file_val, file_string);
990a07ab 318 memcpy (value_contents_raw (file_val),
c5aa993b 319 traceframe_sal.symtab->filename,
c906108c 320 len);
88e3b34b 321 deprecated_set_value_modifiable (file_val, 0);
c906108c
SS
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
d183932d
MS
332 error(); otherwise it leaves a bogus tracepoint on the chain.
333 Validate your arguments BEFORE calling this routine! */
c906108c
SS
334
335static struct tracepoint *
fba45db2 336set_raw_tracepoint (struct symtab_and_line sal)
c906108c 337{
52f0bd74 338 struct tracepoint *t, *tc;
c906108c
SS
339 struct cleanup *old_chain;
340
341 t = (struct tracepoint *) xmalloc (sizeof (struct tracepoint));
b8c9b27d 342 old_chain = make_cleanup (xfree, t);
c906108c
SS
343 memset (t, 0, sizeof (*t));
344 t->address = sal.pc;
345 if (sal.symtab == NULL)
346 t->source_file = NULL;
347 else
c5aa993b 348 t->source_file = savestring (sal.symtab->filename,
c906108c
SS
349 strlen (sal.symtab->filename));
350
c5aa993b
JM
351 t->section = sal.section;
352 t->language = current_language->la_language;
c906108c
SS
353 t->input_radix = input_radix;
354 t->line_number = sal.line;
b5de0fa7 355 t->enabled_p = 1;
c5aa993b
JM
356 t->next = 0;
357 t->step_count = 0;
358 t->pass_count = 0;
c906108c
SS
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
d183932d 378/* Set a tracepoint according to ARG (function, linenum or *address). */
c906108c 379static void
fba45db2 380trace_command (char *arg, int from_tty)
c906108c 381{
c5aa993b 382 char **canonical = (char **) NULL;
c906108c
SS
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)
8a3fe4f8 390 error (_("trace command requires an argument"));
c906108c
SS
391
392 if (from_tty && info_verbose)
393 printf_filtered ("TRACE %s\n", arg);
394
395 addr_start = arg;
d183932d
MS
396 sals = decode_line_1 (&arg, 1, (struct symtab *) NULL,
397 0, &canonical, NULL);
c5aa993b
JM
398 addr_end = arg;
399 if (!sals.nelts)
d183932d 400 return; /* ??? Presumably decode_line_1 has already warned? */
c906108c
SS
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
c5aa993b
JM
416 command string. */
417 if (canonical != (char **) NULL && canonical[i] != NULL)
c906108c
SS
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);
c906108c
SS
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
d183932d 432/* Tell the user we have just set a tracepoint TP. */
c906108c
SS
433
434static void
fba45db2 435trace_mention (struct tracepoint *tp)
c906108c
SS
436{
437 printf_filtered ("Tracepoint %d", tp->number);
438
439 if (addressprint || (tp->source_file == NULL))
440 {
441 printf_filtered (" at ");
ed49a04f 442 printf_filtered ("%s", paddress (tp->address));
c906108c
SS
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
d183932d
MS
451/* Print information on tracepoint number TPNUM_EXP, or all if
452 omitted. */
c906108c
SS
453
454static void
fba45db2 455tracepoints_info (char *tpnum_exp, int from_tty)
c906108c
SS
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)
bb518678 465 tpnum = parse_and_eval_long (tpnum_exp);
c906108c
SS
466
467 ALL_TRACEPOINTS (t)
468 if (tpnum == -1 || tpnum == t->number)
c5aa993b 469 {
d183932d 470 extern int addressprint; /* Print machine addresses? */
c906108c 471
c5aa993b
JM
472 if (!found_a_tracepoint++)
473 {
474 printf_filtered ("Num Enb ");
475 if (addressprint)
75ac9d7b 476 {
17a912b6 477 if (gdbarch_addr_bit (current_gdbarch) <= 32)
75ac9d7b
MS
478 printf_filtered ("Address ");
479 else
480 printf_filtered ("Address ");
481 }
c5aa993b
JM
482 printf_filtered ("PassC StepC What\n");
483 }
484 strcpy (wrap_indent, " ");
485 if (addressprint)
75ac9d7b 486 {
17a912b6 487 if (gdbarch_addr_bit (current_gdbarch) <= 32)
75ac9d7b
MS
488 strcat (wrap_indent, " ");
489 else
490 strcat (wrap_indent, " ");
491 }
c5aa993b
JM
492
493 printf_filtered ("%-3d %-3s ", t->number,
b5de0fa7 494 t->enabled_p ? "y" : "n");
c5aa993b 495 if (addressprint)
75ac9d7b
MS
496 {
497 char *tmp;
498
17a912b6 499 if (gdbarch_addr_bit (current_gdbarch) <= 32)
bb599908
PH
500 tmp = hex_string_custom (t->address & (CORE_ADDR) 0xffffffff,
501 8);
75ac9d7b 502 else
bb599908 503 tmp = hex_string_custom (t->address, 16);
75ac9d7b
MS
504
505 printf_filtered ("%s ", tmp);
506 }
c4093a6a 507 printf_filtered ("%-5d %-5ld ", t->pass_count, t->step_count);
c5aa993b
JM
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);
de5ad195 515 fputs_filtered (SYMBOL_PRINT_NAME (sym), gdb_stdout);
c5aa993b
JM
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, " ");
c906108c 524
c5aa993b
JM
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 }
c906108c
SS
535 if (!found_a_tracepoint)
536 {
537 if (tpnum == -1)
c5aa993b 538 printf_filtered ("No tracepoints.\n");
c906108c 539 else
c5aa993b 540 printf_filtered ("No tracepoint number %d.\n", tpnum);
c906108c
SS
541 }
542}
543
d183932d
MS
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. */
c5aa993b 548enum tracepoint_opcode
c906108c 549{
104c1213
JM
550 enable_op,
551 disable_op,
552 delete_op
c906108c
SS
553};
554
d183932d 555/* This function implements enable, disable and delete commands. */
c906108c 556static void
fba45db2
KB
557tracepoint_operation (struct tracepoint *t, int from_tty,
558 enum tracepoint_opcode opcode)
c906108c
SS
559{
560 struct tracepoint *t2;
561
5c44784c
JM
562 if (t == NULL) /* no tracepoint operand */
563 return;
564
c5aa993b
JM
565 switch (opcode)
566 {
104c1213 567 case enable_op:
b5de0fa7 568 t->enabled_p = 1;
383f836e 569 observer_notify_tracepoint_modified (t->number);
c5aa993b 570 break;
104c1213 571 case disable_op:
b5de0fa7 572 t->enabled_p = 0;
383f836e 573 observer_notify_tracepoint_modified (t->number);
c5aa993b 574 break;
104c1213 575 case delete_op:
c5aa993b
JM
576 if (tracepoint_chain == t)
577 tracepoint_chain = t->next;
c906108c 578
c5aa993b
JM
579 ALL_TRACEPOINTS (t2)
580 if (t2->next == t)
c906108c
SS
581 {
582 t2->next = t->next;
583 break;
584 }
585
383f836e 586 observer_notify_tracepoint_deleted (t->number);
e3dd034f 587
c5aa993b 588 if (t->addr_string)
b8c9b27d 589 xfree (t->addr_string);
c5aa993b 590 if (t->source_file)
b8c9b27d 591 xfree (t->source_file);
c5aa993b
JM
592 if (t->actions)
593 free_actions (t);
c906108c 594
b8c9b27d 595 xfree (t);
c5aa993b
JM
596 break;
597 }
c906108c
SS
598}
599
5c44784c 600/* Utility: parse a tracepoint number and look it up in the list.
c2d11a7d
JM
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. */
c906108c 604struct tracepoint *
fba45db2 605get_tracepoint_by_number (char **arg, int multi_p, int optional_p)
c906108c
SS
606{
607 struct tracepoint *t;
c906108c 608 int tpnum;
c2d11a7d 609 char *instring = arg == NULL ? NULL : *arg;
c906108c 610
c2d11a7d
JM
611 if (arg == NULL || *arg == NULL || ! **arg)
612 {
613 if (optional_p)
614 tpnum = tracepoint_count;
615 else
e2e0b3e5 616 error_no_arg (_("tracepoint number"));
c2d11a7d
JM
617 }
618 else
619 tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
c906108c 620
5c44784c 621 if (tpnum <= 0)
c906108c 622 {
c2d11a7d 623 if (instring && *instring)
d183932d
MS
624 printf_filtered ("bad tracepoint number at or near '%s'\n",
625 instring);
c2d11a7d
JM
626 else
627 printf_filtered ("Tracepoint argument missing and no previous tracepoint\n");
5c44784c 628 return NULL;
c906108c 629 }
5c44784c 630
c906108c
SS
631 ALL_TRACEPOINTS (t)
632 if (t->number == tpnum)
c5aa993b
JM
633 {
634 return t;
635 }
5c44784c
JM
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. */
c906108c
SS
640 printf_unfiltered ("No tracepoint number %d.\n", tpnum);
641 return NULL;
642}
643
d183932d
MS
644/* Utility:
645 parse a list of tracepoint numbers, and call a func for each. */
c906108c 646static void
fba45db2
KB
647map_args_over_tracepoints (char *args, int from_tty,
648 enum tracepoint_opcode opcode)
c906108c
SS
649{
650 struct tracepoint *t, *tmp;
c906108c
SS
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 {
d183932d 658 QUIT; /* Give user option to bail out with ^C. */
c2d11a7d 659 t = get_tracepoint_by_number (&args, 1, 0);
5c44784c 660 tracepoint_operation (t, from_tty, opcode);
c906108c
SS
661 while (*args == ' ' || *args == '\t')
662 args++;
663 }
664}
665
d183932d
MS
666/* The 'enable trace' command enables tracepoints.
667 Not supported by all targets. */
c906108c 668static void
fba45db2 669enable_trace_command (char *args, int from_tty)
c906108c
SS
670{
671 dont_repeat ();
104c1213 672 map_args_over_tracepoints (args, from_tty, enable_op);
c906108c
SS
673}
674
d183932d
MS
675/* The 'disable trace' command disables tracepoints.
676 Not supported by all targets. */
c906108c 677static void
fba45db2 678disable_trace_command (char *args, int from_tty)
c906108c
SS
679{
680 dont_repeat ();
104c1213 681 map_args_over_tracepoints (args, from_tty, disable_op);
c906108c
SS
682}
683
684/* Remove a tracepoint (or all if no argument) */
685static void
fba45db2 686delete_trace_command (char *args, int from_tty)
c906108c
SS
687{
688 dont_repeat ();
689 if (!args || !*args) /* No args implies all tracepoints; */
d183932d
MS
690 if (from_tty) /* confirm only if from_tty... */
691 if (tracepoint_chain) /* and if there are tracepoints to
692 delete! */
c906108c
SS
693 if (!query ("Delete all tracepoints? "))
694 return;
695
104c1213 696 map_args_over_tracepoints (args, from_tty, delete_op);
c906108c
SS
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
705static void
fba45db2 706trace_pass_command (char *args, int from_tty)
c906108c
SS
707{
708 struct tracepoint *t1 = (struct tracepoint *) -1, *t2;
104c1213 709 unsigned int count;
5c44784c 710 int all = 0;
c906108c
SS
711
712 if (args == 0 || *args == 0)
8a3fe4f8 713 error (_("passcount command requires an argument (count + optional TP num)"));
c906108c 714
d183932d 715 count = strtoul (args, &args, 10); /* Count comes first, then TP num. */
c906108c 716
104c1213 717 while (*args && isspace ((int) *args))
c906108c
SS
718 args++;
719
720 if (*args && strncasecmp (args, "all", 3) == 0)
5c44784c 721 {
d183932d 722 args += 3; /* Skip special argument "all". */
5c44784c
JM
723 all = 1;
724 if (*args)
8a3fe4f8 725 error (_("Junk at end of arguments."));
5c44784c 726 }
c906108c 727 else
c2d11a7d 728 t1 = get_tracepoint_by_number (&args, 1, 1);
c906108c 729
5c44784c 730 do
c5aa993b 731 {
5c44784c
JM
732 if (t1)
733 {
734 ALL_TRACEPOINTS (t2)
735 if (t1 == (struct tracepoint *) -1 || t1 == t2)
736 {
737 t2->pass_count = count;
383f836e 738 observer_notify_tracepoint_modified (t2->number);
5c44784c
JM
739 if (from_tty)
740 printf_filtered ("Setting tracepoint %d's passcount to %d\n",
741 t2->number, count);
742 }
c2d11a7d
JM
743 if (! all && *args)
744 t1 = get_tracepoint_by_number (&args, 1, 0);
5c44784c 745 }
c5aa993b 746 }
5c44784c 747 while (*args);
c906108c
SS
748}
749
750/* ACTIONS functions: */
751
752/* Prototypes for action-parsing utility commands */
a14ed312 753static void read_actions (struct tracepoint *);
c906108c
SS
754
755/* The three functions:
c5aa993b
JM
756 collect_pseudocommand,
757 while_stepping_pseudocommand, and
758 end_actions_pseudocommand
c906108c
SS
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
c5aa993b 764static void
fba45db2 765end_actions_pseudocommand (char *args, int from_tty)
c906108c 766{
8a3fe4f8 767 error (_("This command cannot be used at the top level."));
c906108c
SS
768}
769
770static void
fba45db2 771while_stepping_pseudocommand (char *args, int from_tty)
c906108c 772{
8a3fe4f8 773 error (_("This command can only be used in a tracepoint actions list."));
c906108c
SS
774}
775
776static void
fba45db2 777collect_pseudocommand (char *args, int from_tty)
c906108c 778{
8a3fe4f8 779 error (_("This command can only be used in a tracepoint actions list."));
c906108c
SS
780}
781
782/* Enter a list of actions for a tracepoint. */
783static void
fba45db2 784trace_actions_command (char *args, int from_tty)
c906108c
SS
785{
786 struct tracepoint *t;
c906108c
SS
787 char tmpbuf[128];
788 char *end_msg = "End with a line saying just \"end\".";
789
c2d11a7d 790 t = get_tracepoint_by_number (&args, 0, 1);
7a292a7a 791 if (t)
c906108c
SS
792 {
793 sprintf (tmpbuf, "Enter actions for tracepoint %d, one per line.",
794 t->number);
795
796 if (from_tty)
797 {
9a4105ab
AC
798 if (deprecated_readline_begin_hook)
799 (*deprecated_readline_begin_hook) ("%s %s\n", tmpbuf, end_msg);
c906108c
SS
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
9a4105ab
AC
808 if (deprecated_readline_end_hook)
809 (*deprecated_readline_end_hook) ();
c906108c
SS
810 /* tracepoints_changed () */
811 }
5c44784c 812 /* else just return */
c906108c
SS
813}
814
815/* worker function */
816static void
fba45db2 817read_actions (struct tracepoint *t)
c906108c
SS
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++;
1a6fae3c
MK
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. */
c906108c
SS
835#ifdef STOP_SIGNAL
836 if (job_control)
362646f5 837 signal (STOP_SIGNAL, handle_stop_sig);
c906108c 838#endif
74b7792f 839 old_chain = make_cleanup_free_actions (t);
c906108c
SS
840 while (1)
841 {
d183932d
MS
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. */
c906108c
SS
845 wrap_here ("");
846 gdb_flush (gdb_stdout);
847 gdb_flush (gdb_stderr);
848
9a4105ab
AC
849 if (deprecated_readline_hook && instream == NULL)
850 line = (*deprecated_readline_hook) (prompt);
c906108c
SS
851 else if (instream == stdin && ISATTY (instream))
852 {
b4f5539f 853 line = gdb_readline_wrapper (prompt);
c5aa993b 854 if (line && *line) /* add it to command history */
c906108c
SS
855 add_history (line);
856 }
857 else
858 line = gdb_readline (0);
859
549678da 860 if (!line)
d844e34b
JB
861 {
862 line = xstrdup ("end");
863 printf_filtered ("end\n");
864 }
549678da 865
c906108c
SS
866 linetype = validate_actionline (&line, t);
867 if (linetype == BADLINE)
c5aa993b 868 continue; /* already warned -- collect another line */
c906108c
SS
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" */
7a292a7a
SS
883 {
884 if (prompt == prompt2)
885 {
8a3fe4f8 886 warning (_("Already processing 'while-stepping'"));
7a292a7a
SS
887 continue;
888 }
889 else
890 prompt = prompt2; /* change prompt for stepping actions */
891 }
c906108c 892 else if (linetype == END)
7a292a7a
SS
893 {
894 if (prompt == prompt2)
895 {
896 prompt = prompt1; /* end of single-stepping actions */
897 }
898 else
c5aa993b 899 { /* end of actions */
7a292a7a
SS
900 if (t->actions->next == NULL)
901 {
d183932d
MS
902 /* An "end" all by itself with no other actions
903 means this tracepoint has no actions.
904 Discard empty list. */
7a292a7a
SS
905 free_actions (t);
906 }
907 break;
908 }
909 }
c906108c
SS
910 }
911#ifdef STOP_SIGNAL
912 if (job_control)
913 signal (STOP_SIGNAL, SIG_DFL);
914#endif
8edbea78 915 immediate_quit--;
c906108c
SS
916 discard_cleanups (old_chain);
917}
918
919/* worker function */
920enum actionline_type
fba45db2 921validate_actionline (char **line, struct tracepoint *t)
c906108c
SS
922{
923 struct cmd_list_element *c;
924 struct expression *exp = NULL;
c906108c
SS
925 struct cleanup *old_chain = NULL;
926 char *p;
927
15255275
MS
928 /* if EOF is typed, *line is NULL */
929 if (*line == NULL)
930 return END;
931
104c1213 932 for (p = *line; isspace ((int) *p);)
c906108c
SS
933 p++;
934
d183932d
MS
935 /* Symbol lookup etc. */
936 if (*p == '\0') /* empty line: just prompt for another line. */
c906108c
SS
937 return BADLINE;
938
c5aa993b 939 if (*p == '#') /* comment line */
c906108c
SS
940 return GENERIC;
941
942 c = lookup_cmd (&p, cmdlist, "", -1, 1);
943 if (c == 0)
944 {
8a3fe4f8 945 warning (_("'%s' is not an action that I know, or is ambiguous."),
d183932d 946 p);
c906108c
SS
947 return BADLINE;
948 }
c5aa993b 949
bbaca940 950 if (cmd_cfunc_eq (c, collect_pseudocommand))
c906108c
SS
951 {
952 struct agent_expr *aexpr;
953 struct agent_reqs areqs;
954
c5aa993b
JM
955 do
956 { /* repeat over a comma-separated list */
957 QUIT; /* allow user to bail out with ^C */
104c1213 958 while (isspace ((int) *p))
c5aa993b 959 p++;
c906108c 960
c5aa993b
JM
961 if (*p == '$') /* look for special pseudo-symbols */
962 {
c5aa993b
JM
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 }
d183932d 970 /* else fall thru, treat p as an expression and parse it! */
c5aa993b
JM
971 }
972 exp = parse_exp_1 (&p, block_for_pc (t->address), 1);
c13c43fd 973 old_chain = make_cleanup (free_current_contents, &exp);
c906108c 974
c5aa993b
JM
975 if (exp->elts[0].opcode == OP_VAR_VALUE)
976 {
977 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
978 {
8a3fe4f8 979 warning (_("constant %s (value %ld) will not be collected."),
3567439c 980 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
c5aa993b
JM
981 SYMBOL_VALUE (exp->elts[2].symbol));
982 return BADLINE;
983 }
984 else if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_OPTIMIZED_OUT)
985 {
8a3fe4f8 986 warning (_("%s is optimized away and cannot be collected."),
3567439c 987 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
c5aa993b
JM
988 return BADLINE;
989 }
990 }
c906108c 991
d183932d
MS
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. */
c5aa993b 995 aexpr = gen_trace_for_expr (t->address, exp);
f23d52e0 996 make_cleanup_free_agent_expr (aexpr);
c906108c 997
c5aa993b 998 if (aexpr->len > MAX_AGENT_EXPR_LEN)
8a3fe4f8 999 error (_("expression too complicated, try simplifying"));
c906108c 1000
c5aa993b 1001 ax_reqs (aexpr, &areqs);
b8c9b27d 1002 (void) make_cleanup (xfree, areqs.reg_mask);
c906108c 1003
c5aa993b 1004 if (areqs.flaw != agent_flaw_none)
8a3fe4f8 1005 error (_("malformed expression"));
c906108c 1006
c5aa993b 1007 if (areqs.min_height < 0)
8a3fe4f8 1008 error (_("gdb: Internal error: expression has min height < 0"));
c906108c 1009
c5aa993b 1010 if (areqs.max_height > 20)
8a3fe4f8 1011 error (_("expression too complicated, try simplifying"));
c906108c 1012
c5aa993b
JM
1013 do_cleanups (old_chain);
1014 }
1015 while (p && *p++ == ',');
c906108c
SS
1016 return GENERIC;
1017 }
bbaca940 1018 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
c906108c 1019 {
c5aa993b 1020 char *steparg; /* in case warning is necessary */
c906108c 1021
104c1213 1022 while (isspace ((int) *p))
c906108c
SS
1023 p++;
1024 steparg = p;
1025
1026 if (*p == '\0' ||
1027 (t->step_count = strtol (p, &p, 0)) == 0)
1028 {
8a3fe4f8 1029 warning (_("'%s': bad step-count; command ignored."), *line);
c906108c
SS
1030 return BADLINE;
1031 }
1032 return STEPPING;
1033 }
bbaca940 1034 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
c906108c
SS
1035 return END;
1036 else
1037 {
8a3fe4f8 1038 warning (_("'%s' is not a supported tracepoint action."), *line);
c906108c
SS
1039 return BADLINE;
1040 }
1041}
1042
1043/* worker function */
c5aa993b 1044void
fba45db2 1045free_actions (struct tracepoint *t)
c906108c
SS
1046{
1047 struct action_line *line, *next;
1048
1049 for (line = t->actions; line; line = next)
1050 {
1051 next = line->next;
c5aa993b 1052 if (line->action)
b8c9b27d
KB
1053 xfree (line->action);
1054 xfree (line);
c906108c
SS
1055 }
1056 t->actions = NULL;
1057}
1058
74b7792f
AC
1059static void
1060do_free_actions_cleanup (void *t)
1061{
1062 free_actions (t);
1063}
1064
1065static struct cleanup *
1066make_cleanup_free_actions (struct tracepoint *t)
1067{
1068 return make_cleanup (do_free_actions_cleanup, t);
1069}
1070
f50e79a4
JB
1071enum {
1072 memrange_absolute = -1
1073};
1074
c5aa993b
JM
1075struct memrange
1076{
f50e79a4
JB
1077 int type; /* memrange_absolute for absolute memory range,
1078 else basereg number */
c906108c
SS
1079 bfd_signed_vma start;
1080 bfd_signed_vma end;
1081};
1082
c5aa993b
JM
1083struct collection_list
1084 {
549678da 1085 unsigned char regs_mask[32]; /* room for up to 256 regs */
c5aa993b
JM
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 }
1094tracepoint_list, stepping_list;
c906108c
SS
1095
1096/* MEMRANGE functions: */
1097
a14ed312 1098static int memrange_cmp (const void *, const void *);
c906108c
SS
1099
1100/* compare memranges for qsort */
1101static int
fba45db2 1102memrange_cmp (const void *va, const void *vb)
c906108c
SS
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)
c5aa993b 1109 return 1;
f50e79a4 1110 if (a->type == memrange_absolute)
c906108c 1111 {
c5aa993b
JM
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;
c906108c
SS
1116 }
1117 else
1118 {
c5aa993b 1119 if (a->start < b->start)
c906108c 1120 return -1;
c5aa993b
JM
1121 if (a->start > b->start)
1122 return 1;
c906108c
SS
1123 }
1124 return 0;
1125}
1126
d183932d 1127/* Sort the memrange list using qsort, and merge adjacent memranges. */
c906108c 1128static void
fba45db2 1129memrange_sortmerge (struct collection_list *memranges)
c906108c
SS
1130{
1131 int a, b;
1132
c5aa993b 1133 qsort (memranges->list, memranges->next_memrange,
c906108c
SS
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 &&
c5aa993b 1140 memranges->list[b].start - memranges->list[a].end <=
0c92afe8 1141 MAX_REGISTER_SIZE)
c906108c
SS
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)
c5aa993b 1150 memcpy (&memranges->list[a], &memranges->list[b],
c906108c
SS
1151 sizeof (struct memrange));
1152 }
1153 memranges->next_memrange = a + 1;
1154 }
1155}
1156
d183932d 1157/* Add a register to a collection list. */
392a587b 1158static void
fba45db2 1159add_register (struct collection_list *collection, unsigned int regno)
c906108c
SS
1160{
1161 if (info_verbose)
1162 printf_filtered ("collect register %d\n", regno);
27e06d3e 1163 if (regno >= (8 * sizeof (collection->regs_mask)))
8a3fe4f8 1164 error (_("Internal: register number %d too large for tracepoint"),
c906108c 1165 regno);
c5aa993b 1166 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
c906108c
SS
1167}
1168
1169/* Add a memrange to a collection list */
1170static void
d183932d
MS
1171add_memrange (struct collection_list *memranges,
1172 int type, bfd_signed_vma base,
fba45db2 1173 unsigned long len)
c906108c
SS
1174{
1175 if (info_verbose)
104c1213
JM
1176 {
1177 printf_filtered ("(%d,", type);
1178 printf_vma (base);
1179 printf_filtered (",%ld)\n", len);
1180 }
1181
f50e79a4 1182 /* type: memrange_absolute == memory, other n == basereg */
c5aa993b 1183 memranges->list[memranges->next_memrange].type = type;
d183932d 1184 /* base: addr if memory, offset if reg relative. */
c906108c
SS
1185 memranges->list[memranges->next_memrange].start = base;
1186 /* len: we actually save end (base + len) for convenience */
c5aa993b 1187 memranges->list[memranges->next_memrange].end = base + len;
c906108c
SS
1188 memranges->next_memrange++;
1189 if (memranges->next_memrange >= memranges->listsize)
1190 {
1191 memranges->listsize *= 2;
c5aa993b 1192 memranges->list = xrealloc (memranges->list,
c906108c
SS
1193 memranges->listsize);
1194 }
1195
f50e79a4 1196 if (type != memrange_absolute) /* Better collect the base register! */
c906108c
SS
1197 add_register (memranges, type);
1198}
1199
d183932d 1200/* Add a symbol to a collection list. */
c906108c 1201static void
d183932d
MS
1202collect_symbol (struct collection_list *collect,
1203 struct symbol *sym,
fba45db2 1204 long frame_regno, long frame_offset)
c906108c 1205{
c5aa993b 1206 unsigned long len;
104c1213 1207 unsigned int reg;
c906108c
SS
1208 bfd_signed_vma offset;
1209
c5aa993b
JM
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",
3567439c 1215 SYMBOL_PRINT_NAME (sym),
d183932d 1216 SYMBOL_CLASS (sym));
c5aa993b
JM
1217 break;
1218 case LOC_CONST:
104c1213 1219 printf_filtered ("constant %s (value %ld) will not be collected.\n",
3567439c 1220 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
c5aa993b
JM
1221 break;
1222 case LOC_STATIC:
1223 offset = SYMBOL_VALUE_ADDRESS (sym);
1224 if (info_verbose)
104c1213
JM
1225 {
1226 char tmp[40];
1227
1228 sprintf_vma (tmp, offset);
1229 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
3567439c 1230 SYMBOL_PRINT_NAME (sym), len,
d183932d 1231 tmp /* address */);
104c1213 1232 }
f50e79a4 1233 add_memrange (collect, memrange_absolute, offset, len);
c5aa993b
JM
1234 break;
1235 case LOC_REGISTER:
c5aa993b
JM
1236 reg = SYMBOL_VALUE (sym);
1237 if (info_verbose)
d183932d 1238 printf_filtered ("LOC_REG[parm] %s: ",
3567439c 1239 SYMBOL_PRINT_NAME (sym));
c5aa993b 1240 add_register (collect, reg);
d183932d
MS
1241 /* Check for doubles stored in two registers. */
1242 /* FIXME: how about larger types stored in 3 or more regs? */
c5aa993b 1243 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
3acba339 1244 len > register_size (current_gdbarch, reg))
c5aa993b
JM
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",
3567439c 1250 SYMBOL_PRINT_NAME (sym));
c5aa993b
JM
1251 break;
1252 case LOC_ARG:
1253 reg = frame_regno;
1254 offset = frame_offset + SYMBOL_VALUE (sym);
1255 if (info_verbose)
1256 {
104c1213 1257 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
3567439c 1258 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
1259 printf_vma (offset);
1260 printf_filtered (" from frame ptr reg %d\n", reg);
c5aa993b
JM
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 {
104c1213 1269 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
3567439c 1270 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
1271 printf_vma (offset);
1272 printf_filtered (" from reg %d\n", reg);
c5aa993b
JM
1273 }
1274 add_memrange (collect, reg, offset, len);
1275 break;
1276 case LOC_LOCAL:
c5aa993b
JM
1277 reg = frame_regno;
1278 offset = frame_offset + SYMBOL_VALUE (sym);
1279 if (info_verbose)
1280 {
104c1213 1281 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
3567439c 1282 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
1283 printf_vma (offset);
1284 printf_filtered (" from frame ptr reg %d\n", reg);
c5aa993b
JM
1285 }
1286 add_memrange (collect, reg, offset, len);
1287 break;
c5aa993b 1288 case LOC_UNRESOLVED:
d183932d 1289 printf_filtered ("Don't know LOC_UNRESOLVED %s\n",
3567439c 1290 SYMBOL_PRINT_NAME (sym));
c5aa993b
JM
1291 break;
1292 case LOC_OPTIMIZED_OUT:
8e1a459b 1293 printf_filtered ("%s has been optimized out of existence.\n",
3567439c 1294 SYMBOL_PRINT_NAME (sym));
c5aa993b
JM
1295 break;
1296 }
c906108c
SS
1297}
1298
1299/* Add all locals (or args) symbols to collection list */
1300static void
fba45db2
KB
1301add_local_symbols (struct collection_list *collect, CORE_ADDR pc,
1302 long frame_regno, long frame_offset, int type)
c906108c
SS
1303{
1304 struct symbol *sym;
c5aa993b 1305 struct block *block;
de4f826b
DC
1306 struct dict_iterator iter;
1307 int count = 0;
c906108c
SS
1308
1309 block = block_for_pc (pc);
1310 while (block != 0)
1311 {
c5aa993b 1312 QUIT; /* allow user to bail out with ^C */
de4f826b 1313 ALL_BLOCK_SYMBOLS (block, iter, sym)
c906108c 1314 {
2a2d4dc3
AS
1315 if (SYMBOL_IS_ARGUMENT (sym)
1316 ? type == 'A' /* collecting Arguments */
1317 : type == 'L') /* collecting Locals */
c5aa993b 1318 {
2a2d4dc3
AS
1319 count++;
1320 collect_symbol (collect, sym, frame_regno,
1321 frame_offset);
c5aa993b 1322 }
c906108c
SS
1323 }
1324 if (BLOCK_FUNCTION (block))
1325 break;
1326 else
1327 block = BLOCK_SUPERBLOCK (block);
1328 }
1329 if (count == 0)
8a3fe4f8 1330 warning (_("No %s found in scope."),
d183932d 1331 type == 'L' ? "locals" : "args");
c906108c
SS
1332}
1333
1334/* worker function */
1335static void
fba45db2 1336clear_collection_list (struct collection_list *list)
c906108c
SS
1337{
1338 int ndx;
1339
1340 list->next_memrange = 0;
1341 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1342 {
c5aa993b 1343 free_agent_expr (list->aexpr_list[ndx]);
c906108c
SS
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) */
1351static char **
fba45db2 1352stringify_collection_list (struct collection_list *list, char *string)
c906108c
SS
1353{
1354 char temp_buf[2048];
104c1213 1355 char tmp2[40];
c906108c
SS
1356 int count;
1357 int ndx = 0;
1358 char *(*str_list)[];
1359 char *end;
c5aa993b 1360 long i;
c906108c
SS
1361
1362 count = 1 + list->next_memrange + list->next_aexpr_elt + 1;
c5aa993b 1363 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
c906108c
SS
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;
c5aa993b 1373 *end++ = 'R';
c906108c
SS
1374 for (; i >= 0; i--)
1375 {
c5aa993b 1376 QUIT; /* allow user to bail out with ^C */
c906108c
SS
1377 if (info_verbose)
1378 printf_filtered ("%02X", list->regs_mask[i]);
c5aa993b 1379 sprintf (end, "%02X", list->regs_mask[i]);
c906108c
SS
1380 end += 2;
1381 }
c5aa993b 1382 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
c906108c
SS
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 */
104c1213 1392 sprintf_vma (tmp2, list->list[i].start);
c906108c 1393 if (info_verbose)
104c1213
JM
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 }
c906108c
SS
1400 if (count + 27 > MAX_AGENT_EXPR_LEN)
1401 {
c5aa993b 1402 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
1403 ndx++;
1404 count = 0;
1405 end = temp_buf;
1406 }
104c1213 1407
d1948716
JB
1408 {
1409 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1410
1411 /* The "%X" conversion specifier expects an unsigned argument,
f50e79a4
JB
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)
d1948716
JB
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 }
104c1213 1420
c906108c 1421 count += strlen (end);
3ffbc0a5 1422 end = temp_buf + count;
c906108c
SS
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 {
c5aa993b 1430 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
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
d183932d
MS
1439 end = mem2hex (list->aexpr_list[i]->buf,
1440 end, list->aexpr_list[i]->len);
c906108c
SS
1441 count += 2 * list->aexpr_list[i]->len;
1442 }
1443
1444 if (count != 0)
1445 {
c5aa993b 1446 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
1447 ndx++;
1448 count = 0;
1449 end = temp_buf;
1450 }
1451 (*str_list)[ndx] = NULL;
1452
1453 if (ndx == 0)
27e06d3e 1454 {
6c761d9c 1455 xfree (str_list);
27e06d3e
MS
1456 return NULL;
1457 }
c906108c
SS
1458 else
1459 return *str_list;
1460}
1461
392a587b 1462static void
fba45db2 1463free_actions_list_cleanup_wrapper (void *al)
392a587b
JM
1464{
1465 free_actions_list (al);
1466}
1467
1468static void
fba45db2 1469free_actions_list (char **actions_list)
c906108c
SS
1470{
1471 int ndx;
1472
1473 if (actions_list == 0)
1474 return;
1475
1476 for (ndx = 0; actions_list[ndx]; ndx++)
b8c9b27d 1477 xfree (actions_list[ndx]);
c906108c 1478
b8c9b27d 1479 xfree (actions_list);
c906108c
SS
1480}
1481
d183932d 1482/* Render all actions into gdb protocol. */
c906108c 1483static void
fba45db2
KB
1484encode_actions (struct tracepoint *t, char ***tdp_actions,
1485 char ***stepping_actions)
c906108c 1486{
c5aa993b
JM
1487 static char tdp_buff[2048], step_buff[2048];
1488 char *action_exp;
1489 struct expression *exp = NULL;
c906108c 1490 struct action_line *action;
104c1213 1491 int i;
f976f6d4 1492 struct value *tempval;
c5aa993b 1493 struct collection_list *collect;
c906108c
SS
1494 struct cmd_list_element *cmd;
1495 struct agent_expr *aexpr;
39d4ef09
AC
1496 int frame_reg;
1497 LONGEST frame_offset;
c906108c
SS
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
c7bb205c
UW
1507 gdbarch_virtual_frame_pointer (current_gdbarch,
1508 t->address, &frame_reg, &frame_offset);
c906108c
SS
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;
104c1213 1514 while (isspace ((int) *action_exp))
c906108c
SS
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)
8a3fe4f8 1522 error (_("Bad action list item: %s"), action_exp);
c906108c 1523
bbaca940 1524 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
c906108c 1525 {
c5aa993b
JM
1526 do
1527 { /* repeat over a comma-separated list */
1528 QUIT; /* allow user to bail out with ^C */
104c1213 1529 while (isspace ((int) *action_exp))
c5aa993b 1530 action_exp++;
c906108c 1531
c5aa993b
JM
1532 if (0 == strncasecmp ("$reg", action_exp, 4))
1533 {
f57d151a 1534 for (i = 0; i < gdbarch_num_regs (current_gdbarch); i++)
c5aa993b
JM
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
75ac9d7b
MS
1563 exp = parse_exp_1 (&action_exp,
1564 block_for_pc (t->address), 1);
74b7792f 1565 old_chain = make_cleanup (free_current_contents, &exp);
c906108c 1566
c5aa993b
JM
1567 switch (exp->elts[0].opcode)
1568 {
1569 case OP_REGISTER:
67f3407f
DJ
1570 {
1571 const char *name = &exp->elts[2].string;
1572
029a67e4
UW
1573 i = user_reg_map_name_to_regnum (current_gdbarch,
1574 name, strlen (name));
67f3407f
DJ
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 }
c5aa993b
JM
1584
1585 case UNOP_MEMVAL:
1586 /* safe because we know it's a simple expression */
1587 tempval = evaluate_expression (exp);
df407dfe 1588 addr = VALUE_ADDRESS (tempval) + value_offset (tempval);
c5aa993b 1589 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
f50e79a4 1590 add_memrange (collect, memrange_absolute, addr, len);
c5aa993b
JM
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
f23d52e0 1603 old_chain1 = make_cleanup_free_agent_expr (aexpr);
c5aa993b
JM
1604
1605 ax_reqs (aexpr, &areqs);
1606 if (areqs.flaw != agent_flaw_none)
8a3fe4f8 1607 error (_("malformed expression"));
c5aa993b
JM
1608
1609 if (areqs.min_height < 0)
8a3fe4f8 1610 error (_("gdb: Internal error: expression has min height < 0"));
c5aa993b 1611 if (areqs.max_height > 20)
8a3fe4f8 1612 error (_("expression too complicated, try simplifying"));
c5aa993b
JM
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)
c906108c 1619 {
c5aa993b
JM
1620 int ndx1;
1621 int ndx2;
1622
1623 for (ndx1 = 0; ndx1 < areqs.reg_mask_len; ndx1++)
c906108c 1624 {
c5aa993b
JM
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 */
d183932d
MS
1632 add_register (collect,
1633 ndx1 * 8 + ndx2);
c5aa993b 1634 }
c906108c
SS
1635 }
1636 }
c5aa993b
JM
1637 break;
1638 } /* switch */
1639 do_cleanups (old_chain);
1640 } /* do */
1641 }
1642 while (action_exp && *action_exp++ == ',');
1643 } /* if */
bbaca940 1644 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
c906108c
SS
1645 {
1646 collect = &stepping_list;
1647 }
bbaca940 1648 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
c906108c
SS
1649 {
1650 if (collect == &stepping_list) /* end stepping actions */
1651 collect = &tracepoint_list;
1652 else
c5aa993b 1653 break; /* end tracepoint actions */
c906108c 1654 }
c5aa993b
JM
1655 } /* for */
1656 memrange_sortmerge (&tracepoint_list);
1657 memrange_sortmerge (&stepping_list);
c906108c 1658
d183932d
MS
1659 *tdp_actions = stringify_collection_list (&tracepoint_list,
1660 tdp_buff);
1661 *stepping_actions = stringify_collection_list (&stepping_list,
1662 step_buff);
c906108c
SS
1663}
1664
1665static void
fba45db2 1666add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
c906108c
SS
1667{
1668 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1669 {
1670 collect->aexpr_list =
1671 xrealloc (collect->aexpr_list,
c5aa993b 1672 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
c906108c
SS
1673 collect->aexpr_listsize *= 2;
1674 }
1675 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1676 collect->next_aexpr_elt++;
1677}
1678
6d820c5c
DJ
1679static char *target_buf;
1680static long target_buf_size;
c906108c
SS
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
1689static void
1690remote_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)
d183932d 1699 return; /* No information to give. */
c906108c
SS
1700
1701 strcpy (target_buf, "QTro");
1702 for (s = exec_bfd->sections; s; s = s->next)
1703 {
104c1213 1704 char tmp1[40], tmp2[40];
c906108c 1705
c5aa993b
JM
1706 if ((s->flags & SEC_LOAD) == 0 ||
1707 /* (s->flags & SEC_CODE) == 0 || */
c906108c
SS
1708 (s->flags & SEC_READONLY) == 0)
1709 continue;
1710
1711 anysecs = 1;
c5aa993b 1712 lma = s->lma;
2c500098 1713 size = bfd_get_section_size (s);
104c1213
JM
1714 sprintf_vma (tmp1, lma);
1715 sprintf_vma (tmp2, lma + size);
1716 sprintf (target_buf + strlen (target_buf),
1717 ":%s,%s", tmp1, tmp2);
c906108c
SS
1718 }
1719 if (anysecs)
1720 {
1721 putpkt (target_buf);
6d820c5c 1722 getpkt (&target_buf, &target_buf_size, 0);
c906108c
SS
1723 }
1724}
1725
1726/* tstart command:
c5aa993b 1727
c906108c
SS
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
1733static void
fba45db2 1734trace_start_command (char *args, int from_tty)
d183932d 1735{
c906108c
SS
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
d183932d 1743 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
c5aa993b 1744
c906108c
SS
1745 if (target_is_remote ())
1746 {
1747 putpkt ("QTinit");
6d820c5c 1748 remote_get_noisy_reply (&target_buf, &target_buf_size);
c906108c 1749 if (strcmp (target_buf, "OK"))
8a3fe4f8 1750 error (_("Target does not support this command."));
c906108c
SS
1751
1752 ALL_TRACEPOINTS (t)
c5aa993b 1753 {
104c1213 1754 char tmp[40];
c906108c 1755
104c1213 1756 sprintf_vma (tmp, t->address);
d183932d
MS
1757 sprintf (buf, "QTDP:%x:%s:%c:%lx:%x", t->number,
1758 tmp, /* address */
b5de0fa7 1759 t->enabled_p ? 'E' : 'D',
c5aa993b
JM
1760 t->step_count, t->pass_count);
1761
1762 if (t->actions)
1763 strcat (buf, "-");
1764 putpkt (buf);
6d820c5c 1765 remote_get_noisy_reply (&target_buf, &target_buf_size);
c5aa993b 1766 if (strcmp (target_buf, "OK"))
8a3fe4f8 1767 error (_("Target does not support tracepoints."));
c5aa993b
JM
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 */
104c1213
JM
1783 sprintf (buf, "QTDP:-%x:%s:%s%c",
1784 t->number, tmp, /* address */
c5aa993b
JM
1785 tdp_actions[ndx],
1786 ((tdp_actions[ndx + 1] || stepping_actions)
1787 ? '-' : 0));
1788 putpkt (buf);
6d820c5c
DJ
1789 remote_get_noisy_reply (&target_buf,
1790 &target_buf_size);
c5aa993b 1791 if (strcmp (target_buf, "OK"))
8a3fe4f8 1792 error (_("Error on target while setting tracepoints."));
c5aa993b
JM
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 */
104c1213
JM
1800 sprintf (buf, "QTDP:-%x:%s:%s%s%s",
1801 t->number, tmp, /* address */
c5aa993b
JM
1802 ((ndx == 0) ? "S" : ""),
1803 stepping_actions[ndx],
1804 (stepping_actions[ndx + 1] ? "-" : ""));
1805 putpkt (buf);
6d820c5c
DJ
1806 remote_get_noisy_reply (&target_buf,
1807 &target_buf_size);
c5aa993b 1808 if (strcmp (target_buf, "OK"))
8a3fe4f8 1809 error (_("Error on target while setting tracepoints."));
c5aa993b
JM
1810 }
1811 }
1812
1813 do_cleanups (old_chain);
1814 }
1815 }
d183932d 1816 /* Tell target to treat text-like sections as transparent. */
c906108c 1817 remote_set_transparent_ranges ();
d183932d 1818 /* Now insert traps and begin collecting data. */
c906108c 1819 putpkt ("QTStart");
6d820c5c 1820 remote_get_noisy_reply (&target_buf, &target_buf_size);
c906108c 1821 if (strcmp (target_buf, "OK"))
8a3fe4f8 1822 error (_("Bogus reply from target: %s"), target_buf);
d183932d 1823 set_traceframe_num (-1); /* All old traceframes invalidated. */
c906108c 1824 set_tracepoint_num (-1);
c5aa993b 1825 set_traceframe_context (-1);
c906108c 1826 trace_running_p = 1;
9a4105ab
AC
1827 if (deprecated_trace_start_stop_hook)
1828 deprecated_trace_start_stop_hook (1, from_tty);
c5aa993b 1829
c906108c
SS
1830 }
1831 else
8a3fe4f8 1832 error (_("Trace can only be run on remote targets."));
c906108c
SS
1833}
1834
1835/* tstop command */
1836static void
fba45db2 1837trace_stop_command (char *args, int from_tty)
d183932d 1838{
c906108c
SS
1839 if (target_is_remote ())
1840 {
1841 putpkt ("QTStop");
6d820c5c 1842 remote_get_noisy_reply (&target_buf, &target_buf_size);
c906108c 1843 if (strcmp (target_buf, "OK"))
8a3fe4f8 1844 error (_("Bogus reply from target: %s"), target_buf);
c906108c 1845 trace_running_p = 0;
9a4105ab
AC
1846 if (deprecated_trace_start_stop_hook)
1847 deprecated_trace_start_stop_hook (0, from_tty);
c906108c
SS
1848 }
1849 else
8a3fe4f8 1850 error (_("Trace can only be run on remote targets."));
c906108c
SS
1851}
1852
1853unsigned long trace_running_p;
1854
1855/* tstatus command */
1856static void
fba45db2 1857trace_status_command (char *args, int from_tty)
d183932d 1858{
c906108c
SS
1859 if (target_is_remote ())
1860 {
1861 putpkt ("qTStatus");
6d820c5c 1862 remote_get_noisy_reply (&target_buf, &target_buf_size);
c906108c
SS
1863
1864 if (target_buf[0] != 'T' ||
1865 (target_buf[1] != '0' && target_buf[1] != '1'))
8a3fe4f8 1866 error (_("Bogus reply from target: %s"), target_buf);
c906108c
SS
1867
1868 /* exported for use by the GUI */
1869 trace_running_p = (target_buf[1] == '1');
1870 }
1871 else
8a3fe4f8 1872 error (_("Trace can only be run on remote targets."));
c906108c
SS
1873}
1874
d183932d 1875/* Worker function for the various flavors of the tfind command. */
c906108c 1876static void
6d820c5c
DJ
1877finish_tfind_command (char **msg,
1878 long *sizeof_msg,
c2d11a7d 1879 int from_tty)
c906108c
SS
1880{
1881 int target_frameno = -1, target_tracept = -1;
1882 CORE_ADDR old_frame_addr;
1883 struct symbol *old_func;
1884 char *reply;
1885
c193f6ac 1886 old_frame_addr = get_frame_base (get_current_frame ());
c5aa993b 1887 old_func = find_pc_function (read_pc ());
c906108c 1888
6d820c5c 1889 putpkt (*msg);
c2d11a7d 1890 reply = remote_get_noisy_reply (msg, sizeof_msg);
c906108c
SS
1891
1892 while (reply && *reply)
c5aa993b
JM
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)
8a3fe4f8 1920 error (_("Target failed to find requested trace frame."));
c5aa993b
JM
1921 else
1922 {
1923 if (info_verbose)
1924 printf_filtered ("End of trace buffer.\n");
d183932d
MS
1925 /* The following will not recurse, since it's
1926 special-cased. */
c5aa993b 1927 trace_find_command ("-1", from_tty);
d183932d
MS
1928 reply = NULL; /* Break out of loop
1929 (avoid recursive nonsense). */
c5aa993b
JM
1930 }
1931 }
1932 break;
1933 case 'T':
1934 if ((target_tracept = (int) strtol (++reply, &reply, 16)) == -1)
8a3fe4f8 1935 error (_("Target failed to find requested trace frame."));
c5aa993b
JM
1936 break;
1937 case 'O': /* "OK"? */
1938 if (reply[1] == 'K' && reply[2] == '\0')
1939 reply += 2;
1940 else
8a3fe4f8 1941 error (_("Bogus reply from target: %s"), reply);
c5aa993b
JM
1942 break;
1943 default:
8a3fe4f8 1944 error (_("Bogus reply from target: %s"), reply);
c5aa993b 1945 }
c906108c 1946
35f196d9 1947 reinit_frame_cache ();
c906108c 1948 registers_changed ();
c906108c
SS
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 {
0faf0076 1958 enum print_what print_what;
c906108c
SS
1959
1960 /* NOTE: in immitation of the step command, try to determine
d183932d
MS
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.
c5aa993b 1965
d183932d
MS
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. */
c5aa993b
JM
1971
1972 if (old_func == find_pc_function (read_pc ()) &&
1973 (old_frame_addr == 0 ||
c193f6ac
AC
1974 get_frame_base (get_current_frame ()) == 0 ||
1975 old_frame_addr == get_frame_base (get_current_frame ())))
0faf0076 1976 print_what = SRC_LINE;
c906108c 1977 else
0faf0076 1978 print_what = SRC_AND_LOC;
c906108c 1979
b04f3ab4 1980 print_stack_frame (get_selected_frame (NULL), 1, print_what);
c906108c
SS
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:
c5aa993b
JM
1995 F<hexnum> (gives the selected frame number)
1996 T<hexnum> (gives the selected tracepoint number)
1997 */
c906108c
SS
1998
1999/* tfind command */
2000static void
fba45db2 2001trace_find_command (char *args, int from_tty)
d183932d 2002{ /* this should only be called with a numeric argument */
c906108c 2003 int frameno = -1;
c906108c
SS
2004
2005 if (target_is_remote ())
2006 {
9a4105ab
AC
2007 if (deprecated_trace_find_hook)
2008 deprecated_trace_find_hook (args, from_tty);
c5aa993b 2009
c906108c 2010 if (args == 0 || *args == 0)
d183932d 2011 { /* TFIND with no args means find NEXT trace frame. */
c906108c
SS
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)
8a3fe4f8 2020 error (_("not debugging trace buffer"));
c906108c 2021 else if (from_tty && traceframe_number == 0)
8a3fe4f8 2022 error (_("already at start of trace buffer"));
c906108c
SS
2023
2024 frameno = traceframe_number - 1;
2025 }
2026 else
bb518678 2027 frameno = parse_and_eval_long (args);
c906108c
SS
2028
2029 if (frameno < -1)
8a3fe4f8 2030 error (_("invalid input (%d is less than zero)"), frameno);
c906108c
SS
2031
2032 sprintf (target_buf, "QTFrame:%x", frameno);
6d820c5c 2033 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
c906108c
SS
2034 }
2035 else
8a3fe4f8 2036 error (_("Trace can only be run on remote targets."));
c906108c
SS
2037}
2038
2039/* tfind end */
2040static void
fba45db2 2041trace_find_end_command (char *args, int from_tty)
c906108c
SS
2042{
2043 trace_find_command ("-1", from_tty);
2044}
2045
2046/* tfind none */
2047static void
fba45db2 2048trace_find_none_command (char *args, int from_tty)
c906108c
SS
2049{
2050 trace_find_command ("-1", from_tty);
2051}
2052
2053/* tfind start */
2054static void
fba45db2 2055trace_find_start_command (char *args, int from_tty)
c906108c
SS
2056{
2057 trace_find_command ("0", from_tty);
2058}
2059
2060/* tfind pc command */
2061static void
fba45db2 2062trace_find_pc_command (char *args, int from_tty)
d183932d 2063{
c906108c 2064 CORE_ADDR pc;
104c1213 2065 char tmp[40];
c906108c
SS
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
104c1213
JM
2074 sprintf_vma (tmp, pc);
2075 sprintf (target_buf, "QTFrame:pc:%s", tmp);
6d820c5c 2076 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
c906108c
SS
2077 }
2078 else
8a3fe4f8 2079 error (_("Trace can only be run on remote targets."));
c906108c
SS
2080}
2081
2082/* tfind tracepoint command */
2083static void
fba45db2 2084trace_find_tracepoint_command (char *args, int from_tty)
d183932d 2085{
c906108c 2086 int tdp;
c906108c
SS
2087
2088 if (target_is_remote ())
2089 {
2090 if (args == 0 || *args == 0)
3db26b01
JB
2091 {
2092 if (tracepoint_number == -1)
8a3fe4f8 2093 error (_("No current tracepoint -- please supply an argument."));
3db26b01
JB
2094 else
2095 tdp = tracepoint_number; /* default is current TDP */
2096 }
c906108c 2097 else
0e828ed1 2098 tdp = parse_and_eval_long (args);
c906108c
SS
2099
2100 sprintf (target_buf, "QTFrame:tdp:%x", tdp);
6d820c5c 2101 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
c906108c
SS
2102 }
2103 else
8a3fe4f8 2104 error (_("Trace can only be run on remote targets."));
c906108c
SS
2105}
2106
2107/* TFIND LINE command:
c5aa993b 2108
c906108c 2109 This command will take a sourceline for argument, just like BREAK
d183932d 2110 or TRACE (ie. anything that "decode_line_1" can handle).
c5aa993b 2111
c906108c
SS
2112 With no argument, this command will find the next trace frame
2113 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2114
2115static void
fba45db2 2116trace_find_line_command (char *args, int from_tty)
d183932d 2117{
c906108c
SS
2118 static CORE_ADDR start_pc, end_pc;
2119 struct symtabs_and_lines sals;
2120 struct symtab_and_line sal;
c906108c 2121 struct cleanup *old_chain;
104c1213 2122 char startpc_str[40], endpc_str[40];
c906108c
SS
2123
2124 if (target_is_remote ())
2125 {
2126 if (args == 0 || *args == 0)
2127 {
bdd78e62 2128 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
c906108c
SS
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);
c5aa993b 2137 sal = sals.sals[0];
c906108c
SS
2138 }
2139
b8c9b27d 2140 old_chain = make_cleanup (xfree, sals.sals);
c906108c
SS
2141 if (sal.symtab == 0)
2142 {
2143 printf_filtered ("TFIND: No line number information available");
2144 if (sal.pc != 0)
2145 {
d183932d
MS
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. */
c906108c
SS
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");
d183932d 2157 return; /* No line, no PC; what can we do? */
c906108c
SS
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
8a3fe4f8 2179 error (_("Cannot find a good line."));
c906108c
SS
2180 }
2181 }
2182 else
2183 /* Is there any case in which we get here, and have an address
d183932d
MS
2184 which the user would want to see? If we have debugging
2185 symbols and no line numbers? */
8a3fe4f8 2186 error (_("Line number %d is out of range for \"%s\"."),
c906108c
SS
2187 sal.line, sal.symtab->filename);
2188
104c1213
JM
2189 sprintf_vma (startpc_str, start_pc);
2190 sprintf_vma (endpc_str, end_pc - 1);
d183932d
MS
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);
6d820c5c 2199 finish_tfind_command (&target_buf, &target_buf_size,
d183932d 2200 from_tty);
c906108c
SS
2201 do_cleanups (old_chain);
2202 }
2203 else
8a3fe4f8 2204 error (_("Trace can only be run on remote targets."));
c906108c
SS
2205}
2206
2207/* tfind range command */
2208static void
fba45db2 2209trace_find_range_command (char *args, int from_tty)
104c1213 2210{
c906108c 2211 static CORE_ADDR start, stop;
104c1213 2212 char start_str[40], stop_str[40];
c906108c
SS
2213 char *tmp;
2214
2215 if (target_is_remote ())
2216 {
2217 if (args == 0 || *args == 0)
d183932d 2218 { /* XXX FIXME: what should default behavior be? */
c906108c
SS
2219 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2220 return;
2221 }
2222
c5aa993b 2223 if (0 != (tmp = strchr (args, ',')))
c906108c
SS
2224 {
2225 *tmp++ = '\0'; /* terminate start address */
104c1213 2226 while (isspace ((int) *tmp))
c906108c
SS
2227 tmp++;
2228 start = parse_and_eval_address (args);
c5aa993b 2229 stop = parse_and_eval_address (tmp);
c906108c
SS
2230 }
2231 else
c5aa993b 2232 { /* no explicit end address? */
c906108c 2233 start = parse_and_eval_address (args);
c5aa993b 2234 stop = start + 1; /* ??? */
c906108c
SS
2235 }
2236
104c1213
JM
2237 sprintf_vma (start_str, start);
2238 sprintf_vma (stop_str, stop);
2239 sprintf (target_buf, "QTFrame:range:%s:%s", start_str, stop_str);
6d820c5c 2240 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
c906108c
SS
2241 }
2242 else
8a3fe4f8 2243 error (_("Trace can only be run on remote targets."));
c906108c
SS
2244}
2245
2246/* tfind outside command */
2247static void
fba45db2 2248trace_find_outside_command (char *args, int from_tty)
104c1213 2249{
c906108c 2250 CORE_ADDR start, stop;
104c1213 2251 char start_str[40], stop_str[40];
c906108c
SS
2252 char *tmp;
2253
2254 if (target_is_remote ())
2255 {
2256 if (args == 0 || *args == 0)
d183932d 2257 { /* XXX FIXME: what should default behavior be? */
c906108c
SS
2258 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2259 return;
2260 }
2261
c5aa993b 2262 if (0 != (tmp = strchr (args, ',')))
c906108c
SS
2263 {
2264 *tmp++ = '\0'; /* terminate start address */
104c1213 2265 while (isspace ((int) *tmp))
c906108c
SS
2266 tmp++;
2267 start = parse_and_eval_address (args);
c5aa993b 2268 stop = parse_and_eval_address (tmp);
c906108c
SS
2269 }
2270 else
c5aa993b 2271 { /* no explicit end address? */
c906108c 2272 start = parse_and_eval_address (args);
c5aa993b 2273 stop = start + 1; /* ??? */
c906108c
SS
2274 }
2275
104c1213
JM
2276 sprintf_vma (start_str, start);
2277 sprintf_vma (stop_str, stop);
2278 sprintf (target_buf, "QTFrame:outside:%s:%s", start_str, stop_str);
6d820c5c 2279 finish_tfind_command (&target_buf, &target_buf_size, from_tty);
c906108c
SS
2280 }
2281 else
8a3fe4f8 2282 error (_("Trace can only be run on remote targets."));
c906108c
SS
2283}
2284
2285/* save-tracepoints command */
2286static void
fba45db2 2287tracepoint_save_command (char *args, int from_tty)
c906108c 2288{
c5aa993b 2289 struct tracepoint *tp;
c906108c
SS
2290 struct action_line *line;
2291 FILE *fp;
2292 char *i1 = " ", *i2 = " ";
21c1c920 2293 char *indent, *actionline, *pathname;
104c1213 2294 char tmp[40];
c906108c
SS
2295
2296 if (args == 0 || *args == 0)
712e3020 2297 error (_("Argument required (file name in which to save tracepoints)"));
c906108c
SS
2298
2299 if (tracepoint_chain == 0)
2300 {
8a3fe4f8 2301 warning (_("save-tracepoints: no tracepoints to save."));
c906108c
SS
2302 return;
2303 }
2304
21c1c920
MS
2305 pathname = tilde_expand (args);
2306 if (!(fp = fopen (pathname, "w")))
8a3fe4f8 2307 error (_("Unable to open file '%s' for saving tracepoints (%s)"),
dc672865 2308 args, safe_strerror (errno));
21c1c920
MS
2309 xfree (pathname);
2310
c906108c 2311 ALL_TRACEPOINTS (tp)
c5aa993b
JM
2312 {
2313 if (tp->addr_string)
2314 fprintf (fp, "trace %s\n", tp->addr_string);
2315 else
104c1213
JM
2316 {
2317 sprintf_vma (tmp, tp->address);
2318 fprintf (fp, "trace *0x%s\n", tmp);
2319 }
c906108c 2320
c5aa993b
JM
2321 if (tp->pass_count)
2322 fprintf (fp, " passcount %d\n", tp->pass_count);
c906108c 2323
c5aa993b
JM
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;
c906108c 2331
c5aa993b
JM
2332 QUIT; /* allow user to bail out with ^C */
2333 actionline = line->action;
104c1213 2334 while (isspace ((int) *actionline))
c5aa993b 2335 actionline++;
c906108c 2336
c5aa993b
JM
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)
8a3fe4f8 2342 error (_("Bad action list item: %s"), actionline);
bbaca940 2343 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
c5aa993b 2344 indent = i2;
bbaca940 2345 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
c5aa993b
JM
2346 indent = i1;
2347 }
2348 }
2349 }
2350 }
c906108c
SS
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. */
2358static void
fba45db2 2359scope_info (char *args, int from_tty)
c906108c 2360{
c906108c
SS
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;
de4f826b
DC
2366 struct dict_iterator iter;
2367 int j, count = 0;
c906108c
SS
2368
2369 if (args == 0 || *args == 0)
8a3fe4f8 2370 error (_("requires an argument (function, line or *addr) to define a scope"));
c906108c 2371
68219205 2372 sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
c906108c 2373 if (sals.nelts == 0)
450bd37b 2374 return; /* presumably decode_line_1 has already warned */
c906108c
SS
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 {
c5aa993b 2382 QUIT; /* allow user to bail out with ^C */
de4f826b 2383 ALL_BLOCK_SYMBOLS (block, iter, sym)
c906108c 2384 {
c5aa993b 2385 QUIT; /* allow user to bail out with ^C */
c906108c
SS
2386 if (count == 0)
2387 printf_filtered ("Scope for %s:\n", save_args);
2388 count++;
e88c90f2 2389
3567439c 2390 symname = SYMBOL_PRINT_NAME (sym);
c906108c 2391 if (symname == NULL || *symname == '\0')
c5aa993b 2392 continue; /* probably botched, certainly useless */
c906108c
SS
2393
2394 printf_filtered ("Symbol %s is ", symname);
c5aa993b
JM
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:
104c1213 2404 printf_filtered ("a constant with value %ld (0x%lx)",
c5aa993b
JM
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 ");
ed49a04f 2416 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2417 break;
2418 case LOC_REGISTER:
2a2d4dc3
AS
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
c9f4d572 2426 (current_gdbarch, SYMBOL_VALUE (sym)));
c5aa993b
JM
2427 break;
2428 case LOC_ARG:
c5aa993b
JM
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;
c5aa993b
JM
2440 case LOC_REGPARM_ADDR:
2441 printf_filtered ("the address of an argument, in register $%s",
c9f4d572
UW
2442 gdbarch_register_name
2443 (current_gdbarch, SYMBOL_VALUE (sym)));
c5aa993b
JM
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 ");
ed49a04f 2450 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2451 break;
2452 case LOC_BLOCK:
2453 printf_filtered ("a function at address ");
ed49a04f 2454 printf_filtered ("%s", paddress (BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
c5aa993b 2455 break;
c5aa993b 2456 case LOC_UNRESOLVED:
3567439c 2457 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
450bd37b 2458 NULL, NULL);
c5aa993b
JM
2459 if (msym == NULL)
2460 printf_filtered ("Unresolved Static");
2461 else
2462 {
2463 printf_filtered ("static storage at address ");
ed49a04f 2464 printf_filtered ("%s", paddress (SYMBOL_VALUE_ADDRESS (msym)));
c5aa993b
JM
2465 }
2466 break;
2467 case LOC_OPTIMIZED_OUT:
2468 printf_filtered ("optimized out.\n");
2469 continue;
450bd37b 2470 case LOC_COMPUTED:
450bd37b
MS
2471 SYMBOL_OPS (sym)->describe_location (sym, gdb_stdout);
2472 break;
c5aa993b 2473 }
c906108c 2474 if (SYMBOL_TYPE (sym))
c5aa993b 2475 printf_filtered (", length %d.\n",
450bd37b 2476 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
c906108c
SS
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) */
2489static void
710b33bd 2490replace_comma (void *data)
c906108c 2491{
710b33bd 2492 char *comma = data;
c906108c
SS
2493 *comma = ',';
2494}
2495
2496/* tdump command */
2497static void
fba45db2 2498trace_dump_command (char *args, int from_tty)
c906108c 2499{
515630c5
UW
2500 struct regcache *regcache;
2501 struct gdbarch *gdbarch;
c5aa993b 2502 struct tracepoint *t;
c906108c 2503 struct action_line *action;
c5aa993b
JM
2504 char *action_exp, *next_comma;
2505 struct cleanup *old_cleanups;
2506 int stepping_actions = 0;
2507 int stepping_frame = 0;
c906108c
SS
2508
2509 if (!target_is_remote ())
2510 {
8a3fe4f8 2511 error (_("Trace can only be run on remote targets."));
c906108c
SS
2512 return;
2513 }
2514
2515 if (tracepoint_number == -1)
2516 {
8a3fe4f8 2517 warning (_("No current trace frame."));
c906108c
SS
2518 return;
2519 }
2520
2521 ALL_TRACEPOINTS (t)
2522 if (t->number == tracepoint_number)
c5aa993b 2523 break;
c906108c
SS
2524
2525 if (t == NULL)
8a3fe4f8 2526 error (_("No known tracepoint matches 'current' tracepoint #%d."),
c906108c
SS
2527 tracepoint_number);
2528
2529 old_cleanups = make_cleanup (null_cleanup, NULL);
2530
c5aa993b 2531 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
c906108c
SS
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
515630c5
UW
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)));
c906108c
SS
2543
2544 for (action = t->actions; action; action = action->next)
2545 {
2546 struct cmd_list_element *cmd;
2547
c5aa993b 2548 QUIT; /* allow user to bail out with ^C */
c906108c 2549 action_exp = action->action;
104c1213 2550 while (isspace ((int) *action_exp))
c906108c
SS
2551 action_exp++;
2552
2553 /* The collection actions to be done while stepping are
c5aa993b 2554 bracketed by the commands "while-stepping" and "end". */
c906108c
SS
2555
2556 if (*action_exp == '#') /* comment line */
2557 continue;
2558
2559 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2560 if (cmd == 0)
8a3fe4f8 2561 error (_("Bad action list item: %s"), action_exp);
c906108c 2562
bbaca940 2563 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
c906108c 2564 stepping_actions = 1;
bbaca940 2565 else if (cmd_cfunc_eq (cmd, end_actions_pseudocommand))
c906108c 2566 stepping_actions = 0;
bbaca940 2567 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
c906108c
SS
2568 {
2569 /* Display the collected data.
d183932d
MS
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. */
c906108c
SS
2575 if (stepping_frame == stepping_actions)
2576 {
c5aa993b
JM
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++;
104c1213 2582 while (isspace ((int) *action_exp))
c5aa993b
JM
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 == ',');
c906108c
SS
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
c5aa993b 2620static const char hexchars[] = "0123456789abcdef";
c906108c 2621
47b667de
AC
2622static char *
2623mem2hex (gdb_byte *mem, char *buf, int count)
c906108c 2624{
47b667de 2625 gdb_byte ch;
c906108c
SS
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
c5aa993b 2640int
fba45db2 2641get_traceframe_number (void)
c906108c 2642{
c5aa993b 2643 return traceframe_number;
c906108c
SS
2644}
2645
2646
2647/* module initialization */
2648void
fba45db2 2649_initialize_tracepoint (void)
c906108c 2650{
fa58ee11
EZ
2651 struct cmd_list_element *c;
2652
c5aa993b
JM
2653 tracepoint_chain = 0;
2654 tracepoint_count = 0;
c906108c
SS
2655 traceframe_number = -1;
2656 tracepoint_number = -1;
2657
c906108c
SS
2658 if (tracepoint_list.list == NULL)
2659 {
2660 tracepoint_list.listsize = 128;
c5aa993b 2661 tracepoint_list.list = xmalloc
c906108c
SS
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;
c5aa993b 2674 stepping_list.list = xmalloc
c906108c
SS
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
c5aa993b 2685 add_info ("scope", scope_info,
1bedd215 2686 _("List the variables local to a scope"));
c906108c 2687
e00d1dc8 2688 add_cmd ("tracepoints", class_trace, NULL,
1a966eab 2689 _("Tracing of program execution without stopping the program."),
c906108c
SS
2690 &cmdlist);
2691
1bedd215
AC
2692 add_info ("tracepoints", tracepoints_info, _("\
2693Status of tracepoints, or tracepoint number NUMBER.\n\
c906108c 2694Convenience variable \"$tpnum\" contains the number of the\n\
1bedd215 2695last tracepoint set."));
c906108c
SS
2696
2697 add_info_alias ("tp", "tracepoints", 1);
2698
1bedd215
AC
2699 c = add_com ("save-tracepoints", class_trace, tracepoint_save_command, _("\
2700Save current tracepoint definitions as a script.\n\
2701Use the 'source' command in another debug session to restore them."));
5ba2abeb 2702 set_cmd_completer (c, filename_completer);
c906108c 2703
c5aa993b 2704 add_com ("tdump", class_trace, trace_dump_command,
1bedd215 2705 _("Print everything collected at the current tracepoint."));
c906108c 2706
1bedd215
AC
2707 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
2708Select a trace frame;\n\
2709No argument means forward by one frame; '-' means backward by one frame."),
c906108c
SS
2710 &tfindlist, "tfind ", 1, &cmdlist);
2711
1a966eab
AC
2712 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
2713Select a trace frame whose PC is outside the given range.\n\
2714Usage: tfind outside addr1, addr2"),
c906108c
SS
2715 &tfindlist);
2716
1a966eab
AC
2717 add_cmd ("range", class_trace, trace_find_range_command, _("\
2718Select a trace frame whose PC is in the given range.\n\
2719Usage: tfind range addr1,addr2"),
c906108c
SS
2720 &tfindlist);
2721
1a966eab
AC
2722 add_cmd ("line", class_trace, trace_find_line_command, _("\
2723Select a trace frame by source line.\n\
c906108c
SS
2724Argument can be a line number (with optional source file), \n\
2725a function name, or '*' followed by an address.\n\
1a966eab 2726Default argument is 'the next source line that was traced'."),
c906108c
SS
2727 &tfindlist);
2728
1a966eab
AC
2729 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
2730Select a trace frame by tracepoint number.\n\
2731Default is the tracepoint for the current trace frame."),
c906108c
SS
2732 &tfindlist);
2733
1a966eab
AC
2734 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
2735Select a trace frame by PC.\n\
2736Default is the current PC, or the PC of the current trace frame."),
c906108c
SS
2737 &tfindlist);
2738
1a966eab
AC
2739 add_cmd ("end", class_trace, trace_find_end_command, _("\
2740Synonym for 'none'.\n\
2741De-select any trace frame and resume 'live' debugging."),
c906108c
SS
2742 &tfindlist);
2743
2744 add_cmd ("none", class_trace, trace_find_none_command,
1a966eab 2745 _("De-select any trace frame and resume 'live' debugging."),
c906108c
SS
2746 &tfindlist);
2747
2748 add_cmd ("start", class_trace, trace_find_start_command,
1a966eab 2749 _("Select the first trace frame in the trace buffer."),
c906108c
SS
2750 &tfindlist);
2751
c5aa993b 2752 add_com ("tstatus", class_trace, trace_status_command,
1bedd215 2753 _("Display the status of the current trace data collection."));
c906108c 2754
c5aa993b 2755 add_com ("tstop", class_trace, trace_stop_command,
1bedd215 2756 _("Stop trace data collection."));
c906108c
SS
2757
2758 add_com ("tstart", class_trace, trace_start_command,
1bedd215 2759 _("Start trace data collection."));
c906108c 2760
1bedd215
AC
2761 add_com ("passcount", class_trace, trace_pass_command, _("\
2762Set the passcount for a tracepoint.\n\
c906108c
SS
2763The trace will end when the tracepoint has been passed 'count' times.\n\
2764Usage: passcount COUNT TPNUM, where TPNUM may also be \"all\";\n\
1bedd215 2765if TPNUM is omitted, passcount refers to the last tracepoint defined."));
c906108c 2766
1bedd215
AC
2767 add_com ("end", class_trace, end_actions_pseudocommand, _("\
2768Ends a list of commands or actions.\n\
c906108c
SS
2769Several GDB commands allow you to enter a list of commands or actions.\n\
2770Entering \"end\" on a line by itself is the normal way to terminate\n\
2771such a list.\n\n\
1bedd215 2772Note: the \"end\" command cannot be used at the gdb prompt."));
c906108c 2773
1bedd215
AC
2774 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
2775Specify single-stepping behavior at a tracepoint.\n\
c906108c
SS
2776Argument is number of instructions to trace in single-step mode\n\
2777following the tracepoint. This command is normally followed by\n\
2778one or more \"collect\" commands, to specify what to collect\n\
2779while single-stepping.\n\n\
1bedd215 2780Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 2781
c5aa993b
JM
2782 add_com_alias ("ws", "while-stepping", class_alias, 0);
2783 add_com_alias ("stepping", "while-stepping", class_alias, 0);
c906108c 2784
1bedd215
AC
2785 add_com ("collect", class_trace, collect_pseudocommand, _("\
2786Specify one or more data items to be collected at a tracepoint.\n\
c906108c
SS
2787Accepts a comma-separated list of (one or more) expressions. GDB will\n\
2788collect all data (variables, registers) referenced by that expression.\n\
2789Also 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\
1bedd215 2793Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 2794
1bedd215
AC
2795 add_com ("actions", class_trace, trace_actions_command, _("\
2796Specify the actions to be taken at a tracepoint.\n\
c906108c
SS
2797Tracepoint actions may include collecting of specified data, \n\
2798single-stepping, or enabling/disabling other tracepoints, \n\
1bedd215 2799depending on target's capabilities."));
c906108c 2800
1a966eab
AC
2801 add_cmd ("tracepoints", class_trace, delete_trace_command, _("\
2802Delete specified tracepoints.\n\
c906108c 2803Arguments are tracepoint numbers, separated by spaces.\n\
1a966eab 2804No argument means delete all tracepoints."),
c906108c
SS
2805 &deletelist);
2806
1a966eab
AC
2807 add_cmd ("tracepoints", class_trace, disable_trace_command, _("\
2808Disable specified tracepoints.\n\
c906108c 2809Arguments are tracepoint numbers, separated by spaces.\n\
1a966eab 2810No argument means disable all tracepoints."),
c906108c
SS
2811 &disablelist);
2812
1a966eab
AC
2813 add_cmd ("tracepoints", class_trace, enable_trace_command, _("\
2814Enable specified tracepoints.\n\
c906108c 2815Arguments are tracepoint numbers, separated by spaces.\n\
1a966eab 2816No argument means enable all tracepoints."),
c906108c
SS
2817 &enablelist);
2818
1bedd215
AC
2819 c = add_com ("trace", class_trace, trace_command, _("\
2820Set a tracepoint at a specified line or function or address.\n\
c906108c
SS
2821Argument may be a line number, function name, or '*' plus an address.\n\
2822For a line number or function, trace at the start of its code.\n\
2823If an address is specified, trace at that exact address.\n\n\
1bedd215 2824Do \"help tracepoints\" for info on other tracepoint commands."));
5ba2abeb 2825 set_cmd_completer (c, location_completer);
c906108c 2826
c5aa993b
JM
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);
c906108c 2830 add_com_alias ("trac", "trace", class_alias, 1);
6d820c5c
DJ
2831
2832 target_buf_size = 2048;
2833 target_buf = xmalloc (target_buf_size);
c906108c 2834}
This page took 1.142222 seconds and 4 git commands to generate.