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