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