OSDN Git Service

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