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