gdb/testsuite/
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
CommitLineData
c906108c 1/* Tracing functionality for remote targets in custom GDB protocol
9f60d481 2
6aba47ca 3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
7b6bb8da 4 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
5af949e3 22#include "arch-utils.h"
c906108c
SS
23#include "symtab.h"
24#include "frame.h"
c906108c
SS
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"
104c1213 32#include "inferior.h"
1042e4c0 33#include "breakpoint.h"
104c1213 34#include "tracepoint.h"
c5f0f3d0 35#include "linespec.h"
4e052eda 36#include "regcache.h"
c94fdfd0 37#include "completer.h"
fe898f56 38#include "block.h"
de4f826b 39#include "dictionary.h"
383f836e 40#include "observer.h"
029a67e4 41#include "user-regs.h"
79a45b7d 42#include "valprint.h"
41575630 43#include "gdbcore.h"
768a979c 44#include "objfiles.h"
35b1e5cc 45#include "filenames.h"
00bf0b85 46#include "gdbthread.h"
2c58c0a9 47#include "stack.h"
fce3c1f0 48#include "gdbcore.h"
176a6961 49#include "remote.h"
0fb4aa4b 50#include "source.h"
c906108c
SS
51#include "ax.h"
52#include "ax-gdb.h"
2a7498d8 53#include "memrange.h"
c906108c
SS
54
55/* readline include files */
dbda9972
AC
56#include "readline/readline.h"
57#include "readline/history.h"
c906108c
SS
58
59/* readline defines this. */
60#undef savestring
61
62#ifdef HAVE_UNISTD_H
63#include <unistd.h>
64#endif
65
00bf0b85
SS
66#ifndef O_LARGEFILE
67#define O_LARGEFILE 0
68#endif
69
70extern int hex2bin (const char *hex, gdb_byte *bin, int count);
71extern int bin2hex (const gdb_byte *bin, char *hex, int count);
72
d5551862
SS
73extern void stop_tracing ();
74
d183932d
MS
75/* Maximum length of an agent aexpression.
76 This accounts for the fact that packets are limited to 400 bytes
c906108c
SS
77 (which includes everything -- including the checksum), and assumes
78 the worst case of maximum length for each of the pieces of a
79 continuation packet.
c5aa993b 80
c906108c
SS
81 NOTE: expressions get mem2hex'ed otherwise this would be twice as
82 large. (400 - 31)/2 == 184 */
83#define MAX_AGENT_EXPR_LEN 184
84
98c5b216
TT
85/* A hook used to notify the UI of tracepoint operations. */
86
87void (*deprecated_trace_find_hook) (char *arg, int from_tty);
88void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
c906108c 89
9a4105ab
AC
90extern void (*deprecated_readline_begin_hook) (char *, ...);
91extern char *(*deprecated_readline_hook) (char *);
92extern void (*deprecated_readline_end_hook) (void);
c906108c 93
104c1213
JM
94/* GDB commands implemented in other modules:
95 */
96
a14ed312 97extern void output_command (char *, int);
104c1213 98
c906108c
SS
99/*
100 Tracepoint.c:
101
102 This module defines the following debugger commands:
103 trace : set a tracepoint on a function, line, or address.
104 info trace : list all debugger-defined tracepoints.
105 delete trace : delete one or more tracepoints.
106 enable trace : enable one or more tracepoints.
107 disable trace : disable one or more tracepoints.
108 actions : specify actions to be taken at a tracepoint.
109 passcount : specify a pass count for a tracepoint.
110 tstart : start a trace experiment.
111 tstop : stop a trace experiment.
112 tstatus : query the status of a trace experiment.
113 tfind : find a trace frame in the trace buffer.
114 tdump : print everything collected at the current tracepoint.
115 save-tracepoints : write tracepoint setup into a file.
116
117 This module defines the following user-visible debugger variables:
118 $trace_frame : sequence number of trace frame currently being debugged.
119 $trace_line : source line of trace frame currently being debugged.
120 $trace_file : source file of trace frame currently being debugged.
121 $tracepoint : tracepoint number of trace frame currently being debugged.
c5aa993b 122 */
c906108c
SS
123
124
125/* ======= Important global variables: ======= */
126
f61e138d
SS
127/* The list of all trace state variables. We don't retain pointers to
128 any of these for any reason - API is by name or number only - so it
129 works to have a vector of objects. */
130
131typedef struct trace_state_variable tsv_s;
132DEF_VEC_O(tsv_s);
133
b3b9301e
PA
134/* An object describing the contents of a traceframe. */
135
136struct traceframe_info
137{
138 /* Collected memory. */
139 VEC(mem_range_s) *memory;
140};
141
f61e138d
SS
142static VEC(tsv_s) *tvariables;
143
144/* The next integer to assign to a variable. */
145
146static int next_tsv_number = 1;
147
c906108c
SS
148/* Number of last traceframe collected. */
149static int traceframe_number;
150
151/* Tracepoint for last traceframe collected. */
152static int tracepoint_number;
153
c378eb4e 154/* Symbol for function for last traceframe collected. */
c906108c
SS
155static struct symbol *traceframe_fun;
156
c378eb4e 157/* Symtab and line for last traceframe collected. */
c906108c
SS
158static struct symtab_and_line traceframe_sal;
159
b3b9301e
PA
160/* The traceframe info of the current traceframe. NULL if we haven't
161 yet attempted to fetch it, or if the target does not support
162 fetching this object, or if we're not inspecting a traceframe
163 presently. */
164static struct traceframe_info *traceframe_info;
165
c378eb4e 166/* Tracing command lists. */
c906108c
SS
167static struct cmd_list_element *tfindlist;
168
236f1d4d 169/* List of expressions to collect by default at each tracepoint hit. */
35b1e5cc 170char *default_collect = "";
236f1d4d 171
d5551862
SS
172static int disconnected_tracing;
173
4daf5ac0
SS
174/* This variable controls whether we ask the target for a linear or
175 circular trace buffer. */
176
177static int circular_trace_buffer;
178
c906108c 179/* ======= Important command functions: ======= */
a14ed312
KB
180static void trace_actions_command (char *, int);
181static void trace_start_command (char *, int);
182static void trace_stop_command (char *, int);
183static void trace_status_command (char *, int);
184static void trace_find_command (char *, int);
185static void trace_find_pc_command (char *, int);
186static void trace_find_tracepoint_command (char *, int);
187static void trace_find_line_command (char *, int);
188static void trace_find_range_command (char *, int);
189static void trace_find_outside_command (char *, int);
a14ed312 190static void trace_dump_command (char *, int);
c906108c
SS
191
192/* support routines */
c906108c
SS
193
194struct collection_list;
a14ed312 195static void add_aexpr (struct collection_list *, struct agent_expr *);
47b667de 196static char *mem2hex (gdb_byte *, char *, int);
a14ed312
KB
197static void add_register (struct collection_list *collection,
198 unsigned int regno);
392a587b 199
d5551862
SS
200extern void send_disconnected_tracing_value (int value);
201
00bf0b85
SS
202static void free_uploaded_tps (struct uploaded_tp **utpp);
203static void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
204
205
a14ed312 206extern void _initialize_tracepoint (void);
c906108c 207
00bf0b85
SS
208static struct trace_status trace_status;
209
210char *stop_reason_names[] = {
211 "tunknown",
212 "tnotrun",
213 "tstop",
214 "tfull",
215 "tdisconnected",
6c28cbf2
SS
216 "tpasscount",
217 "terror"
00bf0b85
SS
218};
219
220struct trace_status *
221current_trace_status ()
222{
223 return &trace_status;
224}
225
b3b9301e
PA
226/* Destroy INFO. */
227
228static void
229free_traceframe_info (struct traceframe_info *info)
230{
231 if (info != NULL)
232 {
233 VEC_free (mem_range_s, info->memory);
234
235 xfree (info);
236 }
237}
238
239/* Free and and clear the traceframe info cache of the current
240 traceframe. */
241
242static void
243clear_traceframe_info (void)
244{
245 free_traceframe_info (traceframe_info);
246 traceframe_info = NULL;
247}
248
c906108c
SS
249/* Set traceframe number to NUM. */
250static void
fba45db2 251set_traceframe_num (int num)
c906108c
SS
252{
253 traceframe_number = num;
4fa62494 254 set_internalvar_integer (lookup_internalvar ("trace_frame"), num);
c906108c
SS
255}
256
257/* Set tracepoint number to NUM. */
258static void
fba45db2 259set_tracepoint_num (int num)
c906108c
SS
260{
261 tracepoint_number = num;
4fa62494 262 set_internalvar_integer (lookup_internalvar ("tracepoint"), num);
c906108c
SS
263}
264
265/* Set externally visible debug variables for querying/printing
c378eb4e 266 the traceframe context (line, function, file). */
c906108c
SS
267
268static void
fb14de7b 269set_traceframe_context (struct frame_info *trace_frame)
c906108c 270{
fb14de7b
UW
271 CORE_ADDR trace_pc;
272
3e43a32a 273 if (trace_frame == NULL) /* Cease debugging any trace buffers. */
c906108c
SS
274 {
275 traceframe_fun = 0;
276 traceframe_sal.pc = traceframe_sal.line = 0;
277 traceframe_sal.symtab = NULL;
4fa62494
UW
278 clear_internalvar (lookup_internalvar ("trace_func"));
279 clear_internalvar (lookup_internalvar ("trace_file"));
280 set_internalvar_integer (lookup_internalvar ("trace_line"), -1);
c906108c
SS
281 return;
282 }
283
d183932d 284 /* Save as globals for internal use. */
fb14de7b 285 trace_pc = get_frame_pc (trace_frame);
c906108c
SS
286 traceframe_sal = find_pc_line (trace_pc, 0);
287 traceframe_fun = find_pc_function (trace_pc);
288
d183932d
MS
289 /* Save linenumber as "$trace_line", a debugger variable visible to
290 users. */
4fa62494
UW
291 set_internalvar_integer (lookup_internalvar ("trace_line"),
292 traceframe_sal.line);
c906108c 293
d183932d
MS
294 /* Save func name as "$trace_func", a debugger variable visible to
295 users. */
4fa62494
UW
296 if (traceframe_fun == NULL
297 || SYMBOL_LINKAGE_NAME (traceframe_fun) == NULL)
298 clear_internalvar (lookup_internalvar ("trace_func"));
c906108c 299 else
78267919
UW
300 set_internalvar_string (lookup_internalvar ("trace_func"),
301 SYMBOL_LINKAGE_NAME (traceframe_fun));
c906108c 302
d183932d
MS
303 /* Save file name as "$trace_file", a debugger variable visible to
304 users. */
4fa62494
UW
305 if (traceframe_sal.symtab == NULL
306 || traceframe_sal.symtab->filename == NULL)
307 clear_internalvar (lookup_internalvar ("trace_file"));
c906108c 308 else
78267919
UW
309 set_internalvar_string (lookup_internalvar ("trace_file"),
310 traceframe_sal.symtab->filename);
c906108c
SS
311}
312
f61e138d
SS
313/* Create a new trace state variable with the given name. */
314
315struct trace_state_variable *
316create_trace_state_variable (const char *name)
317{
318 struct trace_state_variable tsv;
319
320 memset (&tsv, 0, sizeof (tsv));
40e1c229 321 tsv.name = xstrdup (name);
f61e138d
SS
322 tsv.number = next_tsv_number++;
323 return VEC_safe_push (tsv_s, tvariables, &tsv);
324}
325
326/* Look for a trace state variable of the given name. */
327
328struct trace_state_variable *
329find_trace_state_variable (const char *name)
330{
331 struct trace_state_variable *tsv;
332 int ix;
333
334 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
335 if (strcmp (name, tsv->name) == 0)
336 return tsv;
337
338 return NULL;
339}
340
341void
342delete_trace_state_variable (const char *name)
343{
344 struct trace_state_variable *tsv;
345 int ix;
346
347 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
348 if (strcmp (name, tsv->name) == 0)
349 {
40e1c229 350 xfree ((void *)tsv->name);
f61e138d
SS
351 VEC_unordered_remove (tsv_s, tvariables, ix);
352 return;
353 }
354
355 warning (_("No trace variable named \"$%s\", not deleting"), name);
356}
357
358/* The 'tvariable' command collects a name and optional expression to
359 evaluate into an initial value. */
360
361void
362trace_variable_command (char *args, int from_tty)
363{
364 struct expression *expr;
365 struct cleanup *old_chain;
366 struct internalvar *intvar = NULL;
367 LONGEST initval = 0;
368 struct trace_state_variable *tsv;
369
370 if (!args || !*args)
371 error_no_arg (_("trace state variable name"));
372
373 /* All the possible valid arguments are expressions. */
374 expr = parse_expression (args);
375 old_chain = make_cleanup (free_current_contents, &expr);
376
377 if (expr->nelts == 0)
378 error (_("No expression?"));
379
380 /* Only allow two syntaxes; "$name" and "$name=value". */
381 if (expr->elts[0].opcode == OP_INTERNALVAR)
382 {
383 intvar = expr->elts[1].internalvar;
384 }
385 else if (expr->elts[0].opcode == BINOP_ASSIGN
386 && expr->elts[1].opcode == OP_INTERNALVAR)
387 {
388 intvar = expr->elts[2].internalvar;
389 initval = value_as_long (evaluate_subexpression_type (expr, 4));
390 }
391 else
392 error (_("Syntax must be $NAME [ = EXPR ]"));
393
394 if (!intvar)
395 error (_("No name given"));
396
397 if (strlen (internalvar_name (intvar)) <= 0)
398 error (_("Must supply a non-empty variable name"));
399
400 /* If the variable already exists, just change its initial value. */
401 tsv = find_trace_state_variable (internalvar_name (intvar));
402 if (tsv)
403 {
404 tsv->initial_value = initval;
3e43a32a
MS
405 printf_filtered (_("Trace state variable $%s "
406 "now has initial value %s.\n"),
f61e138d 407 tsv->name, plongest (tsv->initial_value));
f90824dc 408 do_cleanups (old_chain);
f61e138d
SS
409 return;
410 }
411
412 /* Create a new variable. */
413 tsv = create_trace_state_variable (internalvar_name (intvar));
414 tsv->initial_value = initval;
415
3e43a32a
MS
416 printf_filtered (_("Trace state variable $%s "
417 "created, with initial value %s.\n"),
f61e138d
SS
418 tsv->name, plongest (tsv->initial_value));
419
420 do_cleanups (old_chain);
421}
422
423void
424delete_trace_variable_command (char *args, int from_tty)
425{
2a2287c7 426 int ix;
f61e138d
SS
427 char **argv;
428 struct cleanup *back_to;
f61e138d
SS
429
430 if (args == NULL)
431 {
432 if (query (_("Delete all trace state variables? ")))
433 VEC_free (tsv_s, tvariables);
434 dont_repeat ();
435 return;
436 }
437
438 argv = gdb_buildargv (args);
439 back_to = make_cleanup_freeargv (argv);
440
2a2287c7 441 for (ix = 0; argv[ix] != NULL; ix++)
f61e138d 442 {
2a2287c7
MS
443 if (*argv[ix] == '$')
444 delete_trace_state_variable (argv[ix] + 1);
f61e138d 445 else
2a2287c7 446 warning (_("Name \"%s\" not prefixed with '$', ignoring"), argv[ix]);
f61e138d
SS
447 }
448
449 do_cleanups (back_to);
450
451 dont_repeat ();
452}
453
40e1c229
VP
454void
455tvariables_info_1 (void)
f61e138d
SS
456{
457 struct trace_state_variable *tsv;
458 int ix;
40e1c229
VP
459 int count = 0;
460 struct cleanup *back_to;
f61e138d 461
40e1c229 462 if (VEC_length (tsv_s, tvariables) == 0 && !ui_out_is_mi_like_p (uiout))
f61e138d
SS
463 {
464 printf_filtered (_("No trace state variables.\n"));
465 return;
466 }
467
35b1e5cc 468 /* Try to acquire values from the target. */
4baf5cf4 469 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix, ++count)
35b1e5cc
SS
470 tsv->value_known = target_get_trace_state_variable_value (tsv->number,
471 &(tsv->value));
472
40e1c229
VP
473 back_to = make_cleanup_ui_out_table_begin_end (uiout, 3,
474 count, "trace-variables");
475 ui_out_table_header (uiout, 15, ui_left, "name", "Name");
476 ui_out_table_header (uiout, 11, ui_left, "initial", "Initial");
477 ui_out_table_header (uiout, 11, ui_left, "current", "Current");
478
479 ui_out_table_body (uiout);
f61e138d
SS
480
481 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
482 {
40e1c229
VP
483 struct cleanup *back_to2;
484 char *c;
485 char *name;
486
487 back_to2 = make_cleanup_ui_out_tuple_begin_end (uiout, "variable");
488
c4f7c687 489 name = concat ("$", tsv->name, (char *) NULL);
40e1c229
VP
490 make_cleanup (xfree, name);
491 ui_out_field_string (uiout, "name", name);
492 ui_out_field_string (uiout, "initial", plongest (tsv->initial_value));
493
f61e138d 494 if (tsv->value_known)
40e1c229
VP
495 c = plongest (tsv->value);
496 else if (ui_out_is_mi_like_p (uiout))
497 /* For MI, we prefer not to use magic string constants, but rather
498 omit the field completely. The difference between unknown and
499 undefined does not seem important enough to represent. */
500 c = NULL;
00bf0b85 501 else if (current_trace_status ()->running || traceframe_number >= 0)
f61e138d 502 /* The value is/was defined, but we don't have it. */
40e1c229 503 c = "<unknown>";
f61e138d
SS
504 else
505 /* It is not meaningful to ask about the value. */
40e1c229
VP
506 c = "<undefined>";
507 if (c)
508 ui_out_field_string (uiout, "current", c);
509 ui_out_text (uiout, "\n");
510
511 do_cleanups (back_to2);
f61e138d 512 }
40e1c229
VP
513
514 do_cleanups (back_to);
515}
516
517/* List all the trace state variables. */
518
519static void
520tvariables_info (char *args, int from_tty)
521{
522 tvariables_info_1 ();
f61e138d
SS
523}
524
8bf6485c
SS
525/* Stash definitions of tsvs into the given file. */
526
527void
528save_trace_state_variables (struct ui_file *fp)
529{
530 struct trace_state_variable *tsv;
531 int ix;
532
533 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
534 {
535 fprintf_unfiltered (fp, "tvariable $%s", tsv->name);
536 if (tsv->initial_value)
537 fprintf_unfiltered (fp, " = %s", plongest (tsv->initial_value));
538 fprintf_unfiltered (fp, "\n");
539 }
540}
541
c906108c
SS
542/* ACTIONS functions: */
543
c906108c 544/* The three functions:
c5aa993b
JM
545 collect_pseudocommand,
546 while_stepping_pseudocommand, and
547 end_actions_pseudocommand
c906108c
SS
548 are placeholders for "commands" that are actually ONLY to be used
549 within a tracepoint action list. If the actual function is ever called,
550 it means that somebody issued the "command" at the top level,
551 which is always an error. */
552
1042e4c0 553void
fba45db2 554end_actions_pseudocommand (char *args, int from_tty)
c906108c 555{
8a3fe4f8 556 error (_("This command cannot be used at the top level."));
c906108c
SS
557}
558
1042e4c0 559void
fba45db2 560while_stepping_pseudocommand (char *args, int from_tty)
c906108c 561{
8a3fe4f8 562 error (_("This command can only be used in a tracepoint actions list."));
c906108c
SS
563}
564
565static void
fba45db2 566collect_pseudocommand (char *args, int from_tty)
c906108c 567{
8a3fe4f8 568 error (_("This command can only be used in a tracepoint actions list."));
c906108c
SS
569}
570
6da95a67
SS
571static void
572teval_pseudocommand (char *args, int from_tty)
573{
574 error (_("This command can only be used in a tracepoint actions list."));
575}
576
c906108c
SS
577/* Enter a list of actions for a tracepoint. */
578static void
fba45db2 579trace_actions_command (char *args, int from_tty)
c906108c 580{
1042e4c0 581 struct breakpoint *t;
a7bdde9e 582 struct command_line *l;
c906108c 583
c2d11a7d 584 t = get_tracepoint_by_number (&args, 0, 1);
7a292a7a 585 if (t)
c906108c 586 {
a7bdde9e
VP
587 char *tmpbuf =
588 xstrprintf ("Enter actions for tracepoint %d, one per line.",
589 t->number);
590 struct cleanup *cleanups = make_cleanup (xfree, tmpbuf);
591
3e43a32a
MS
592 l = read_command_lines (tmpbuf, from_tty, 1,
593 check_tracepoint_command, t);
a7bdde9e
VP
594 do_cleanups (cleanups);
595 breakpoint_set_commands (t, l);
c906108c 596 }
5c44784c 597 /* else just return */
c906108c
SS
598}
599
fff87407
SS
600/* Report the results of checking the agent expression, as errors or
601 internal errors. */
602
603static void
35c9c7ba 604report_agent_reqs_errors (struct agent_expr *aexpr)
fff87407
SS
605{
606 /* All of the "flaws" are serious bytecode generation issues that
607 should never occur. */
35c9c7ba 608 if (aexpr->flaw != agent_flaw_none)
fff87407
SS
609 internal_error (__FILE__, __LINE__, _("expression is malformed"));
610
611 /* If analysis shows a stack underflow, GDB must have done something
612 badly wrong in its bytecode generation. */
35c9c7ba 613 if (aexpr->min_height < 0)
fff87407
SS
614 internal_error (__FILE__, __LINE__,
615 _("expression has min height < 0"));
616
617 /* Issue this error if the stack is predicted to get too deep. The
618 limit is rather arbitrary; a better scheme might be for the
619 target to report how much stack it will have available. The
620 depth roughly corresponds to parenthesization, so a limit of 20
621 amounts to 20 levels of expression nesting, which is actually
622 a pretty big hairy expression. */
35c9c7ba 623 if (aexpr->max_height > 20)
fff87407
SS
624 error (_("Expression is too complicated."));
625}
626
c906108c 627/* worker function */
fff87407 628void
1042e4c0 629validate_actionline (char **line, struct breakpoint *t)
c906108c
SS
630{
631 struct cmd_list_element *c;
632 struct expression *exp = NULL;
c906108c 633 struct cleanup *old_chain = NULL;
9355b391
SS
634 char *p, *tmp_p;
635 struct bp_location *loc;
fff87407 636 struct agent_expr *aexpr;
c906108c 637
c378eb4e 638 /* If EOF is typed, *line is NULL. */
15255275 639 if (*line == NULL)
fff87407 640 return;
15255275 641
104c1213 642 for (p = *line; isspace ((int) *p);)
c906108c
SS
643 p++;
644
d183932d
MS
645 /* Symbol lookup etc. */
646 if (*p == '\0') /* empty line: just prompt for another line. */
fff87407 647 return;
c906108c 648
c5aa993b 649 if (*p == '#') /* comment line */
fff87407 650 return;
c906108c
SS
651
652 c = lookup_cmd (&p, cmdlist, "", -1, 1);
653 if (c == 0)
fff87407 654 error (_("`%s' is not a tracepoint action, or is ambiguous."), p);
c5aa993b 655
bbaca940 656 if (cmd_cfunc_eq (c, collect_pseudocommand))
c906108c 657 {
c5aa993b 658 do
c378eb4e
MS
659 { /* Repeat over a comma-separated list. */
660 QUIT; /* Allow user to bail out with ^C. */
104c1213 661 while (isspace ((int) *p))
c5aa993b 662 p++;
c906108c 663
c378eb4e 664 if (*p == '$') /* Look for special pseudo-symbols. */
c5aa993b 665 {
0fb4aa4b
PA
666 if (0 == strncasecmp ("reg", p + 1, 3)
667 || 0 == strncasecmp ("arg", p + 1, 3)
668 || 0 == strncasecmp ("loc", p + 1, 3)
669 || 0 == strncasecmp ("_sdata", p + 1, 6))
c5aa993b
JM
670 {
671 p = strchr (p, ',');
672 continue;
673 }
d183932d 674 /* else fall thru, treat p as an expression and parse it! */
c5aa993b 675 }
9355b391
SS
676 tmp_p = p;
677 for (loc = t->loc; loc; loc = loc->next)
c5aa993b 678 {
9355b391
SS
679 p = tmp_p;
680 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
681 old_chain = make_cleanup (free_current_contents, &exp);
682
683 if (exp->elts[0].opcode == OP_VAR_VALUE)
c5aa993b 684 {
9355b391
SS
685 if (SYMBOL_CLASS (exp->elts[2].symbol) == LOC_CONST)
686 {
3e43a32a
MS
687 error (_("constant `%s' (value %ld) "
688 "will not be collected."),
fff87407
SS
689 SYMBOL_PRINT_NAME (exp->elts[2].symbol),
690 SYMBOL_VALUE (exp->elts[2].symbol));
9355b391 691 }
3e43a32a
MS
692 else if (SYMBOL_CLASS (exp->elts[2].symbol)
693 == LOC_OPTIMIZED_OUT)
9355b391 694 {
3e43a32a
MS
695 error (_("`%s' is optimized away "
696 "and cannot be collected."),
fff87407 697 SYMBOL_PRINT_NAME (exp->elts[2].symbol));
9355b391 698 }
c5aa993b 699 }
c906108c 700
9355b391
SS
701 /* We have something to collect, make sure that the expr to
702 bytecode translator can handle it and that it's not too
703 long. */
704 aexpr = gen_trace_for_expr (loc->address, exp);
705 make_cleanup_free_agent_expr (aexpr);
c906108c 706
9355b391 707 if (aexpr->len > MAX_AGENT_EXPR_LEN)
fff87407 708 error (_("Expression is too complicated."));
c906108c 709
35c9c7ba 710 ax_reqs (aexpr);
c906108c 711
35c9c7ba 712 report_agent_reqs_errors (aexpr);
c906108c 713
9355b391
SS
714 do_cleanups (old_chain);
715 }
c5aa993b
JM
716 }
717 while (p && *p++ == ',');
c906108c 718 }
fff87407 719
6da95a67
SS
720 else if (cmd_cfunc_eq (c, teval_pseudocommand))
721 {
6da95a67 722 do
c378eb4e
MS
723 { /* Repeat over a comma-separated list. */
724 QUIT; /* Allow user to bail out with ^C. */
6da95a67
SS
725 while (isspace ((int) *p))
726 p++;
727
9355b391
SS
728 tmp_p = p;
729 for (loc = t->loc; loc; loc = loc->next)
730 {
731 p = tmp_p;
732 /* Only expressions are allowed for this action. */
733 exp = parse_exp_1 (&p, block_for_pc (loc->address), 1);
734 old_chain = make_cleanup (free_current_contents, &exp);
6da95a67 735
9355b391
SS
736 /* We have something to evaluate, make sure that the expr to
737 bytecode translator can handle it and that it's not too
738 long. */
739 aexpr = gen_eval_for_expr (loc->address, exp);
740 make_cleanup_free_agent_expr (aexpr);
6da95a67 741
9355b391 742 if (aexpr->len > MAX_AGENT_EXPR_LEN)
fff87407
SS
743 error (_("Expression is too complicated."));
744
35c9c7ba
SS
745 ax_reqs (aexpr);
746 report_agent_reqs_errors (aexpr);
6da95a67 747
9355b391
SS
748 do_cleanups (old_chain);
749 }
6da95a67
SS
750 }
751 while (p && *p++ == ',');
6da95a67 752 }
fff87407 753
bbaca940 754 else if (cmd_cfunc_eq (c, while_stepping_pseudocommand))
c906108c 755 {
c378eb4e 756 char *steparg; /* In case warning is necessary. */
c906108c 757
104c1213 758 while (isspace ((int) *p))
c906108c
SS
759 p++;
760 steparg = p;
761
fff87407
SS
762 if (*p == '\0' || (t->step_count = strtol (p, &p, 0)) == 0)
763 error (_("while-stepping step count `%s' is malformed."), *line);
c906108c 764 }
fff87407 765
bbaca940 766 else if (cmd_cfunc_eq (c, end_actions_pseudocommand))
fff87407
SS
767 ;
768
c906108c 769 else
fff87407 770 error (_("`%s' is not a supported tracepoint action."), *line);
74b7792f
AC
771}
772
f50e79a4
JB
773enum {
774 memrange_absolute = -1
775};
776
c5aa993b
JM
777struct memrange
778{
f50e79a4 779 int type; /* memrange_absolute for absolute memory range,
c378eb4e 780 else basereg number. */
c906108c
SS
781 bfd_signed_vma start;
782 bfd_signed_vma end;
783};
784
c5aa993b
JM
785struct collection_list
786 {
549678da 787 unsigned char regs_mask[32]; /* room for up to 256 regs */
c5aa993b
JM
788 long listsize;
789 long next_memrange;
790 struct memrange *list;
791 long aexpr_listsize; /* size of array pointed to by expr_list elt */
792 long next_aexpr_elt;
793 struct agent_expr **aexpr_list;
794
0fb4aa4b
PA
795 /* True is the user requested a collection of "$_sdata", "static
796 tracepoint data". */
797 int strace_data;
c5aa993b
JM
798 }
799tracepoint_list, stepping_list;
c906108c
SS
800
801/* MEMRANGE functions: */
802
a14ed312 803static int memrange_cmp (const void *, const void *);
c906108c 804
c378eb4e 805/* Compare memranges for qsort. */
c906108c 806static int
fba45db2 807memrange_cmp (const void *va, const void *vb)
c906108c
SS
808{
809 const struct memrange *a = va, *b = vb;
810
811 if (a->type < b->type)
812 return -1;
813 if (a->type > b->type)
c5aa993b 814 return 1;
f50e79a4 815 if (a->type == memrange_absolute)
c906108c 816 {
c5aa993b
JM
817 if ((bfd_vma) a->start < (bfd_vma) b->start)
818 return -1;
819 if ((bfd_vma) a->start > (bfd_vma) b->start)
820 return 1;
c906108c
SS
821 }
822 else
823 {
c5aa993b 824 if (a->start < b->start)
c906108c 825 return -1;
c5aa993b
JM
826 if (a->start > b->start)
827 return 1;
c906108c
SS
828 }
829 return 0;
830}
831
d183932d 832/* Sort the memrange list using qsort, and merge adjacent memranges. */
c906108c 833static void
fba45db2 834memrange_sortmerge (struct collection_list *memranges)
c906108c
SS
835{
836 int a, b;
837
c5aa993b 838 qsort (memranges->list, memranges->next_memrange,
c906108c
SS
839 sizeof (struct memrange), memrange_cmp);
840 if (memranges->next_memrange > 0)
841 {
842 for (a = 0, b = 1; b < memranges->next_memrange; b++)
843 {
844 if (memranges->list[a].type == memranges->list[b].type &&
c5aa993b 845 memranges->list[b].start - memranges->list[a].end <=
0c92afe8 846 MAX_REGISTER_SIZE)
c906108c
SS
847 {
848 /* memrange b starts before memrange a ends; merge them. */
849 if (memranges->list[b].end > memranges->list[a].end)
850 memranges->list[a].end = memranges->list[b].end;
851 continue; /* next b, same a */
852 }
853 a++; /* next a */
854 if (a != b)
c5aa993b 855 memcpy (&memranges->list[a], &memranges->list[b],
c906108c
SS
856 sizeof (struct memrange));
857 }
858 memranges->next_memrange = a + 1;
859 }
860}
861
d183932d 862/* Add a register to a collection list. */
392a587b 863static void
fba45db2 864add_register (struct collection_list *collection, unsigned int regno)
c906108c
SS
865{
866 if (info_verbose)
867 printf_filtered ("collect register %d\n", regno);
27e06d3e 868 if (regno >= (8 * sizeof (collection->regs_mask)))
8a3fe4f8 869 error (_("Internal: register number %d too large for tracepoint"),
c906108c 870 regno);
c5aa993b 871 collection->regs_mask[regno / 8] |= 1 << (regno % 8);
c906108c
SS
872}
873
c378eb4e 874/* Add a memrange to a collection list. */
c906108c 875static void
d183932d
MS
876add_memrange (struct collection_list *memranges,
877 int type, bfd_signed_vma base,
fba45db2 878 unsigned long len)
c906108c
SS
879{
880 if (info_verbose)
104c1213
JM
881 {
882 printf_filtered ("(%d,", type);
883 printf_vma (base);
884 printf_filtered (",%ld)\n", len);
885 }
886
f50e79a4 887 /* type: memrange_absolute == memory, other n == basereg */
c5aa993b 888 memranges->list[memranges->next_memrange].type = type;
d183932d 889 /* base: addr if memory, offset if reg relative. */
c906108c
SS
890 memranges->list[memranges->next_memrange].start = base;
891 /* len: we actually save end (base + len) for convenience */
c5aa993b 892 memranges->list[memranges->next_memrange].end = base + len;
c906108c
SS
893 memranges->next_memrange++;
894 if (memranges->next_memrange >= memranges->listsize)
895 {
896 memranges->listsize *= 2;
c5aa993b 897 memranges->list = xrealloc (memranges->list,
c906108c
SS
898 memranges->listsize);
899 }
900
3e43a32a 901 if (type != memrange_absolute) /* Better collect the base register! */
c906108c
SS
902 add_register (memranges, type);
903}
904
d183932d 905/* Add a symbol to a collection list. */
c906108c 906static void
d183932d
MS
907collect_symbol (struct collection_list *collect,
908 struct symbol *sym,
a6d9a66e 909 struct gdbarch *gdbarch,
0936ad1d
SS
910 long frame_regno, long frame_offset,
911 CORE_ADDR scope)
c906108c 912{
c5aa993b 913 unsigned long len;
104c1213 914 unsigned int reg;
c906108c 915 bfd_signed_vma offset;
400c6af0 916 int treat_as_expr = 0;
c906108c 917
c5aa993b
JM
918 len = TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym)));
919 switch (SYMBOL_CLASS (sym))
920 {
921 default:
922 printf_filtered ("%s: don't know symbol class %d\n",
3567439c 923 SYMBOL_PRINT_NAME (sym),
d183932d 924 SYMBOL_CLASS (sym));
c5aa993b
JM
925 break;
926 case LOC_CONST:
104c1213 927 printf_filtered ("constant %s (value %ld) will not be collected.\n",
3567439c 928 SYMBOL_PRINT_NAME (sym), SYMBOL_VALUE (sym));
c5aa993b
JM
929 break;
930 case LOC_STATIC:
931 offset = SYMBOL_VALUE_ADDRESS (sym);
932 if (info_verbose)
104c1213
JM
933 {
934 char tmp[40];
935
936 sprintf_vma (tmp, offset);
937 printf_filtered ("LOC_STATIC %s: collect %ld bytes at %s.\n",
3567439c 938 SYMBOL_PRINT_NAME (sym), len,
d183932d 939 tmp /* address */);
104c1213 940 }
400c6af0
SS
941 /* A struct may be a C++ class with static fields, go to general
942 expression handling. */
943 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_STRUCT)
944 treat_as_expr = 1;
945 else
946 add_memrange (collect, memrange_absolute, offset, len);
c5aa993b
JM
947 break;
948 case LOC_REGISTER:
a6d9a66e 949 reg = SYMBOL_REGISTER_OPS (sym)->register_number (sym, gdbarch);
c5aa993b 950 if (info_verbose)
d183932d 951 printf_filtered ("LOC_REG[parm] %s: ",
3567439c 952 SYMBOL_PRINT_NAME (sym));
c5aa993b 953 add_register (collect, reg);
d183932d
MS
954 /* Check for doubles stored in two registers. */
955 /* FIXME: how about larger types stored in 3 or more regs? */
c5aa993b 956 if (TYPE_CODE (SYMBOL_TYPE (sym)) == TYPE_CODE_FLT &&
a6d9a66e 957 len > register_size (gdbarch, reg))
c5aa993b
JM
958 add_register (collect, reg + 1);
959 break;
960 case LOC_REF_ARG:
961 printf_filtered ("Sorry, don't know how to do LOC_REF_ARG yet.\n");
962 printf_filtered (" (will not collect %s)\n",
3567439c 963 SYMBOL_PRINT_NAME (sym));
c5aa993b
JM
964 break;
965 case LOC_ARG:
966 reg = frame_regno;
967 offset = frame_offset + SYMBOL_VALUE (sym);
968 if (info_verbose)
969 {
104c1213 970 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
3567439c 971 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
972 printf_vma (offset);
973 printf_filtered (" from frame ptr reg %d\n", reg);
c5aa993b
JM
974 }
975 add_memrange (collect, reg, offset, len);
976 break;
977 case LOC_REGPARM_ADDR:
978 reg = SYMBOL_VALUE (sym);
979 offset = 0;
980 if (info_verbose)
981 {
104c1213 982 printf_filtered ("LOC_REGPARM_ADDR %s: Collect %ld bytes at offset ",
3567439c 983 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
984 printf_vma (offset);
985 printf_filtered (" from reg %d\n", reg);
c5aa993b
JM
986 }
987 add_memrange (collect, reg, offset, len);
988 break;
989 case LOC_LOCAL:
c5aa993b
JM
990 reg = frame_regno;
991 offset = frame_offset + SYMBOL_VALUE (sym);
992 if (info_verbose)
993 {
104c1213 994 printf_filtered ("LOC_LOCAL %s: Collect %ld bytes at offset ",
3567439c 995 SYMBOL_PRINT_NAME (sym), len);
104c1213
JM
996 printf_vma (offset);
997 printf_filtered (" from frame ptr reg %d\n", reg);
c5aa993b
JM
998 }
999 add_memrange (collect, reg, offset, len);
1000 break;
a0405854 1001
c5aa993b 1002 case LOC_UNRESOLVED:
a0405854 1003 treat_as_expr = 1;
c5aa993b 1004 break;
a0405854 1005
c5aa993b 1006 case LOC_OPTIMIZED_OUT:
8e1a459b 1007 printf_filtered ("%s has been optimized out of existence.\n",
3567439c 1008 SYMBOL_PRINT_NAME (sym));
c5aa993b 1009 break;
0936ad1d
SS
1010
1011 case LOC_COMPUTED:
400c6af0 1012 treat_as_expr = 1;
0936ad1d 1013 break;
c5aa993b 1014 }
400c6af0
SS
1015
1016 /* Expressions are the most general case. */
1017 if (treat_as_expr)
1018 {
1019 struct agent_expr *aexpr;
1020 struct cleanup *old_chain1 = NULL;
400c6af0
SS
1021
1022 aexpr = gen_trace_for_var (scope, gdbarch, sym);
1023
1024 /* It can happen that the symbol is recorded as a computed
1025 location, but it's been optimized away and doesn't actually
1026 have a location expression. */
1027 if (!aexpr)
1028 {
1029 printf_filtered ("%s has been optimized out of existence.\n",
1030 SYMBOL_PRINT_NAME (sym));
1031 return;
1032 }
1033
1034 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1035
35c9c7ba 1036 ax_reqs (aexpr);
fff87407 1037
35c9c7ba 1038 report_agent_reqs_errors (aexpr);
400c6af0
SS
1039
1040 discard_cleanups (old_chain1);
1041 add_aexpr (collect, aexpr);
1042
c378eb4e 1043 /* Take care of the registers. */
35c9c7ba 1044 if (aexpr->reg_mask_len > 0)
400c6af0
SS
1045 {
1046 int ndx1, ndx2;
1047
35c9c7ba 1048 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
400c6af0 1049 {
c378eb4e 1050 QUIT; /* Allow user to bail out with ^C. */
35c9c7ba 1051 if (aexpr->reg_mask[ndx1] != 0)
400c6af0 1052 {
c378eb4e 1053 /* Assume chars have 8 bits. */
400c6af0 1054 for (ndx2 = 0; ndx2 < 8; ndx2++)
35c9c7ba 1055 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
c378eb4e 1056 /* It's used -- record it. */
400c6af0
SS
1057 add_register (collect, ndx1 * 8 + ndx2);
1058 }
1059 }
1060 }
1061 }
c906108c
SS
1062}
1063
2c58c0a9
PA
1064/* Data to be passed around in the calls to the locals and args
1065 iterators. */
1066
1067struct add_local_symbols_data
1068{
1069 struct collection_list *collect;
1070 struct gdbarch *gdbarch;
1071 CORE_ADDR pc;
1072 long frame_regno;
1073 long frame_offset;
1074 int count;
1075};
1076
c378eb4e 1077/* The callback for the locals and args iterators. */
2c58c0a9
PA
1078
1079static void
1080do_collect_symbol (const char *print_name,
1081 struct symbol *sym,
1082 void *cb_data)
1083{
1084 struct add_local_symbols_data *p = cb_data;
1085
1086 collect_symbol (p->collect, sym, p->gdbarch, p->frame_regno,
1087 p->frame_offset, p->pc);
1088 p->count++;
1089}
1090
c378eb4e 1091/* Add all locals (or args) symbols to collection list. */
c906108c 1092static void
a6d9a66e
UW
1093add_local_symbols (struct collection_list *collect,
1094 struct gdbarch *gdbarch, CORE_ADDR pc,
fba45db2 1095 long frame_regno, long frame_offset, int type)
c906108c 1096{
c5aa993b 1097 struct block *block;
2c58c0a9
PA
1098 struct add_local_symbols_data cb_data;
1099
1100 cb_data.collect = collect;
1101 cb_data.gdbarch = gdbarch;
1102 cb_data.pc = pc;
1103 cb_data.frame_regno = frame_regno;
1104 cb_data.frame_offset = frame_offset;
1105 cb_data.count = 0;
c906108c 1106
2c58c0a9 1107 if (type == 'L')
c906108c 1108 {
2c58c0a9
PA
1109 block = block_for_pc (pc);
1110 if (block == NULL)
c906108c 1111 {
2c58c0a9
PA
1112 warning (_("Can't collect locals; "
1113 "no symbol table info available.\n"));
1114 return;
c906108c 1115 }
2c58c0a9
PA
1116
1117 iterate_over_block_local_vars (block, do_collect_symbol, &cb_data);
1118 if (cb_data.count == 0)
1119 warning (_("No locals found in scope."));
1120 }
1121 else
1122 {
1123 pc = get_pc_function_start (pc);
1124 block = block_for_pc (pc);
1125 if (block == NULL)
1126 {
1127 warning (_("Can't collect args; no symbol table info available.\n"));
1128 return;
1129 }
1130
1131 iterate_over_block_arg_vars (block, do_collect_symbol, &cb_data);
1132 if (cb_data.count == 0)
1133 warning (_("No args found in scope."));
c906108c 1134 }
c906108c
SS
1135}
1136
0fb4aa4b
PA
1137static void
1138add_static_trace_data (struct collection_list *collection)
1139{
1140 if (info_verbose)
1141 printf_filtered ("collect static trace data\n");
1142 collection->strace_data = 1;
1143}
1144
c906108c
SS
1145/* worker function */
1146static void
fba45db2 1147clear_collection_list (struct collection_list *list)
c906108c
SS
1148{
1149 int ndx;
1150
1151 list->next_memrange = 0;
1152 for (ndx = 0; ndx < list->next_aexpr_elt; ndx++)
1153 {
c5aa993b 1154 free_agent_expr (list->aexpr_list[ndx]);
c906108c
SS
1155 list->aexpr_list[ndx] = NULL;
1156 }
1157 list->next_aexpr_elt = 0;
1158 memset (list->regs_mask, 0, sizeof (list->regs_mask));
0fb4aa4b 1159 list->strace_data = 0;
c906108c
SS
1160}
1161
c378eb4e 1162/* Reduce a collection list to string form (for gdb protocol). */
c906108c 1163static char **
fba45db2 1164stringify_collection_list (struct collection_list *list, char *string)
c906108c
SS
1165{
1166 char temp_buf[2048];
104c1213 1167 char tmp2[40];
c906108c
SS
1168 int count;
1169 int ndx = 0;
1170 char *(*str_list)[];
1171 char *end;
c5aa993b 1172 long i;
c906108c 1173
0fb4aa4b 1174 count = 1 + 1 + list->next_memrange + list->next_aexpr_elt + 1;
c5aa993b 1175 str_list = (char *(*)[]) xmalloc (count * sizeof (char *));
c906108c 1176
0fb4aa4b
PA
1177 if (list->strace_data)
1178 {
1179 if (info_verbose)
1180 printf_filtered ("\nCollecting static trace data\n");
1181 end = temp_buf;
1182 *end++ = 'L';
1183 (*str_list)[ndx] = savestring (temp_buf, end - temp_buf);
1184 ndx++;
1185 }
1186
c906108c 1187 for (i = sizeof (list->regs_mask) - 1; i > 0; i--)
c378eb4e 1188 if (list->regs_mask[i] != 0) /* Skip leading zeroes in regs_mask. */
c906108c 1189 break;
c378eb4e 1190 if (list->regs_mask[i] != 0) /* Prepare to send regs_mask to the stub. */
c906108c
SS
1191 {
1192 if (info_verbose)
1193 printf_filtered ("\nCollecting registers (mask): 0x");
1194 end = temp_buf;
c5aa993b 1195 *end++ = 'R';
c906108c
SS
1196 for (; i >= 0; i--)
1197 {
c378eb4e 1198 QUIT; /* Allow user to bail out with ^C. */
c906108c
SS
1199 if (info_verbose)
1200 printf_filtered ("%02X", list->regs_mask[i]);
c5aa993b 1201 sprintf (end, "%02X", list->regs_mask[i]);
c906108c
SS
1202 end += 2;
1203 }
1b36a34b 1204 (*str_list)[ndx] = xstrdup (temp_buf);
c906108c
SS
1205 ndx++;
1206 }
1207 if (info_verbose)
1208 printf_filtered ("\n");
1209 if (list->next_memrange > 0 && info_verbose)
1210 printf_filtered ("Collecting memranges: \n");
1211 for (i = 0, count = 0, end = temp_buf; i < list->next_memrange; i++)
1212 {
c378eb4e 1213 QUIT; /* Allow user to bail out with ^C. */
104c1213 1214 sprintf_vma (tmp2, list->list[i].start);
c906108c 1215 if (info_verbose)
104c1213
JM
1216 {
1217 printf_filtered ("(%d, %s, %ld)\n",
1218 list->list[i].type,
1219 tmp2,
1220 (long) (list->list[i].end - list->list[i].start));
1221 }
c906108c
SS
1222 if (count + 27 > MAX_AGENT_EXPR_LEN)
1223 {
c5aa993b 1224 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
1225 ndx++;
1226 count = 0;
1227 end = temp_buf;
1228 }
104c1213 1229
d1948716
JB
1230 {
1231 bfd_signed_vma length = list->list[i].end - list->list[i].start;
1232
1233 /* The "%X" conversion specifier expects an unsigned argument,
f50e79a4
JB
1234 so passing -1 (memrange_absolute) to it directly gives you
1235 "FFFFFFFF" (or more, depending on sizeof (unsigned)).
1236 Special-case it. */
1237 if (list->list[i].type == memrange_absolute)
d1948716
JB
1238 sprintf (end, "M-1,%s,%lX", tmp2, (long) length);
1239 else
1240 sprintf (end, "M%X,%s,%lX", list->list[i].type, tmp2, (long) length);
1241 }
104c1213 1242
c906108c 1243 count += strlen (end);
3ffbc0a5 1244 end = temp_buf + count;
c906108c
SS
1245 }
1246
1247 for (i = 0; i < list->next_aexpr_elt; i++)
1248 {
c378eb4e 1249 QUIT; /* Allow user to bail out with ^C. */
c906108c
SS
1250 if ((count + 10 + 2 * list->aexpr_list[i]->len) > MAX_AGENT_EXPR_LEN)
1251 {
c5aa993b 1252 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
1253 ndx++;
1254 count = 0;
1255 end = temp_buf;
1256 }
1257 sprintf (end, "X%08X,", list->aexpr_list[i]->len);
1258 end += 10; /* 'X' + 8 hex digits + ',' */
1259 count += 10;
1260
d183932d
MS
1261 end = mem2hex (list->aexpr_list[i]->buf,
1262 end, list->aexpr_list[i]->len);
c906108c
SS
1263 count += 2 * list->aexpr_list[i]->len;
1264 }
1265
1266 if (count != 0)
1267 {
c5aa993b 1268 (*str_list)[ndx] = savestring (temp_buf, count);
c906108c
SS
1269 ndx++;
1270 count = 0;
1271 end = temp_buf;
1272 }
1273 (*str_list)[ndx] = NULL;
1274
1275 if (ndx == 0)
27e06d3e 1276 {
6c761d9c 1277 xfree (str_list);
27e06d3e
MS
1278 return NULL;
1279 }
c906108c
SS
1280 else
1281 return *str_list;
1282}
1283
a7bdde9e
VP
1284
1285static void
1286encode_actions_1 (struct command_line *action,
1287 struct breakpoint *t,
1288 struct bp_location *tloc,
1289 int frame_reg,
1290 LONGEST frame_offset,
1291 struct collection_list *collect,
1292 struct collection_list *stepping_list)
c906108c 1293{
c5aa993b
JM
1294 char *action_exp;
1295 struct expression *exp = NULL;
104c1213 1296 int i;
f976f6d4 1297 struct value *tempval;
c906108c
SS
1298 struct cmd_list_element *cmd;
1299 struct agent_expr *aexpr;
236f1d4d
SS
1300
1301 for (; action; action = action->next)
c906108c 1302 {
c378eb4e 1303 QUIT; /* Allow user to bail out with ^C. */
a7bdde9e 1304 action_exp = action->line;
104c1213 1305 while (isspace ((int) *action_exp))
c906108c
SS
1306 action_exp++;
1307
c906108c
SS
1308 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
1309 if (cmd == 0)
8a3fe4f8 1310 error (_("Bad action list item: %s"), action_exp);
c906108c 1311
bbaca940 1312 if (cmd_cfunc_eq (cmd, collect_pseudocommand))
c906108c 1313 {
c5aa993b 1314 do
c378eb4e
MS
1315 { /* Repeat over a comma-separated list. */
1316 QUIT; /* Allow user to bail out with ^C. */
104c1213 1317 while (isspace ((int) *action_exp))
c5aa993b 1318 action_exp++;
c906108c 1319
c5aa993b
JM
1320 if (0 == strncasecmp ("$reg", action_exp, 4))
1321 {
a6d9a66e 1322 for (i = 0; i < gdbarch_num_regs (t->gdbarch); i++)
c5aa993b
JM
1323 add_register (collect, i);
1324 action_exp = strchr (action_exp, ','); /* more? */
1325 }
1326 else if (0 == strncasecmp ("$arg", action_exp, 4))
1327 {
1328 add_local_symbols (collect,
a6d9a66e 1329 t->gdbarch,
9355b391 1330 tloc->address,
c5aa993b
JM
1331 frame_reg,
1332 frame_offset,
1333 'A');
1334 action_exp = strchr (action_exp, ','); /* more? */
1335 }
1336 else if (0 == strncasecmp ("$loc", action_exp, 4))
1337 {
1338 add_local_symbols (collect,
a6d9a66e 1339 t->gdbarch,
9355b391 1340 tloc->address,
c5aa993b
JM
1341 frame_reg,
1342 frame_offset,
1343 'L');
1344 action_exp = strchr (action_exp, ','); /* more? */
1345 }
0fb4aa4b
PA
1346 else if (0 == strncasecmp ("$_sdata", action_exp, 7))
1347 {
1348 add_static_trace_data (collect);
1349 action_exp = strchr (action_exp, ','); /* more? */
1350 }
c5aa993b
JM
1351 else
1352 {
1353 unsigned long addr, len;
1354 struct cleanup *old_chain = NULL;
1355 struct cleanup *old_chain1 = NULL;
c5aa993b 1356
75ac9d7b 1357 exp = parse_exp_1 (&action_exp,
9355b391 1358 block_for_pc (tloc->address), 1);
74b7792f 1359 old_chain = make_cleanup (free_current_contents, &exp);
c906108c 1360
c5aa993b
JM
1361 switch (exp->elts[0].opcode)
1362 {
1363 case OP_REGISTER:
67f3407f
DJ
1364 {
1365 const char *name = &exp->elts[2].string;
1366
a6d9a66e 1367 i = user_reg_map_name_to_regnum (t->gdbarch,
029a67e4 1368 name, strlen (name));
67f3407f
DJ
1369 if (i == -1)
1370 internal_error (__FILE__, __LINE__,
1371 _("Register $%s not available"),
1372 name);
1373 if (info_verbose)
1374 printf_filtered ("OP_REGISTER: ");
1375 add_register (collect, i);
1376 break;
1377 }
c5aa993b
JM
1378
1379 case UNOP_MEMVAL:
c378eb4e 1380 /* Safe because we know it's a simple expression. */
c5aa993b 1381 tempval = evaluate_expression (exp);
42ae5230 1382 addr = value_address (tempval);
c5aa993b 1383 len = TYPE_LENGTH (check_typedef (exp->elts[1].type));
f50e79a4 1384 add_memrange (collect, memrange_absolute, addr, len);
c5aa993b
JM
1385 break;
1386
1387 case OP_VAR_VALUE:
1388 collect_symbol (collect,
1389 exp->elts[2].symbol,
a6d9a66e 1390 t->gdbarch,
c5aa993b 1391 frame_reg,
0936ad1d 1392 frame_offset,
9355b391 1393 tloc->address);
c5aa993b
JM
1394 break;
1395
c378eb4e 1396 default: /* Full-fledged expression. */
9355b391 1397 aexpr = gen_trace_for_expr (tloc->address, exp);
c5aa993b 1398
f23d52e0 1399 old_chain1 = make_cleanup_free_agent_expr (aexpr);
c5aa993b 1400
35c9c7ba 1401 ax_reqs (aexpr);
c5aa993b 1402
35c9c7ba 1403 report_agent_reqs_errors (aexpr);
c5aa993b
JM
1404
1405 discard_cleanups (old_chain1);
1406 add_aexpr (collect, aexpr);
1407
c378eb4e 1408 /* Take care of the registers. */
35c9c7ba 1409 if (aexpr->reg_mask_len > 0)
c906108c 1410 {
c5aa993b
JM
1411 int ndx1;
1412 int ndx2;
1413
35c9c7ba 1414 for (ndx1 = 0; ndx1 < aexpr->reg_mask_len; ndx1++)
c906108c 1415 {
c378eb4e 1416 QUIT; /* Allow user to bail out with ^C. */
35c9c7ba 1417 if (aexpr->reg_mask[ndx1] != 0)
c5aa993b 1418 {
c378eb4e 1419 /* Assume chars have 8 bits. */
c5aa993b 1420 for (ndx2 = 0; ndx2 < 8; ndx2++)
35c9c7ba 1421 if (aexpr->reg_mask[ndx1] & (1 << ndx2))
c378eb4e 1422 /* It's used -- record it. */
d183932d
MS
1423 add_register (collect,
1424 ndx1 * 8 + ndx2);
c5aa993b 1425 }
c906108c
SS
1426 }
1427 }
c5aa993b
JM
1428 break;
1429 } /* switch */
1430 do_cleanups (old_chain);
1431 } /* do */
1432 }
1433 while (action_exp && *action_exp++ == ',');
1434 } /* if */
6da95a67
SS
1435 else if (cmd_cfunc_eq (cmd, teval_pseudocommand))
1436 {
1437 do
c378eb4e
MS
1438 { /* Repeat over a comma-separated list. */
1439 QUIT; /* Allow user to bail out with ^C. */
6da95a67
SS
1440 while (isspace ((int) *action_exp))
1441 action_exp++;
1442
1443 {
6da95a67
SS
1444 struct cleanup *old_chain = NULL;
1445 struct cleanup *old_chain1 = NULL;
6da95a67
SS
1446
1447 exp = parse_exp_1 (&action_exp,
9355b391 1448 block_for_pc (tloc->address), 1);
6da95a67
SS
1449 old_chain = make_cleanup (free_current_contents, &exp);
1450
9355b391 1451 aexpr = gen_eval_for_expr (tloc->address, exp);
6da95a67
SS
1452 old_chain1 = make_cleanup_free_agent_expr (aexpr);
1453
35c9c7ba
SS
1454 ax_reqs (aexpr);
1455 report_agent_reqs_errors (aexpr);
6da95a67
SS
1456
1457 discard_cleanups (old_chain1);
1458 /* Even though we're not officially collecting, add
1459 to the collect list anyway. */
1460 add_aexpr (collect, aexpr);
1461
1462 do_cleanups (old_chain);
1463 } /* do */
1464 }
1465 while (action_exp && *action_exp++ == ',');
1466 } /* if */
bbaca940 1467 else if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
c906108c 1468 {
a7bdde9e
VP
1469 /* We check against nested while-stepping when setting
1470 breakpoint action, so no way to run into nested
1471 here. */
1472 gdb_assert (stepping_list);
1473
2a2287c7
MS
1474 encode_actions_1 (action->body_list[0], t, tloc, frame_reg,
1475 frame_offset, stepping_list, NULL);
c906108c 1476 }
a7bdde9e
VP
1477 else
1478 error (_("Invalid tracepoint command '%s'"), action->line);
1479 } /* for */
1480}
1481
1482/* Render all actions into gdb protocol. */
1483/*static*/ void
1484encode_actions (struct breakpoint *t, struct bp_location *tloc,
1485 char ***tdp_actions, char ***stepping_actions)
1486{
1487 static char tdp_buff[2048], step_buff[2048];
1488 char *default_collect_line = NULL;
1489 struct command_line *actions;
1490 struct command_line *default_collect_action = NULL;
1491 int frame_reg;
1492 LONGEST frame_offset;
1493 struct cleanup *back_to;
1494
1495 back_to = make_cleanup (null_cleanup, NULL);
1496
1497 clear_collection_list (&tracepoint_list);
1498 clear_collection_list (&stepping_list);
1499
1500 *tdp_actions = NULL;
1501 *stepping_actions = NULL;
1502
1503 gdbarch_virtual_frame_pointer (t->gdbarch,
1504 t->loc->address, &frame_reg, &frame_offset);
1505
5cea2a26 1506 actions = breakpoint_commands (t);
a7bdde9e
VP
1507
1508 /* If there are default expressions to collect, make up a collect
1509 action and prepend to the action list to encode. Note that since
1510 validation is per-tracepoint (local var "xyz" might be valid for
1511 one tracepoint and not another, etc), we make up the action on
1512 the fly, and don't cache it. */
1513 if (*default_collect)
1514 {
1515 char *line;
a7bdde9e
VP
1516
1517 default_collect_line = xstrprintf ("collect %s", default_collect);
1518 make_cleanup (xfree, default_collect_line);
1519
1520 line = default_collect_line;
fff87407
SS
1521 validate_actionline (&line, t);
1522
1523 default_collect_action = xmalloc (sizeof (struct command_line));
1524 make_cleanup (xfree, default_collect_action);
5cea2a26 1525 default_collect_action->next = actions;
fff87407
SS
1526 default_collect_action->line = line;
1527 actions = default_collect_action;
a7bdde9e
VP
1528 }
1529 encode_actions_1 (actions, t, tloc, frame_reg, frame_offset,
1530 &tracepoint_list, &stepping_list);
1531
c5aa993b
JM
1532 memrange_sortmerge (&tracepoint_list);
1533 memrange_sortmerge (&stepping_list);
c906108c 1534
a7bdde9e 1535 *tdp_actions = stringify_collection_list (&tracepoint_list,
d183932d 1536 tdp_buff);
a7bdde9e 1537 *stepping_actions = stringify_collection_list (&stepping_list,
d183932d 1538 step_buff);
236f1d4d 1539
a7bdde9e 1540 do_cleanups (back_to);
c906108c
SS
1541}
1542
1543static void
fba45db2 1544add_aexpr (struct collection_list *collect, struct agent_expr *aexpr)
c906108c
SS
1545{
1546 if (collect->next_aexpr_elt >= collect->aexpr_listsize)
1547 {
1548 collect->aexpr_list =
1549 xrealloc (collect->aexpr_list,
5d502164 1550 2 * collect->aexpr_listsize * sizeof (struct agent_expr *));
c906108c
SS
1551 collect->aexpr_listsize *= 2;
1552 }
1553 collect->aexpr_list[collect->next_aexpr_elt] = aexpr;
1554 collect->next_aexpr_elt++;
1555}
1556
c5aa993b 1557
f224b49d
VP
1558void
1559start_tracing (void)
d183932d 1560{
1042e4c0
SS
1561 VEC(breakpoint_p) *tp_vec = NULL;
1562 int ix;
1563 struct breakpoint *t;
f61e138d 1564 struct trace_state_variable *tsv;
d914c394 1565 int any_enabled = 0, num_to_download = 0;
35b1e5cc
SS
1566
1567 tp_vec = all_tracepoints ();
76a2b958 1568
c378eb4e 1569 /* No point in tracing without any tracepoints... */
76a2b958
SS
1570 if (VEC_length (breakpoint_p, tp_vec) == 0)
1571 {
1572 VEC_free (breakpoint_p, tp_vec);
1573 error (_("No tracepoints defined, not starting trace"));
1574 }
1575
1576 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
1577 {
1578 if (t->enable_state == bp_enabled)
d914c394
SS
1579 any_enabled = 1;
1580
1581 if ((t->type == bp_fast_tracepoint
1582 ? may_insert_fast_tracepoints
1583 : may_insert_tracepoints))
1584 ++num_to_download;
1585 else
1586 warning (_("May not insert %stracepoints, skipping tracepoint %d"),
1587 (t->type == bp_fast_tracepoint ? "fast " : ""), t->number);
76a2b958
SS
1588 }
1589
1590 /* No point in tracing with only disabled tracepoints. */
1591 if (!any_enabled)
1592 {
1593 VEC_free (breakpoint_p, tp_vec);
1594 error (_("No tracepoints enabled, not starting trace"));
1595 }
1596
d914c394
SS
1597 if (num_to_download <= 0)
1598 {
1599 VEC_free (breakpoint_p, tp_vec);
1600 error (_("No tracepoints that may be downloaded, not starting trace"));
1601 }
1602
76a2b958
SS
1603 target_trace_init ();
1604
35b1e5cc 1605 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
7a697b8d 1606 {
d914c394
SS
1607 if ((t->type == bp_fast_tracepoint
1608 ? !may_insert_fast_tracepoints
1609 : !may_insert_tracepoints))
1610 continue;
1611
35b1e5cc
SS
1612 t->number_on_target = 0;
1613 target_download_tracepoint (t);
1614 t->number_on_target = t->number;
7a697b8d 1615 }
35b1e5cc 1616 VEC_free (breakpoint_p, tp_vec);
76a2b958 1617
00bf0b85 1618 /* Send down all the trace state variables too. */
35b1e5cc 1619 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
782b2b07 1620 {
00bf0b85 1621 target_download_trace_state_variable (tsv);
782b2b07 1622 }
35b1e5cc
SS
1623
1624 /* Tell target to treat text-like sections as transparent. */
1625 target_trace_set_readonly_regions ();
4daf5ac0
SS
1626 /* Set some mode flags. */
1627 target_set_disconnected_tracing (disconnected_tracing);
1628 target_set_circular_trace_buffer (circular_trace_buffer);
1042e4c0 1629
35b1e5cc
SS
1630 /* Now insert traps and begin collecting data. */
1631 target_trace_start ();
1042e4c0 1632
35b1e5cc
SS
1633 /* Reset our local state. */
1634 set_traceframe_num (-1);
1635 set_tracepoint_num (-1);
1636 set_traceframe_context (NULL);
00bf0b85 1637 current_trace_status()->running = 1;
b3b9301e 1638 clear_traceframe_info ();
1042e4c0
SS
1639}
1640
f224b49d
VP
1641/* tstart command:
1642
1643 Tell target to clear any previous trace experiment.
1644 Walk the list of tracepoints, and send them (and their actions)
1645 to the target. If no errors,
1646 Tell target to start a new trace experiment. */
1647
1648static void
1649trace_start_command (char *args, int from_tty)
1650{
1651 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1652
615bcdef
SS
1653 if (current_trace_status ()->running)
1654 {
1655 if (from_tty
1656 && !query (_("A trace is running already. Start a new run? ")))
1657 error (_("New trace run not started."));
1658 }
1659
f224b49d
VP
1660 start_tracing ();
1661}
1662
c906108c
SS
1663/* tstop command */
1664static void
fba45db2 1665trace_stop_command (char *args, int from_tty)
d183932d 1666{
615bcdef
SS
1667 if (!current_trace_status ()->running)
1668 error (_("Trace is not running."));
1669
35b1e5cc 1670 stop_tracing ();
c906108c
SS
1671}
1672
d5551862 1673void
f224b49d 1674stop_tracing (void)
d5551862 1675{
35b1e5cc 1676 target_trace_stop ();
c378eb4e 1677 /* Should change in response to reply? */
00bf0b85 1678 current_trace_status ()->running = 0;
d5551862
SS
1679}
1680
c906108c
SS
1681/* tstatus command */
1682static void
fba45db2 1683trace_status_command (char *args, int from_tty)
d183932d 1684{
00bf0b85
SS
1685 struct trace_status *ts = current_trace_status ();
1686 int status;
35b1e5cc 1687
00bf0b85
SS
1688 status = target_get_trace_status (ts);
1689
1690 if (status == -1)
1691 {
1692 if (ts->from_file)
1693 printf_filtered (_("Using a trace file.\n"));
1694 else
1695 {
1696 printf_filtered (_("Trace can not be run on this target.\n"));
1697 return;
1698 }
1699 }
1700
1701 if (!ts->running_known)
1702 {
1703 printf_filtered (_("Run/stop status is unknown.\n"));
1704 }
1705 else if (ts->running)
c906108c 1706 {
35b1e5cc 1707 printf_filtered (_("Trace is running on the target.\n"));
c906108c
SS
1708 }
1709 else
00bf0b85
SS
1710 {
1711 switch (ts->stop_reason)
1712 {
1713 case trace_never_run:
1714 printf_filtered (_("No trace has been run on the target.\n"));
1715 break;
1716 case tstop_command:
1717 printf_filtered (_("Trace stopped by a tstop command.\n"));
1718 break;
1719 case trace_buffer_full:
1720 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1721 break;
1722 case trace_disconnected:
1723 printf_filtered (_("Trace stopped because of disconnection.\n"));
1724 break;
1725 case tracepoint_passcount:
00bf0b85
SS
1726 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1727 ts->stopping_tracepoint);
1728 break;
6c28cbf2
SS
1729 case tracepoint_error:
1730 if (ts->stopping_tracepoint)
3e43a32a
MS
1731 printf_filtered (_("Trace stopped by an "
1732 "error (%s, tracepoint %d).\n"),
6c28cbf2
SS
1733 ts->error_desc, ts->stopping_tracepoint);
1734 else
1735 printf_filtered (_("Trace stopped by an error (%s).\n"),
1736 ts->error_desc);
1737 break;
00bf0b85
SS
1738 case trace_stop_reason_unknown:
1739 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1740 break;
1741 default:
1742 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1743 ts->stop_reason);
1744 break;
1745 }
1746 }
1747
4daf5ac0
SS
1748 if (ts->traceframes_created >= 0
1749 && ts->traceframe_count != ts->traceframes_created)
1750 {
3e43a32a
MS
1751 printf_filtered (_("Buffer contains %d trace "
1752 "frames (of %d created total).\n"),
4daf5ac0
SS
1753 ts->traceframe_count, ts->traceframes_created);
1754 }
1755 else if (ts->traceframe_count >= 0)
00bf0b85
SS
1756 {
1757 printf_filtered (_("Collected %d trace frames.\n"),
1758 ts->traceframe_count);
1759 }
1760
4daf5ac0 1761 if (ts->buffer_free >= 0)
00bf0b85 1762 {
4daf5ac0
SS
1763 if (ts->buffer_size >= 0)
1764 {
1765 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1766 ts->buffer_free, ts->buffer_size);
1767 if (ts->buffer_size > 0)
1768 printf_filtered (_(" (%d%% full)"),
1769 ((int) ((((long long) (ts->buffer_size
1770 - ts->buffer_free)) * 100)
1771 / ts->buffer_size)));
1772 printf_filtered (_(".\n"));
1773 }
1774 else
1775 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1776 ts->buffer_free);
00bf0b85 1777 }
35b1e5cc 1778
33da3f1c
SS
1779 if (ts->disconnected_tracing)
1780 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1781 else
1782 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1783
1784 if (ts->circular_buffer)
1785 printf_filtered (_("Trace buffer is circular.\n"));
1786
00bf0b85 1787 /* Now report on what we're doing with tfind. */
35b1e5cc
SS
1788 if (traceframe_number >= 0)
1789 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1790 traceframe_number, tracepoint_number);
1791 else
1792 printf_filtered (_("Not looking at any trace frame.\n"));
c906108c
SS
1793}
1794
f224b49d
VP
1795/* Report the trace status to uiout, in a way suitable for MI, and not
1796 suitable for CLI. If ON_STOP is true, suppress a few fields that
1797 are not meaningful in the -trace-stop response.
1798
1799 The implementation is essentially parallel to trace_status_command, but
1800 merging them will result in unreadable code. */
1801void
1802trace_status_mi (int on_stop)
1803{
1804 struct trace_status *ts = current_trace_status ();
1805 int status;
f224b49d
VP
1806
1807 status = target_get_trace_status (ts);
1808
1809 if (status == -1 && !ts->from_file)
1810 {
1811 ui_out_field_string (uiout, "supported", "0");
1812 return;
1813 }
1814
1815 if (ts->from_file)
1816 ui_out_field_string (uiout, "supported", "file");
1817 else if (!on_stop)
1818 ui_out_field_string (uiout, "supported", "1");
1819
1820 gdb_assert (ts->running_known);
1821
1822 if (ts->running)
1823 {
1824 ui_out_field_string (uiout, "running", "1");
1825
1826 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1827 Given that the frontend gets the status either on -trace-stop, or from
1828 -trace-status after re-connection, it does not seem like this
1829 information is necessary for anything. It is not necessary for either
1830 figuring the vital state of the target nor for navigation of trace
1831 frames. If the frontend wants to show the current state is some
1832 configure dialog, it can request the value when such dialog is
1833 invoked by the user. */
1834 }
1835 else
1836 {
1837 char *stop_reason = NULL;
1838 int stopping_tracepoint = -1;
1839
1840 if (!on_stop)
1841 ui_out_field_string (uiout, "running", "0");
1842
1843 if (ts->stop_reason != trace_stop_reason_unknown)
1844 {
1845 switch (ts->stop_reason)
1846 {
1847 case tstop_command:
1848 stop_reason = "request";
1849 break;
1850 case trace_buffer_full:
1851 stop_reason = "overflow";
1852 break;
1853 case trace_disconnected:
1854 stop_reason = "disconnection";
1855 break;
1856 case tracepoint_passcount:
1857 stop_reason = "passcount";
1858 stopping_tracepoint = ts->stopping_tracepoint;
1859 break;
6c28cbf2
SS
1860 case tracepoint_error:
1861 stop_reason = "error";
1862 stopping_tracepoint = ts->stopping_tracepoint;
1863 break;
f224b49d
VP
1864 }
1865
1866 if (stop_reason)
1867 {
1868 ui_out_field_string (uiout, "stop-reason", stop_reason);
1869 if (stopping_tracepoint != -1)
1870 ui_out_field_int (uiout, "stopping-tracepoint",
1871 stopping_tracepoint);
6c28cbf2
SS
1872 if (ts->stop_reason == tracepoint_error)
1873 ui_out_field_string (uiout, "error-description",
1874 ts->error_desc);
f224b49d
VP
1875 }
1876 }
1877 }
1878
a97153c7 1879 if (ts->traceframe_count != -1)
f224b49d 1880 ui_out_field_int (uiout, "frames", ts->traceframe_count);
87290684
SS
1881 if (ts->traceframes_created != -1)
1882 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
a97153c7
PA
1883 if (ts->buffer_size != -1)
1884 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1885 if (ts->buffer_free != -1)
1886 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1887
1888 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
1889 ui_out_field_int (uiout, "circular", ts->circular_buffer);
f224b49d
VP
1890}
1891
33da3f1c
SS
1892/* This function handles the details of what to do about an ongoing
1893 tracing run if the user has asked to detach or otherwise disconnect
1894 from the target. */
d5551862 1895void
33da3f1c 1896disconnect_tracing (int from_tty)
d5551862 1897{
00bf0b85
SS
1898 /* It can happen that the target that was tracing went away on its
1899 own, and we didn't notice. Get a status update, and if the
1900 current target doesn't even do tracing, then assume it's not
1901 running anymore. */
1902 if (target_get_trace_status (current_trace_status ()) < 0)
1903 current_trace_status ()->running = 0;
1904
33da3f1c
SS
1905 /* If running interactively, give the user the option to cancel and
1906 then decide what to do differently with the run. Scripts are
1907 just going to disconnect and let the target deal with it,
1908 according to how it's been instructed previously via
1909 disconnected-tracing. */
00bf0b85 1910 if (current_trace_status ()->running && from_tty)
d5551862 1911 {
33da3f1c
SS
1912 if (current_trace_status ()->disconnected_tracing)
1913 {
3e43a32a
MS
1914 if (!query (_("Trace is running and will "
1915 "continue after detach; detach anyway? ")))
33da3f1c
SS
1916 error (_("Not confirmed."));
1917 }
1918 else
1919 {
3e43a32a
MS
1920 if (!query (_("Trace is running but will "
1921 "stop on detach; detach anyway? ")))
33da3f1c
SS
1922 error (_("Not confirmed."));
1923 }
d5551862 1924 }
8b9b7ef8
SS
1925
1926 /* Also we want to be out of tfind mode, otherwise things can get
1927 confusing upon reconnection. Just use these calls instead of
1928 full tfind_1 behavior because we're in the middle of detaching,
1929 and there's no point to updating current stack frame etc. */
e6e4e701 1930 set_current_traceframe (-1);
8b9b7ef8 1931 set_traceframe_context (NULL);
d5551862
SS
1932}
1933
d183932d 1934/* Worker function for the various flavors of the tfind command. */
f197e0f1
VP
1935void
1936tfind_1 (enum trace_find_type type, int num,
1937 ULONGEST addr1, ULONGEST addr2,
1938 int from_tty)
c906108c
SS
1939{
1940 int target_frameno = -1, target_tracept = -1;
2ce6d6bf 1941 struct frame_id old_frame_id = null_frame_id;
d5551862 1942 struct breakpoint *tp;
c906108c 1943
2ce6d6bf
SS
1944 /* Only try to get the current stack frame if we have a chance of
1945 succeeding. In particular, if we're trying to get a first trace
1946 frame while all threads are running, it's not going to succeed,
1947 so leave it with a default value and let the frame comparison
1948 below (correctly) decide to print out the source location of the
1949 trace frame. */
1950 if (!(type == tfind_number && num == -1)
1951 && (has_stack_frames () || traceframe_number >= 0))
1952 old_frame_id = get_frame_id (get_current_frame ());
c906108c 1953
35b1e5cc
SS
1954 target_frameno = target_trace_find (type, num, addr1, addr2,
1955 &target_tracept);
1956
1957 if (type == tfind_number
1958 && num == -1
1959 && target_frameno == -1)
1960 {
1961 /* We told the target to get out of tfind mode, and it did. */
1962 }
1963 else if (target_frameno == -1)
1964 {
2ce6d6bf 1965 /* A request for a non-existent trace frame has failed.
35b1e5cc
SS
1966 Our response will be different, depending on FROM_TTY:
1967
1968 If FROM_TTY is true, meaning that this command was
1969 typed interactively by the user, then give an error
1970 and DO NOT change the state of traceframe_number etc.
1971
1972 However if FROM_TTY is false, meaning that we're either
1973 in a script, a loop, or a user-defined command, then
1974 DON'T give an error, but DO change the state of
1975 traceframe_number etc. to invalid.
1976
1977 The rationalle is that if you typed the command, you
1978 might just have committed a typo or something, and you'd
1979 like to NOT lose your current debugging state. However
1980 if you're in a user-defined command or especially in a
1981 loop, then you need a way to detect that the command
1982 failed WITHOUT aborting. This allows you to write
1983 scripts that search thru the trace buffer until the end,
1984 and then continue on to do something else. */
1985
1986 if (from_tty)
1987 error (_("Target failed to find requested trace frame."));
1988 else
1989 {
1990 if (info_verbose)
1991 printf_filtered ("End of trace buffer.\n");
c378eb4e 1992#if 0 /* dubious now? */
35b1e5cc
SS
1993 /* The following will not recurse, since it's
1994 special-cased. */
1995 trace_find_command ("-1", from_tty);
1996#endif
1997 }
1998 }
1999
d5551862
SS
2000 tp = get_tracepoint_by_number_on_target (target_tracept);
2001
35f196d9 2002 reinit_frame_cache ();
c906108c 2003 registers_changed ();
2f4d8875 2004 target_dcache_invalidate ();
c906108c 2005 set_traceframe_num (target_frameno);
b3b9301e 2006 clear_traceframe_info ();
d5551862 2007 set_tracepoint_num (tp ? tp->number : target_tracept);
c906108c 2008 if (target_frameno == -1)
fb14de7b 2009 set_traceframe_context (NULL);
c906108c 2010 else
fb14de7b 2011 set_traceframe_context (get_current_frame ());
c906108c 2012
f197e0f1
VP
2013 if (traceframe_number >= 0)
2014 {
2015 /* Use different branches for MI and CLI to make CLI messages
2016 i18n-eable. */
2017 if (ui_out_is_mi_like_p (uiout))
2018 {
2019 ui_out_field_string (uiout, "found", "1");
2020 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2021 ui_out_field_int (uiout, "traceframe", traceframe_number);
2022 }
2023 else
2024 {
2025 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2026 traceframe_number, tracepoint_number);
2027 }
2028 }
2029 else
2030 {
2031 if (ui_out_is_mi_like_p (uiout))
2032 ui_out_field_string (uiout, "found", "0");
4136fdd2
SS
2033 else if (type == tfind_number && num == -1)
2034 printf_unfiltered (_("No longer looking at any trace frame\n"));
c378eb4e 2035 else /* This case may never occur, check. */
4136fdd2 2036 printf_unfiltered (_("No trace frame found\n"));
f197e0f1
VP
2037 }
2038
00bf0b85
SS
2039 /* If we're in nonstop mode and getting out of looking at trace
2040 frames, there won't be any current frame to go back to and
2041 display. */
2042 if (from_tty
2043 && (has_stack_frames () || traceframe_number >= 0))
c906108c 2044 {
0faf0076 2045 enum print_what print_what;
c906108c 2046
2ce6d6bf 2047 /* NOTE: in imitation of the step command, try to determine
d183932d
MS
2048 whether we have made a transition from one function to
2049 another. If so, we'll print the "stack frame" (ie. the new
2050 function and it's arguments) -- otherwise we'll just show the
fb14de7b
UW
2051 new source line. */
2052
2053 if (frame_id_eq (old_frame_id,
2054 get_frame_id (get_current_frame ())))
0faf0076 2055 print_what = SRC_LINE;
c906108c 2056 else
0faf0076 2057 print_what = SRC_AND_LOC;
c906108c 2058
b04f3ab4 2059 print_stack_frame (get_selected_frame (NULL), 1, print_what);
c906108c
SS
2060 do_displays ();
2061 }
2062}
2063
2064/* trace_find_command takes a trace frame number n,
2065 sends "QTFrame:<n>" to the target,
2066 and accepts a reply that may contain several optional pieces
2067 of information: a frame number, a tracepoint number, and an
2068 indication of whether this is a trap frame or a stepping frame.
2069
2070 The minimal response is just "OK" (which indicates that the
2071 target does not give us a frame number or a tracepoint number).
2072 Instead of that, the target may send us a string containing
2073 any combination of:
c5aa993b
JM
2074 F<hexnum> (gives the selected frame number)
2075 T<hexnum> (gives the selected tracepoint number)
2076 */
c906108c
SS
2077
2078/* tfind command */
2079static void
fba45db2 2080trace_find_command (char *args, int from_tty)
c378eb4e 2081{ /* This should only be called with a numeric argument. */
c906108c 2082 int frameno = -1;
c906108c 2083
00bf0b85 2084 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2085 error (_("May not look at trace frames while trace is running."));
35b1e5cc
SS
2086
2087 if (args == 0 || *args == 0)
2088 { /* TFIND with no args means find NEXT trace frame. */
2089 if (traceframe_number == -1)
c378eb4e 2090 frameno = 0; /* "next" is first one. */
35b1e5cc
SS
2091 else
2092 frameno = traceframe_number + 1;
2093 }
2094 else if (0 == strcmp (args, "-"))
c906108c 2095 {
35b1e5cc
SS
2096 if (traceframe_number == -1)
2097 error (_("not debugging trace buffer"));
2098 else if (from_tty && traceframe_number == 0)
2099 error (_("already at start of trace buffer"));
2100
2101 frameno = traceframe_number - 1;
2102 }
2103 /* A hack to work around eval's need for fp to have been collected. */
2104 else if (0 == strcmp (args, "-1"))
2105 frameno = -1;
2106 else
2107 frameno = parse_and_eval_long (args);
c906108c 2108
35b1e5cc
SS
2109 if (frameno < -1)
2110 error (_("invalid input (%d is less than zero)"), frameno);
c906108c 2111
f197e0f1 2112 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
c906108c
SS
2113}
2114
2115/* tfind end */
2116static void
fba45db2 2117trace_find_end_command (char *args, int from_tty)
c906108c
SS
2118{
2119 trace_find_command ("-1", from_tty);
2120}
2121
2122/* tfind none */
2123static void
fba45db2 2124trace_find_none_command (char *args, int from_tty)
c906108c
SS
2125{
2126 trace_find_command ("-1", from_tty);
2127}
2128
2129/* tfind start */
2130static void
fba45db2 2131trace_find_start_command (char *args, int from_tty)
c906108c
SS
2132{
2133 trace_find_command ("0", from_tty);
2134}
2135
2136/* tfind pc command */
2137static void
fba45db2 2138trace_find_pc_command (char *args, int from_tty)
d183932d 2139{
c906108c 2140 CORE_ADDR pc;
c906108c 2141
00bf0b85 2142 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2143 error (_("May not look at trace frames while trace is running."));
c906108c 2144
35b1e5cc
SS
2145 if (args == 0 || *args == 0)
2146 pc = regcache_read_pc (get_current_regcache ());
c906108c 2147 else
35b1e5cc
SS
2148 pc = parse_and_eval_address (args);
2149
f197e0f1 2150 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
c906108c
SS
2151}
2152
2153/* tfind tracepoint command */
2154static void
fba45db2 2155trace_find_tracepoint_command (char *args, int from_tty)
d183932d 2156{
c906108c 2157 int tdp;
d5551862 2158 struct breakpoint *tp;
c906108c 2159
00bf0b85 2160 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2161 error (_("May not look at trace frames while trace is running."));
383e5f85 2162
35b1e5cc
SS
2163 if (args == 0 || *args == 0)
2164 {
2165 if (tracepoint_number == -1)
2166 error (_("No current tracepoint -- please supply an argument."));
c906108c 2167 else
c378eb4e 2168 tdp = tracepoint_number; /* Default is current TDP. */
c906108c
SS
2169 }
2170 else
35b1e5cc
SS
2171 tdp = parse_and_eval_long (args);
2172
2173 /* If we have the tracepoint on hand, use the number that the
2174 target knows about (which may be different if we disconnected
2175 and reconnected). */
2176 tp = get_tracepoint (tdp);
2177 if (tp)
2178 tdp = tp->number_on_target;
2179
f197e0f1 2180 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
c906108c
SS
2181}
2182
2183/* TFIND LINE command:
c5aa993b 2184
c906108c 2185 This command will take a sourceline for argument, just like BREAK
d183932d 2186 or TRACE (ie. anything that "decode_line_1" can handle).
c5aa993b 2187
c906108c
SS
2188 With no argument, this command will find the next trace frame
2189 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2190
2191static void
fba45db2 2192trace_find_line_command (char *args, int from_tty)
d183932d 2193{
c906108c
SS
2194 static CORE_ADDR start_pc, end_pc;
2195 struct symtabs_and_lines sals;
2196 struct symtab_and_line sal;
c906108c
SS
2197 struct cleanup *old_chain;
2198
00bf0b85 2199 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2200 error (_("May not look at trace frames while trace is running."));
5af949e3 2201
35b1e5cc
SS
2202 if (args == 0 || *args == 0)
2203 {
2204 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2205 sals.nelts = 1;
2206 sals.sals = (struct symtab_and_line *)
2207 xmalloc (sizeof (struct symtab_and_line));
2208 sals.sals[0] = sal;
2209 }
2210 else
42e08e69 2211 {
35b1e5cc
SS
2212 sals = decode_line_spec (args, 1);
2213 sal = sals.sals[0];
2214 }
2215
2216 old_chain = make_cleanup (xfree, sals.sals);
2217 if (sal.symtab == 0)
42e08e69
SS
2218 error (_("No line number information available."));
2219
2220 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
35b1e5cc
SS
2221 {
2222 if (start_pc == end_pc)
2223 {
2224 printf_filtered ("Line %d of \"%s\"",
2225 sal.line, sal.symtab->filename);
2226 wrap_here (" ");
2227 printf_filtered (" is at address ");
2228 print_address (get_current_arch (), start_pc, gdb_stdout);
2229 wrap_here (" ");
2230 printf_filtered (" but contains no code.\n");
2231 sal = find_pc_line (start_pc, 0);
2232 if (sal.line > 0
2233 && find_line_pc_range (sal, &start_pc, &end_pc)
2234 && start_pc != end_pc)
2235 printf_filtered ("Attempting to find line %d instead.\n",
2236 sal.line);
2237 else
2238 error (_("Cannot find a good line."));
2239 }
2240 }
2241 else
2242 /* Is there any case in which we get here, and have an address
2243 which the user would want to see? If we have debugging
2244 symbols and no line numbers? */
2245 error (_("Line number %d is out of range for \"%s\"."),
2246 sal.line, sal.symtab->filename);
2247
2248 /* Find within range of stated line. */
2249 if (args && *args)
f197e0f1 2250 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
c906108c 2251 else
f197e0f1 2252 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
35b1e5cc 2253 do_cleanups (old_chain);
c906108c
SS
2254}
2255
2256/* tfind range command */
2257static void
fba45db2 2258trace_find_range_command (char *args, int from_tty)
104c1213 2259{
c906108c
SS
2260 static CORE_ADDR start, stop;
2261 char *tmp;
2262
00bf0b85 2263 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2264 error (_("May not look at trace frames while trace is running."));
c906108c 2265
35b1e5cc
SS
2266 if (args == 0 || *args == 0)
2267 { /* XXX FIXME: what should default behavior be? */
2268 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2269 return;
2270 }
c906108c 2271
35b1e5cc
SS
2272 if (0 != (tmp = strchr (args, ',')))
2273 {
c378eb4e 2274 *tmp++ = '\0'; /* Terminate start address. */
35b1e5cc
SS
2275 while (isspace ((int) *tmp))
2276 tmp++;
2277 start = parse_and_eval_address (args);
2278 stop = parse_and_eval_address (tmp);
c906108c
SS
2279 }
2280 else
c378eb4e 2281 { /* No explicit end address? */
35b1e5cc
SS
2282 start = parse_and_eval_address (args);
2283 stop = start + 1; /* ??? */
2284 }
2285
f197e0f1 2286 tfind_1 (tfind_range, 0, start, stop, from_tty);
c906108c
SS
2287}
2288
2289/* tfind outside command */
2290static void
fba45db2 2291trace_find_outside_command (char *args, int from_tty)
104c1213 2292{
c906108c
SS
2293 CORE_ADDR start, stop;
2294 char *tmp;
2295
00bf0b85 2296 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2297 error (_("May not look at trace frames while trace is running."));
c906108c 2298
35b1e5cc 2299 if (args == 0 || *args == 0)
c378eb4e 2300 { /* XXX FIXME: what should default behavior be? */
35b1e5cc
SS
2301 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2302 return;
2303 }
c906108c 2304
35b1e5cc
SS
2305 if (0 != (tmp = strchr (args, ',')))
2306 {
c378eb4e 2307 *tmp++ = '\0'; /* Terminate start address. */
35b1e5cc
SS
2308 while (isspace ((int) *tmp))
2309 tmp++;
2310 start = parse_and_eval_address (args);
2311 stop = parse_and_eval_address (tmp);
c906108c
SS
2312 }
2313 else
c378eb4e 2314 { /* No explicit end address? */
35b1e5cc
SS
2315 start = parse_and_eval_address (args);
2316 stop = start + 1; /* ??? */
2317 }
2318
f197e0f1 2319 tfind_1 (tfind_outside, 0, start, stop, from_tty);
c906108c
SS
2320}
2321
c906108c
SS
2322/* info scope command: list the locals for a scope. */
2323static void
fba45db2 2324scope_info (char *args, int from_tty)
c906108c 2325{
c906108c
SS
2326 struct symtabs_and_lines sals;
2327 struct symbol *sym;
2328 struct minimal_symbol *msym;
2329 struct block *block;
2330 char **canonical, *symname, *save_args = args;
de4f826b
DC
2331 struct dict_iterator iter;
2332 int j, count = 0;
768a979c
UW
2333 struct gdbarch *gdbarch;
2334 int regno;
c906108c
SS
2335
2336 if (args == 0 || *args == 0)
3e43a32a
MS
2337 error (_("requires an argument (function, "
2338 "line or *addr) to define a scope"));
c906108c 2339
68219205 2340 sals = decode_line_1 (&args, 1, NULL, 0, &canonical, NULL);
c906108c 2341 if (sals.nelts == 0)
c378eb4e 2342 return; /* Presumably decode_line_1 has already warned. */
c906108c 2343
c378eb4e 2344 /* Resolve line numbers to PC. */
c906108c
SS
2345 resolve_sal_pc (&sals.sals[0]);
2346 block = block_for_pc (sals.sals[0].pc);
2347
2348 while (block != 0)
2349 {
c378eb4e 2350 QUIT; /* Allow user to bail out with ^C. */
de4f826b 2351 ALL_BLOCK_SYMBOLS (block, iter, sym)
c906108c 2352 {
c378eb4e 2353 QUIT; /* Allow user to bail out with ^C. */
c906108c
SS
2354 if (count == 0)
2355 printf_filtered ("Scope for %s:\n", save_args);
2356 count++;
e88c90f2 2357
3567439c 2358 symname = SYMBOL_PRINT_NAME (sym);
c906108c 2359 if (symname == NULL || *symname == '\0')
c378eb4e 2360 continue; /* Probably botched, certainly useless. */
c906108c 2361
768a979c
UW
2362 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2363
c906108c 2364 printf_filtered ("Symbol %s is ", symname);
c5aa993b
JM
2365 switch (SYMBOL_CLASS (sym))
2366 {
2367 default:
c378eb4e 2368 case LOC_UNDEF: /* Messed up symbol? */
c5aa993b
JM
2369 printf_filtered ("a bogus symbol, class %d.\n",
2370 SYMBOL_CLASS (sym));
c378eb4e 2371 count--; /* Don't count this one. */
c5aa993b
JM
2372 continue;
2373 case LOC_CONST:
104c1213 2374 printf_filtered ("a constant with value %ld (0x%lx)",
c5aa993b
JM
2375 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2376 break;
2377 case LOC_CONST_BYTES:
2378 printf_filtered ("constant bytes: ");
2379 if (SYMBOL_TYPE (sym))
2380 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2381 fprintf_filtered (gdb_stdout, " %02x",
2382 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2383 break;
2384 case LOC_STATIC:
2385 printf_filtered ("in static storage at address ");
5af949e3
UW
2386 printf_filtered ("%s", paddress (gdbarch,
2387 SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2388 break;
2389 case LOC_REGISTER:
768a979c
UW
2390 /* GDBARCH is the architecture associated with the objfile
2391 the symbol is defined in; the target architecture may be
2392 different, and may provide additional registers. However,
2393 we do not know the target architecture at this point.
2394 We assume the objfile architecture will contain all the
2395 standard registers that occur in debug info in that
2396 objfile. */
3e43a32a
MS
2397 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2398 gdbarch);
768a979c 2399
2a2d4dc3
AS
2400 if (SYMBOL_IS_ARGUMENT (sym))
2401 printf_filtered ("an argument in register $%s",
768a979c 2402 gdbarch_register_name (gdbarch, regno));
2a2d4dc3
AS
2403 else
2404 printf_filtered ("a local variable in register $%s",
768a979c 2405 gdbarch_register_name (gdbarch, regno));
c5aa993b
JM
2406 break;
2407 case LOC_ARG:
c5aa993b
JM
2408 printf_filtered ("an argument at stack/frame offset %ld",
2409 SYMBOL_VALUE (sym));
2410 break;
2411 case LOC_LOCAL:
2412 printf_filtered ("a local variable at frame offset %ld",
2413 SYMBOL_VALUE (sym));
2414 break;
2415 case LOC_REF_ARG:
2416 printf_filtered ("a reference argument at offset %ld",
2417 SYMBOL_VALUE (sym));
2418 break;
c5aa993b 2419 case LOC_REGPARM_ADDR:
768a979c 2420 /* Note comment at LOC_REGISTER. */
3e43a32a
MS
2421 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2422 gdbarch);
c5aa993b 2423 printf_filtered ("the address of an argument, in register $%s",
768a979c 2424 gdbarch_register_name (gdbarch, regno));
c5aa993b
JM
2425 break;
2426 case LOC_TYPEDEF:
2427 printf_filtered ("a typedef.\n");
2428 continue;
2429 case LOC_LABEL:
2430 printf_filtered ("a label at address ");
5af949e3
UW
2431 printf_filtered ("%s", paddress (gdbarch,
2432 SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2433 break;
2434 case LOC_BLOCK:
2435 printf_filtered ("a function at address ");
5af949e3
UW
2436 printf_filtered ("%s",
2437 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
c5aa993b 2438 break;
c5aa993b 2439 case LOC_UNRESOLVED:
3567439c 2440 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
450bd37b 2441 NULL, NULL);
c5aa993b
JM
2442 if (msym == NULL)
2443 printf_filtered ("Unresolved Static");
2444 else
2445 {
2446 printf_filtered ("static storage at address ");
5af949e3
UW
2447 printf_filtered ("%s",
2448 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
c5aa993b
JM
2449 }
2450 break;
2451 case LOC_OPTIMIZED_OUT:
2452 printf_filtered ("optimized out.\n");
2453 continue;
450bd37b 2454 case LOC_COMPUTED:
08922a10
SS
2455 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2456 BLOCK_START (block),
2457 gdb_stdout);
450bd37b 2458 break;
c5aa993b 2459 }
c906108c 2460 if (SYMBOL_TYPE (sym))
c5aa993b 2461 printf_filtered (", length %d.\n",
450bd37b 2462 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
c906108c
SS
2463 }
2464 if (BLOCK_FUNCTION (block))
2465 break;
2466 else
2467 block = BLOCK_SUPERBLOCK (block);
2468 }
2469 if (count <= 0)
2470 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2471 save_args);
2472}
2473
2474/* worker function (cleanup) */
2475static void
710b33bd 2476replace_comma (void *data)
c906108c 2477{
710b33bd 2478 char *comma = data;
c906108c
SS
2479 *comma = ',';
2480}
2481
afd02f27
PA
2482
2483/* Helper for trace_dump_command. Dump the action list starting at
2484 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2485 actions of the body of a while-stepping action. STEPPING_FRAME is
2486 set if the current traceframe was determined to be a while-stepping
2487 traceframe. */
2488
c906108c 2489static void
afd02f27
PA
2490trace_dump_actions (struct command_line *action,
2491 int stepping_actions, int stepping_frame,
2492 int from_tty)
c906108c 2493{
c5aa993b 2494 char *action_exp, *next_comma;
c906108c 2495
afd02f27 2496 for (; action != NULL; action = action->next)
c906108c
SS
2497 {
2498 struct cmd_list_element *cmd;
2499
c378eb4e 2500 QUIT; /* Allow user to bail out with ^C. */
a7bdde9e 2501 action_exp = action->line;
104c1213 2502 while (isspace ((int) *action_exp))
c906108c
SS
2503 action_exp++;
2504
2505 /* The collection actions to be done while stepping are
c5aa993b 2506 bracketed by the commands "while-stepping" and "end". */
c906108c
SS
2507
2508 if (*action_exp == '#') /* comment line */
2509 continue;
2510
2511 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2512 if (cmd == 0)
8a3fe4f8 2513 error (_("Bad action list item: %s"), action_exp);
c906108c 2514
bbaca940 2515 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
afd02f27
PA
2516 {
2517 int i;
2518
2519 for (i = 0; i < action->body_count; ++i)
2520 trace_dump_actions (action->body_list[i],
2521 1, stepping_frame, from_tty);
2522 }
bbaca940 2523 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
c906108c
SS
2524 {
2525 /* Display the collected data.
d183932d
MS
2526 For the trap frame, display only what was collected at
2527 the trap. Likewise for stepping frames, display only
2528 what was collected while stepping. This means that the
2529 two boolean variables, STEPPING_FRAME and
2530 STEPPING_ACTIONS should be equal. */
c906108c
SS
2531 if (stepping_frame == stepping_actions)
2532 {
c5aa993b 2533 do
c378eb4e
MS
2534 { /* Repeat over a comma-separated list. */
2535 QUIT; /* Allow user to bail out with ^C. */
c5aa993b
JM
2536 if (*action_exp == ',')
2537 action_exp++;
104c1213 2538 while (isspace ((int) *action_exp))
c5aa993b
JM
2539 action_exp++;
2540
2541 next_comma = strchr (action_exp, ',');
2542
2543 if (0 == strncasecmp (action_exp, "$reg", 4))
2544 registers_info (NULL, from_tty);
2545 else if (0 == strncasecmp (action_exp, "$loc", 4))
2546 locals_info (NULL, from_tty);
2547 else if (0 == strncasecmp (action_exp, "$arg", 4))
2548 args_info (NULL, from_tty);
2549 else
2550 { /* variable */
2551 if (next_comma)
2552 {
2553 make_cleanup (replace_comma, next_comma);
2554 *next_comma = '\0';
2555 }
2556 printf_filtered ("%s = ", action_exp);
2557 output_command (action_exp, from_tty);
2558 printf_filtered ("\n");
2559 }
2560 if (next_comma)
2561 *next_comma = ',';
2562 action_exp = next_comma;
2563 }
2564 while (action_exp && *action_exp == ',');
c906108c
SS
2565 }
2566 }
2567 }
afd02f27
PA
2568}
2569
2570/* The tdump command. */
2571
2572static void
2573trace_dump_command (char *args, int from_tty)
2574{
2575 struct regcache *regcache;
2576 struct breakpoint *t;
2577 int stepping_frame = 0;
2578 struct bp_location *loc;
2114d44c
SS
2579 char *line, *default_collect_line = NULL;
2580 struct command_line *actions, *default_collect_action = NULL;
2581 struct cleanup *old_chain = NULL;
afd02f27
PA
2582
2583 if (tracepoint_number == -1)
2584 {
2585 warning (_("No current trace frame."));
2586 return;
2587 }
2588
2589 t = get_tracepoint (tracepoint_number);
2590
2591 if (t == NULL)
2592 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2593 tracepoint_number);
2594
2595 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2596 tracepoint_number, traceframe_number);
2597
2598 /* The current frame is a trap frame if the frame PC is equal
2599 to the tracepoint PC. If not, then the current frame was
2600 collected during single-stepping. */
2601
2602 regcache = get_current_regcache ();
2603
2604 /* If the traceframe's address matches any of the tracepoint's
2605 locations, assume it is a direct hit rather than a while-stepping
2606 frame. (FIXME this is not reliable, should record each frame's
2607 type.) */
2608 stepping_frame = 1;
2609 for (loc = t->loc; loc; loc = loc->next)
2610 if (loc->address == regcache_read_pc (regcache))
2611 stepping_frame = 0;
2612
2114d44c
SS
2613 actions = breakpoint_commands (t);
2614
2615 /* If there is a default-collect list, make up a collect command,
2616 prepend to the tracepoint's commands, and pass the whole mess to
2617 the trace dump scanner. We need to validate because
2618 default-collect might have been junked since the trace run. */
2619 if (*default_collect)
2620 {
2621 default_collect_line = xstrprintf ("collect %s", default_collect);
2622 old_chain = make_cleanup (xfree, default_collect_line);
2623 line = default_collect_line;
2624 validate_actionline (&line, t);
2625 default_collect_action = xmalloc (sizeof (struct command_line));
2626 make_cleanup (xfree, default_collect_action);
2627 default_collect_action->next = actions;
2628 default_collect_action->line = line;
2629 actions = default_collect_action;
2630 }
2631
2632 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2633
2634 if (*default_collect)
2635 do_cleanups (old_chain);
c906108c
SS
2636}
2637
409873ef
SS
2638/* Encode a piece of a tracepoint's source-level definition in a form
2639 that is suitable for both protocol and saving in files. */
2640/* This version does not do multiple encodes for long strings; it should
2641 return an offset to the next piece to encode. FIXME */
2642
2643extern int
2644encode_source_string (int tpnum, ULONGEST addr,
2645 char *srctype, char *src, char *buf, int buf_size)
2646{
2647 if (80 + strlen (srctype) > buf_size)
2648 error (_("Buffer too small for source encoding"));
2649 sprintf (buf, "%x:%s:%s:%x:%x:",
3e43a32a
MS
2650 tpnum, phex_nz (addr, sizeof (addr)),
2651 srctype, 0, (int) strlen (src));
409873ef
SS
2652 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2653 error (_("Source string too long for buffer"));
2654 bin2hex (src, buf + strlen (buf), 0);
2655 return -1;
2656}
2657
00bf0b85
SS
2658extern int trace_regblock_size;
2659
011aacb0
VP
2660/* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2661 non-zero, the save is performed on the target, otherwise GDB obtains all
2662 trace data and saves it locally. */
2663
2664void
2665trace_save (const char *filename, int target_does_save)
00bf0b85 2666{
00bf0b85 2667 struct cleanup *cleanup;
011aacb0 2668 char *pathname;
00bf0b85
SS
2669 struct trace_status *ts = current_trace_status ();
2670 int err, status;
2671 FILE *fp;
2672 struct uploaded_tp *uploaded_tps = NULL, *utp;
2673 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2674 int a;
3149d8c1 2675 char *act;
00bf0b85
SS
2676 LONGEST gotten = 0;
2677 ULONGEST offset = 0;
2678#define MAX_TRACE_UPLOAD 2000
2679 gdb_byte buf[MAX_TRACE_UPLOAD];
98e03262 2680 int written;
00bf0b85 2681
00bf0b85
SS
2682 /* If the target is to save the data to a file on its own, then just
2683 send the command and be done with it. */
2684 if (target_does_save)
2685 {
2686 err = target_save_trace_data (filename);
2687 if (err < 0)
2688 error (_("Target failed to save trace data to '%s'."),
2689 filename);
2690 return;
2691 }
2692
2693 /* Get the trace status first before opening the file, so if the
2694 target is losing, we can get out without touching files. */
2695 status = target_get_trace_status (ts);
2696
011aacb0 2697 pathname = tilde_expand (filename);
00bf0b85
SS
2698 cleanup = make_cleanup (xfree, pathname);
2699
105c2d85 2700 fp = fopen (pathname, "wb");
00bf0b85
SS
2701 if (!fp)
2702 error (_("Unable to open file '%s' for saving trace data (%s)"),
011aacb0 2703 filename, safe_strerror (errno));
00bf0b85
SS
2704 make_cleanup_fclose (fp);
2705
2706 /* Write a file header, with a high-bit-set char to indicate a
2707 binary file, plus a hint as what this file is, and a version
2708 number in case of future needs. */
98e03262 2709 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
409873ef 2710 if (written < 1)
98e03262 2711 perror_with_name (pathname);
00bf0b85
SS
2712
2713 /* Write descriptive info. */
2714
2715 /* Write out the size of a register block. */
2716 fprintf (fp, "R %x\n", trace_regblock_size);
2717
2718 /* Write out status of the tracing run (aka "tstatus" info). */
6c28cbf2
SS
2719 fprintf (fp, "status %c;%s",
2720 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
6c28cbf2
SS
2721 if (ts->stop_reason == tracepoint_error)
2722 {
2723 char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
5d502164 2724
6c28cbf2 2725 bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
610197fd 2726 fprintf (fp, ":%s", buf);
6c28cbf2
SS
2727 }
2728 fprintf (fp, ":%x", ts->stopping_tracepoint);
4daf5ac0
SS
2729 if (ts->traceframe_count >= 0)
2730 fprintf (fp, ";tframes:%x", ts->traceframe_count);
2731 if (ts->traceframes_created >= 0)
2732 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2733 if (ts->buffer_free >= 0)
2734 fprintf (fp, ";tfree:%x", ts->buffer_free);
2735 if (ts->buffer_size >= 0)
2736 fprintf (fp, ";tsize:%x", ts->buffer_size);
33da3f1c
SS
2737 if (ts->disconnected_tracing)
2738 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2739 if (ts->circular_buffer)
2740 fprintf (fp, ";circular:%x", ts->circular_buffer);
4daf5ac0 2741 fprintf (fp, "\n");
00bf0b85
SS
2742
2743 /* Note that we want to upload tracepoints and save those, rather
2744 than simply writing out the local ones, because the user may have
2745 changed tracepoints in GDB in preparation for a future tracing
2746 run, or maybe just mass-deleted all types of breakpoints as part
2747 of cleaning up. So as not to contaminate the session, leave the
2748 data in its uploaded form, don't make into real tracepoints. */
2749
2750 /* Get trace state variables first, they may be checked when parsing
2751 uploaded commands. */
2752
2753 target_upload_trace_state_variables (&uploaded_tsvs);
2754
2755 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2756 {
2757 char *buf = "";
2758
2759 if (utsv->name)
2760 {
2761 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2762 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2763 }
2764
2765 fprintf (fp, "tsv %x:%s:%x:%s\n",
2766 utsv->number, phex_nz (utsv->initial_value, 8),
2767 utsv->builtin, buf);
2768
2769 if (utsv->name)
2770 xfree (buf);
2771 }
2772
2773 free_uploaded_tsvs (&uploaded_tsvs);
2774
2775 target_upload_tracepoints (&uploaded_tps);
2776
2777 for (utp = uploaded_tps; utp; utp = utp->next)
2778 {
2779 fprintf (fp, "tp T%x:%s:%c:%x:%x",
2780 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2781 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2782 if (utp->type == bp_fast_tracepoint)
2783 fprintf (fp, ":F%x", utp->orig_size);
2784 if (utp->cond)
2785 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2786 utp->cond);
2787 fprintf (fp, "\n");
3149d8c1 2788 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
00bf0b85 2789 fprintf (fp, "tp A%x:%s:%s\n",
3149d8c1 2790 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
0a2a54b8 2791 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
00bf0b85 2792 fprintf (fp, "tp S%x:%s:%s\n",
3149d8c1 2793 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
409873ef
SS
2794 if (utp->at_string)
2795 {
2796 encode_source_string (utp->number, utp->addr,
2797 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2798 fprintf (fp, "tp Z%s\n", buf);
2799 }
2800 if (utp->cond_string)
2801 {
2802 encode_source_string (utp->number, utp->addr,
3e43a32a
MS
2803 "cond", utp->cond_string,
2804 buf, MAX_TRACE_UPLOAD);
409873ef
SS
2805 fprintf (fp, "tp Z%s\n", buf);
2806 }
3149d8c1 2807 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
409873ef 2808 {
3149d8c1 2809 encode_source_string (utp->number, utp->addr, "cmd", act,
409873ef
SS
2810 buf, MAX_TRACE_UPLOAD);
2811 fprintf (fp, "tp Z%s\n", buf);
2812 }
00bf0b85
SS
2813 }
2814
2815 free_uploaded_tps (&uploaded_tps);
2816
2817 /* Mark the end of the definition section. */
2818 fprintf (fp, "\n");
2819
2820 /* Get and write the trace data proper. We ask for big blocks, in
2821 the hopes of efficiency, but will take less if the target has
2822 packet size limitations or some such. */
2823 while (1)
2824 {
2825 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2826 if (gotten < 0)
2827 error (_("Failure to get requested trace buffer data"));
2828 /* No more data is forthcoming, we're done. */
2829 if (gotten == 0)
2830 break;
98e03262 2831 written = fwrite (buf, gotten, 1, fp);
409873ef 2832 if (written < 1)
98e03262 2833 perror_with_name (pathname);
00bf0b85
SS
2834 offset += gotten;
2835 }
2836
409873ef 2837 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
98e03262 2838 written = fwrite (&gotten, 4, 1, fp);
409873ef 2839 if (written < 1)
98e03262 2840 perror_with_name (pathname);
00bf0b85
SS
2841
2842 do_cleanups (cleanup);
011aacb0
VP
2843}
2844
2845static void
2846trace_save_command (char *args, int from_tty)
2847{
2848 int target_does_save = 0;
2849 char **argv;
2850 char *filename = NULL;
2851 struct cleanup *back_to;
2852
2853 if (args == NULL)
2854 error_no_arg (_("file in which to save trace data"));
2855
2856 argv = gdb_buildargv (args);
2857 back_to = make_cleanup_freeargv (argv);
2858
2859 for (; *argv; ++argv)
2860 {
2861 if (strcmp (*argv, "-r") == 0)
2862 target_does_save = 1;
2863 else if (**argv == '-')
2864 error (_("unknown option `%s'"), *argv);
2865 else
2866 filename = *argv;
2867 }
2868
2869 if (!filename)
2870 error_no_arg (_("file in which to save trace data"));
2871
2872 trace_save (filename, target_does_save);
2873
00bf0b85
SS
2874 if (from_tty)
2875 printf_filtered (_("Trace data saved to file '%s'.\n"), args);
011aacb0
VP
2876
2877 do_cleanups (back_to);
00bf0b85
SS
2878}
2879
d5551862
SS
2880/* Tell the target what to do with an ongoing tracing run if GDB
2881 disconnects for some reason. */
2882
2883void
2884send_disconnected_tracing_value (int value)
2885{
35b1e5cc 2886 target_set_disconnected_tracing (value);
d5551862
SS
2887}
2888
2889static void
2890set_disconnected_tracing (char *args, int from_tty,
2891 struct cmd_list_element *c)
2892{
2893 send_disconnected_tracing_value (disconnected_tracing);
2894}
2895
4daf5ac0
SS
2896static void
2897set_circular_trace_buffer (char *args, int from_tty,
2898 struct cmd_list_element *c)
2899{
2900 target_set_circular_trace_buffer (circular_trace_buffer);
2901}
2902
c906108c
SS
2903/* Convert the memory pointed to by mem into hex, placing result in buf.
2904 * Return a pointer to the last char put in buf (null)
2905 * "stolen" from sparc-stub.c
2906 */
2907
c5aa993b 2908static const char hexchars[] = "0123456789abcdef";
c906108c 2909
47b667de
AC
2910static char *
2911mem2hex (gdb_byte *mem, char *buf, int count)
c906108c 2912{
47b667de 2913 gdb_byte ch;
c906108c
SS
2914
2915 while (count-- > 0)
2916 {
2917 ch = *mem++;
2918
2919 *buf++ = hexchars[ch >> 4];
2920 *buf++ = hexchars[ch & 0xf];
2921 }
2922
2923 *buf = 0;
2924
2925 return buf;
2926}
2927
c5aa993b 2928int
fba45db2 2929get_traceframe_number (void)
c906108c 2930{
c5aa993b 2931 return traceframe_number;
c906108c
SS
2932}
2933
06cd862c
PA
2934/* Make the traceframe NUM be the current trace frame. Does nothing
2935 if NUM is already current. */
2936
2937void
e6e4e701 2938set_current_traceframe (int num)
06cd862c
PA
2939{
2940 int newnum;
2941
2942 if (traceframe_number == num)
2943 {
2944 /* Nothing to do. */
2945 return;
2946 }
2947
2948 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
2949
2950 if (newnum != num)
2951 warning (_("could not change traceframe"));
2952
2953 traceframe_number = newnum;
2954
2955 /* Changing the traceframe changes our view of registers and of the
2956 frame chain. */
2957 registers_changed ();
b3b9301e
PA
2958
2959 clear_traceframe_info ();
06cd862c
PA
2960}
2961
e6e4e701
PA
2962/* Make the traceframe NUM be the current trace frame, and do nothing
2963 more. */
2964
2965void
2966set_traceframe_number (int num)
2967{
2968 traceframe_number = num;
2969}
2970
06cd862c
PA
2971/* A cleanup used when switching away and back from tfind mode. */
2972
2973struct current_traceframe_cleanup
2974{
2975 /* The traceframe we were inspecting. */
2976 int traceframe_number;
2977};
2978
2979static void
2980do_restore_current_traceframe_cleanup (void *arg)
2981{
2982 struct current_traceframe_cleanup *old = arg;
2983
e6e4e701 2984 set_current_traceframe (old->traceframe_number);
06cd862c
PA
2985}
2986
2987static void
2988restore_current_traceframe_cleanup_dtor (void *arg)
2989{
2990 struct current_traceframe_cleanup *old = arg;
2991
2992 xfree (old);
2993}
2994
2995struct cleanup *
2996make_cleanup_restore_current_traceframe (void)
2997{
2998 struct current_traceframe_cleanup *old;
2999
3000 old = xmalloc (sizeof (struct current_traceframe_cleanup));
3001 old->traceframe_number = traceframe_number;
3002
3003 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3004 restore_current_traceframe_cleanup_dtor);
3005}
00bf0b85 3006
e6e4e701
PA
3007struct cleanup *
3008make_cleanup_restore_traceframe_number (void)
3009{
3010 return make_cleanup_restore_integer (&traceframe_number);
3011}
3012
00bf0b85
SS
3013/* Given a number and address, return an uploaded tracepoint with that
3014 number, creating if necessary. */
3015
3016struct uploaded_tp *
3017get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3018{
3019 struct uploaded_tp *utp;
3020
3021 for (utp = *utpp; utp; utp = utp->next)
3022 if (utp->number == num && utp->addr == addr)
3023 return utp;
3024 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3025 memset (utp, 0, sizeof (struct uploaded_tp));
3026 utp->number = num;
3027 utp->addr = addr;
3149d8c1
SS
3028 utp->actions = NULL;
3029 utp->step_actions = NULL;
3030 utp->cmd_strings = NULL;
00bf0b85
SS
3031 utp->next = *utpp;
3032 *utpp = utp;
3033 return utp;
3034}
3035
3036static void
3037free_uploaded_tps (struct uploaded_tp **utpp)
3038{
3039 struct uploaded_tp *next_one;
3040
3041 while (*utpp)
3042 {
3043 next_one = (*utpp)->next;
3044 xfree (*utpp);
3045 *utpp = next_one;
3046 }
3047}
3048
3049/* Given a number and address, return an uploaded tracepoint with that
3050 number, creating if necessary. */
3051
3052struct uploaded_tsv *
3053get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3054{
3055 struct uploaded_tsv *utsv;
3056
3057 for (utsv = *utsvp; utsv; utsv = utsv->next)
3058 if (utsv->number == num)
3059 return utsv;
3060 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3061 memset (utsv, 0, sizeof (struct uploaded_tsv));
3062 utsv->number = num;
3063 utsv->next = *utsvp;
3064 *utsvp = utsv;
3065 return utsv;
3066}
3067
3068static void
3069free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3070{
3071 struct uploaded_tsv *next_one;
3072
3073 while (*utsvp)
3074 {
3075 next_one = (*utsvp)->next;
3076 xfree (*utsvp);
3077 *utsvp = next_one;
3078 }
3079}
3080
3081/* Look for an existing tracepoint that seems similar enough to the
3082 uploaded one. Enablement isn't compared, because the user can
3083 toggle that freely, and may have done so in anticipation of the
3084 next trace run. */
3085
3086struct breakpoint *
3087find_matching_tracepoint (struct uploaded_tp *utp)
3088{
3089 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3090 int ix;
3091 struct breakpoint *t;
3092 struct bp_location *loc;
3093
3094 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, t); ix++)
3095 {
3096 if (t->type == utp->type
3097 && t->step_count == utp->step
3098 && t->pass_count == utp->pass
c378eb4e 3099 /* FIXME also test conditionals and actions. */
00bf0b85
SS
3100 )
3101 {
3102 /* Scan the locations for an address match. */
3103 for (loc = t->loc; loc; loc = loc->next)
3104 {
3105 if (loc->address == utp->addr)
3106 return t;
3107 }
3108 }
3109 }
3110 return NULL;
3111}
3112
3113/* Given a list of tracepoints uploaded from a target, attempt to
3114 match them up with existing tracepoints, and create new ones if not
3115 found. */
3116
3117void
3118merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3119{
3120 struct uploaded_tp *utp;
3121 struct breakpoint *t;
3122
3123 /* Look for GDB tracepoints that match up with our uploaded versions. */
3124 for (utp = *uploaded_tps; utp; utp = utp->next)
3125 {
3126 t = find_matching_tracepoint (utp);
3127 if (t)
3e43a32a
MS
3128 printf_filtered (_("Assuming tracepoint %d is same "
3129 "as target's tracepoint %d at %s.\n"),
3130 t->number, utp->number,
3131 paddress (get_current_arch (), utp->addr));
00bf0b85
SS
3132 else
3133 {
3134 t = create_tracepoint_from_upload (utp);
3135 if (t)
3e43a32a
MS
3136 printf_filtered (_("Created tracepoint %d for "
3137 "target's tracepoint %d at %s.\n"),
3138 t->number, utp->number,
3139 paddress (get_current_arch (), utp->addr));
00bf0b85 3140 else
3e43a32a
MS
3141 printf_filtered (_("Failed to create tracepoint for target's "
3142 "tracepoint %d at %s, skipping it.\n"),
3143 utp->number,
3144 paddress (get_current_arch (), utp->addr));
00bf0b85
SS
3145 }
3146 /* Whether found or created, record the number used by the
3147 target, to help with mapping target tracepoints back to their
3148 counterparts here. */
3149 if (t)
3150 t->number_on_target = utp->number;
3151 }
3152
3153 free_uploaded_tps (uploaded_tps);
3154}
3155
3156/* Trace state variables don't have much to identify them beyond their
3157 name, so just use that to detect matches. */
3158
3159struct trace_state_variable *
3160find_matching_tsv (struct uploaded_tsv *utsv)
3161{
3162 if (!utsv->name)
3163 return NULL;
3164
3165 return find_trace_state_variable (utsv->name);
3166}
3167
3168struct trace_state_variable *
3169create_tsv_from_upload (struct uploaded_tsv *utsv)
3170{
3171 const char *namebase;
3172 char buf[20];
3173 int try_num = 0;
3174 struct trace_state_variable *tsv;
3175
3176 if (utsv->name)
3177 {
3178 namebase = utsv->name;
3179 sprintf (buf, "%s", namebase);
3180 }
3181 else
3182 {
3183 namebase = "__tsv";
3184 sprintf (buf, "%s_%d", namebase, try_num++);
3185 }
3186
3187 /* Fish for a name that is not in use. */
c378eb4e 3188 /* (should check against all internal vars?) */
00bf0b85
SS
3189 while (find_trace_state_variable (buf))
3190 sprintf (buf, "%s_%d", namebase, try_num++);
3191
3192 /* We have an available name, create the variable. */
3193 tsv = create_trace_state_variable (xstrdup (buf));
3194 tsv->initial_value = utsv->initial_value;
3195 tsv->builtin = utsv->builtin;
3196
3197 return tsv;
3198}
3199
3200/* Given a list of uploaded trace state variables, try to match them
3201 up with existing variables, or create additional ones. */
3202
3203void
3204merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3205{
3206 int ix;
3207 struct uploaded_tsv *utsv;
3208 struct trace_state_variable *tsv;
3209 int highest;
3210
3211 /* Most likely some numbers will have to be reassigned as part of
3212 the merge, so clear them all in anticipation. */
3213 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3214 tsv->number = 0;
3215
3216 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3217 {
3218 tsv = find_matching_tsv (utsv);
3219 if (tsv)
417b5110
DJ
3220 {
3221 if (info_verbose)
3e43a32a
MS
3222 printf_filtered (_("Assuming trace state variable $%s "
3223 "is same as target's variable %d.\n"),
417b5110
DJ
3224 tsv->name, utsv->number);
3225 }
00bf0b85
SS
3226 else
3227 {
3228 tsv = create_tsv_from_upload (utsv);
417b5110 3229 if (info_verbose)
3e43a32a
MS
3230 printf_filtered (_("Created trace state variable "
3231 "$%s for target's variable %d.\n"),
417b5110 3232 tsv->name, utsv->number);
00bf0b85
SS
3233 }
3234 /* Give precedence to numberings that come from the target. */
3235 if (tsv)
3236 tsv->number = utsv->number;
3237 }
3238
3239 /* Renumber everything that didn't get a target-assigned number. */
3240 highest = 0;
3241 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3242 if (tsv->number > highest)
3243 highest = tsv->number;
3244
3245 ++highest;
3246 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3247 if (tsv->number == 0)
3248 tsv->number = highest++;
3249
3250 free_uploaded_tsvs (uploaded_tsvs);
3251}
3252
3253/* target tfile command */
3254
3255struct target_ops tfile_ops;
3256
3257/* Fill in tfile_ops with its defined operations and properties. */
3258
3259#define TRACE_HEADER_SIZE 8
3260
98e03262 3261char *trace_filename;
00bf0b85
SS
3262int trace_fd = -1;
3263off_t trace_frames_offset;
3264off_t cur_offset;
e6e4e701 3265int cur_traceframe_number;
00bf0b85
SS
3266int cur_data_size;
3267int trace_regblock_size;
3268
3269static void tfile_interp_line (char *line,
3270 struct uploaded_tp **utpp,
3271 struct uploaded_tsv **utsvp);
3272
9f41c731
PA
3273/* Read SIZE bytes into READBUF from the trace frame, starting at
3274 TRACE_FD's current position. Note that this call `read'
3275 underneath, hence it advances the file's seek position. Throws an
3276 error if the `read' syscall fails, or less than SIZE bytes are
3277 read. */
3278
3279static void
3280tfile_read (gdb_byte *readbuf, int size)
3281{
3282 int gotten;
3283
3284 gotten = read (trace_fd, readbuf, size);
3285 if (gotten < 0)
3286 perror_with_name (trace_filename);
3287 else if (gotten < size)
3288 error (_("Premature end of file while reading trace file"));
3289}
3290
00bf0b85
SS
3291static void
3292tfile_open (char *filename, int from_tty)
3293{
3294 char *temp;
3295 struct cleanup *old_chain;
3296 int flags;
3297 int scratch_chan;
3298 char header[TRACE_HEADER_SIZE];
c378eb4e 3299 char linebuf[1000]; /* Should be max remote packet size or so. */
00bf0b85 3300 char byte;
9f41c731 3301 int bytes, i;
00bf0b85
SS
3302 struct trace_status *ts;
3303 struct uploaded_tp *uploaded_tps = NULL;
3304 struct uploaded_tsv *uploaded_tsvs = NULL;
3305
3306 target_preopen (from_tty);
3307 if (!filename)
3308 error (_("No trace file specified."));
3309
3310 filename = tilde_expand (filename);
3311 if (!IS_ABSOLUTE_PATH(filename))
3312 {
c4f7c687 3313 temp = concat (current_directory, "/", filename, (char *) NULL);
00bf0b85
SS
3314 xfree (filename);
3315 filename = temp;
3316 }
3317
3318 old_chain = make_cleanup (xfree, filename);
3319
3320 flags = O_BINARY | O_LARGEFILE;
3321 flags |= O_RDONLY;
3322 scratch_chan = open (filename, flags, 0);
3323 if (scratch_chan < 0)
3324 perror_with_name (filename);
3325
3326 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3327
c378eb4e 3328 discard_cleanups (old_chain); /* Don't free filename any more. */
00bf0b85
SS
3329 unpush_target (&tfile_ops);
3330
3331 push_target (&tfile_ops);
00bf0b85 3332
98e03262 3333 trace_filename = xstrdup (filename);
00bf0b85
SS
3334 trace_fd = scratch_chan;
3335
3336 bytes = 0;
3337 /* Read the file header and test for validity. */
9f41c731 3338 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
98e03262 3339
00bf0b85
SS
3340 bytes += TRACE_HEADER_SIZE;
3341 if (!(header[0] == 0x7f
3342 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3343 error (_("File is not a valid trace file."));
3344
3345 trace_regblock_size = 0;
3346 ts = current_trace_status ();
3347 /* We know we're working with a file. */
3348 ts->from_file = 1;
3349 /* Set defaults in case there is no status line. */
3350 ts->running_known = 0;
3351 ts->stop_reason = trace_stop_reason_unknown;
3352 ts->traceframe_count = -1;
3353 ts->buffer_free = 0;
33da3f1c
SS
3354 ts->disconnected_tracing = 0;
3355 ts->circular_buffer = 0;
00bf0b85 3356
e6e4e701
PA
3357 cur_traceframe_number = -1;
3358
00bf0b85
SS
3359 /* Read through a section of newline-terminated lines that
3360 define things like tracepoints. */
3361 i = 0;
3362 while (1)
3363 {
9f41c731 3364 tfile_read (&byte, 1);
98e03262 3365
00bf0b85
SS
3366 ++bytes;
3367 if (byte == '\n')
3368 {
3369 /* Empty line marks end of the definition section. */
3370 if (i == 0)
3371 break;
3372 linebuf[i] = '\0';
3373 i = 0;
3374 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3375 }
3376 else
3377 linebuf[i++] = byte;
3378 if (i >= 1000)
3379 error (_("Excessively long lines in trace file"));
3380 }
3381
3382 /* Add the file's tracepoints and variables into the current mix. */
3383
10ef8d6a
PA
3384 /* Get trace state variables first, they may be checked when parsing
3385 uploaded commands. */
00bf0b85
SS
3386 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3387
10ef8d6a
PA
3388 merge_uploaded_tracepoints (&uploaded_tps);
3389
00bf0b85
SS
3390 /* Record the starting offset of the binary trace data. */
3391 trace_frames_offset = bytes;
3392
3393 /* If we don't have a blocksize, we can't interpret the
3394 traceframes. */
3395 if (trace_regblock_size == 0)
3396 error (_("No register block size recorded in trace file"));
3397 if (ts->traceframe_count <= 0)
3398 {
a73c6dcd 3399 warning (_("No traceframes present in this file."));
00bf0b85
SS
3400 return;
3401 }
3402
3403#define TFILE_PID (1)
3404 inferior_appeared (current_inferior (), TFILE_PID);
3405 inferior_ptid = pid_to_ptid (TFILE_PID);
3406 add_thread_silent (inferior_ptid);
3407
3408 post_create_inferior (&tfile_ops, from_tty);
3409
3410#if 0
c378eb4e 3411 /* FIXME this will get defined in MI patch submission. */
00bf0b85
SS
3412 tfind_1 (tfind_number, 0, 0, 0, 0);
3413#endif
3414}
3415
3416/* Interpret the given line from the definitions part of the trace
3417 file. */
3418
3419static void
3420tfile_interp_line (char *line,
3421 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3422{
3423 char *p = line;
3424
3425 if (strncmp (p, "R ", strlen ("R ")) == 0)
3426 {
3427 p += strlen ("R ");
3428 trace_regblock_size = strtol (p, &p, 16);
3429 }
3430 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3431 {
3432 p += strlen ("status ");
3433 parse_trace_status (p, current_trace_status ());
3434 }
3435 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3436 {
3437 p += strlen ("tp ");
3438 parse_tracepoint_definition (p, utpp);
3439 }
3440 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3441 {
3442 p += strlen ("tsv ");
3443 parse_tsv_definition (p, utsvp);
3444 }
3445 else
a73c6dcd 3446 warning (_("Ignoring trace file definition \"%s\""), line);
00bf0b85
SS
3447}
3448
3449/* Parse the part of trace status syntax that is shared between
3450 the remote protocol and the trace file reader. */
3451
00bf0b85
SS
3452void
3453parse_trace_status (char *line, struct trace_status *ts)
3454{
6c28cbf2 3455 char *p = line, *p1, *p2, *p_temp;
00bf0b85
SS
3456 ULONGEST val;
3457
3458 ts->running_known = 1;
3459 ts->running = (*p++ == '1');
3460 ts->stop_reason = trace_stop_reason_unknown;
a609a0c8
PA
3461 xfree (ts->error_desc);
3462 ts->error_desc = NULL;
4daf5ac0
SS
3463 ts->traceframe_count = -1;
3464 ts->traceframes_created = -1;
3465 ts->buffer_free = -1;
3466 ts->buffer_size = -1;
33da3f1c
SS
3467 ts->disconnected_tracing = 0;
3468 ts->circular_buffer = 0;
4daf5ac0 3469
00bf0b85
SS
3470 while (*p++)
3471 {
3472 p1 = strchr (p, ':');
3473 if (p1 == NULL)
3474 error (_("Malformed trace status, at %s\n\
3475Status line: '%s'\n"), p, line);
3476 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3477 {
3478 p = unpack_varlen_hex (++p1, &val);
3479 ts->stop_reason = trace_buffer_full;
3480 }
3481 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3482 {
3483 p = unpack_varlen_hex (++p1, &val);
3484 ts->stop_reason = trace_never_run;
3485 }
3e43a32a
MS
3486 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3487 p1 - p) == 0)
00bf0b85
SS
3488 {
3489 p = unpack_varlen_hex (++p1, &val);
3490 ts->stop_reason = tracepoint_passcount;
3491 ts->stopping_tracepoint = val;
3492 }
3493 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3494 {
3495 p = unpack_varlen_hex (++p1, &val);
3496 ts->stop_reason = tstop_command;
3497 }
33da3f1c
SS
3498 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3499 {
3500 p = unpack_varlen_hex (++p1, &val);
3501 ts->stop_reason = trace_disconnected;
3502 }
6c28cbf2
SS
3503 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3504 {
3505 p2 = strchr (++p1, ':');
3506 if (p2 != p1)
3507 {
3508 int end;
99b5e152
PA
3509
3510 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3511 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
6c28cbf2
SS
3512 ts->error_desc[end] = '\0';
3513 }
a609a0c8
PA
3514 else
3515 ts->error_desc = xstrdup ("");
3516
6c28cbf2
SS
3517 p = unpack_varlen_hex (++p2, &val);
3518 ts->stopping_tracepoint = val;
3519 ts->stop_reason = tracepoint_error;
3520 }
4daf5ac0 3521 else if (strncmp (p, "tframes", p1 - p) == 0)
00bf0b85
SS
3522 {
3523 p = unpack_varlen_hex (++p1, &val);
3524 ts->traceframe_count = val;
3525 }
4daf5ac0
SS
3526 else if (strncmp (p, "tcreated", p1 - p) == 0)
3527 {
3528 p = unpack_varlen_hex (++p1, &val);
3529 ts->traceframes_created = val;
3530 }
3531 else if (strncmp (p, "tfree", p1 - p) == 0)
00bf0b85
SS
3532 {
3533 p = unpack_varlen_hex (++p1, &val);
3534 ts->buffer_free = val;
3535 }
4daf5ac0
SS
3536 else if (strncmp (p, "tsize", p1 - p) == 0)
3537 {
3538 p = unpack_varlen_hex (++p1, &val);
3539 ts->buffer_size = val;
3540 }
33da3f1c
SS
3541 else if (strncmp (p, "disconn", p1 - p) == 0)
3542 {
3543 p = unpack_varlen_hex (++p1, &val);
3544 ts->disconnected_tracing = val;
3545 }
3546 else if (strncmp (p, "circular", p1 - p) == 0)
3547 {
3548 p = unpack_varlen_hex (++p1, &val);
3549 ts->circular_buffer = val;
3550 }
00bf0b85
SS
3551 else
3552 {
3553 /* Silently skip unknown optional info. */
3554 p_temp = strchr (p1 + 1, ';');
3555 if (p_temp)
3556 p = p_temp;
3557 else
3558 /* Must be at the end. */
3559 break;
3560 }
3561 }
3562}
3563
409873ef
SS
3564/* Given a line of text defining a part of a tracepoint, parse it into
3565 an "uploaded tracepoint". */
00bf0b85
SS
3566
3567void
3568parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3569{
3570 char *p;
3571 char piece;
409873ef 3572 ULONGEST num, addr, step, pass, orig_size, xlen, start;
2a2287c7 3573 int enabled, end;
00bf0b85 3574 enum bptype type;
2a2287c7 3575 char *cond, *srctype, *buf;
00bf0b85
SS
3576 struct uploaded_tp *utp = NULL;
3577
3578 p = line;
3579 /* Both tracepoint and action definitions start with the same number
3580 and address sequence. */
3581 piece = *p++;
3582 p = unpack_varlen_hex (p, &num);
3583 p++; /* skip a colon */
3584 p = unpack_varlen_hex (p, &addr);
3585 p++; /* skip a colon */
3586 if (piece == 'T')
3587 {
3588 enabled = (*p++ == 'E');
3589 p++; /* skip a colon */
3590 p = unpack_varlen_hex (p, &step);
3591 p++; /* skip a colon */
3592 p = unpack_varlen_hex (p, &pass);
3593 type = bp_tracepoint;
3594 cond = NULL;
3595 /* Thumb through optional fields. */
3596 while (*p == ':')
3597 {
3598 p++; /* skip a colon */
3599 if (*p == 'F')
3600 {
3601 type = bp_fast_tracepoint;
3602 p++;
3603 p = unpack_varlen_hex (p, &orig_size);
3604 }
0fb4aa4b
PA
3605 else if (*p == 'S')
3606 {
3607 type = bp_static_tracepoint;
3608 p++;
3609 }
00bf0b85
SS
3610 else if (*p == 'X')
3611 {
3612 p++;
3613 p = unpack_varlen_hex (p, &xlen);
3614 p++; /* skip a comma */
3615 cond = (char *) xmalloc (2 * xlen + 1);
3616 strncpy (cond, p, 2 * xlen);
3617 cond[2 * xlen] = '\0';
3618 p += 2 * xlen;
3619 }
3620 else
3e43a32a
MS
3621 warning (_("Unrecognized char '%c' in tracepoint "
3622 "definition, skipping rest"), *p);
00bf0b85
SS
3623 }
3624 utp = get_uploaded_tp (num, addr, utpp);
3625 utp->type = type;
3626 utp->enabled = enabled;
3627 utp->step = step;
3628 utp->pass = pass;
3629 utp->cond = cond;
3630 }
3631 else if (piece == 'A')
3632 {
3633 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3634 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
00bf0b85
SS
3635 }
3636 else if (piece == 'S')
3637 {
3638 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3639 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
00bf0b85 3640 }
409873ef
SS
3641 else if (piece == 'Z')
3642 {
3643 /* Parse a chunk of source form definition. */
3644 utp = get_uploaded_tp (num, addr, utpp);
3645 srctype = p;
3646 p = strchr (p, ':');
3647 p++; /* skip a colon */
3648 p = unpack_varlen_hex (p, &start);
3649 p++; /* skip a colon */
3650 p = unpack_varlen_hex (p, &xlen);
3651 p++; /* skip a colon */
3652
3653 buf = alloca (strlen (line));
3654
3655 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3656 buf[end] = '\0';
3657
3658 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3659 utp->at_string = xstrdup (buf);
3660 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3661 utp->cond_string = xstrdup (buf);
3662 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3149d8c1 3663 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
409873ef 3664 }
00bf0b85
SS
3665 else
3666 {
409873ef
SS
3667 /* Don't error out, the target might be sending us optional
3668 info that we don't care about. */
3669 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
00bf0b85
SS
3670 }
3671}
3672
3673/* Convert a textual description of a trace state variable into an
3674 uploaded object. */
3675
3676void
3677parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3678{
3679 char *p, *buf;
3680 ULONGEST num, initval, builtin;
3681 int end;
3682 struct uploaded_tsv *utsv = NULL;
3683
3684 buf = alloca (strlen (line));
3685
3686 p = line;
3687 p = unpack_varlen_hex (p, &num);
3688 p++; /* skip a colon */
3689 p = unpack_varlen_hex (p, &initval);
3690 p++; /* skip a colon */
3691 p = unpack_varlen_hex (p, &builtin);
3692 p++; /* skip a colon */
3693 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3694 buf[end] = '\0';
3695
3696 utsv = get_uploaded_tsv (num, utsvp);
3697 utsv->initial_value = initval;
3698 utsv->builtin = builtin;
3699 utsv->name = xstrdup (buf);
3700}
3701
3702/* Close the trace file and generally clean up. */
3703
3704static void
3705tfile_close (int quitting)
3706{
3707 int pid;
3708
3709 if (trace_fd < 0)
3710 return;
3711
3712 pid = ptid_get_pid (inferior_ptid);
c378eb4e 3713 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
00bf0b85
SS
3714 exit_inferior_silent (pid);
3715
3716 close (trace_fd);
3717 trace_fd = -1;
98e03262
SS
3718 if (trace_filename)
3719 xfree (trace_filename);
00bf0b85
SS
3720}
3721
3722static void
3723tfile_files_info (struct target_ops *t)
3724{
c378eb4e 3725 /* (it would be useful to mention the name of the file). */
00bf0b85
SS
3726 printf_filtered ("Looking at a trace file.\n");
3727}
3728
3729/* The trace status for a file is that tracing can never be run. */
3730
3731static int
3732tfile_get_trace_status (struct trace_status *ts)
3733{
3734 /* Other bits of trace status were collected as part of opening the
3735 trace files, so nothing to do here. */
3736
3737 return -1;
3738}
3739
3740/* Given the position of a traceframe in the file, figure out what
3741 address the frame was collected at. This would normally be the
3742 value of a collected PC register, but if not available, we
3743 improvise. */
3744
3745static ULONGEST
3746tfile_get_traceframe_address (off_t tframe_offset)
3747{
3748 ULONGEST addr = 0;
3749 short tpnum;
3750 struct breakpoint *tp;
3751 off_t saved_offset = cur_offset;
3752
c378eb4e 3753 /* FIXME dig pc out of collected registers. */
00bf0b85
SS
3754
3755 /* Fall back to using tracepoint address. */
3756 lseek (trace_fd, tframe_offset, SEEK_SET);
9f41c731 3757 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3758 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3759 gdbarch_byte_order
3760 (target_gdbarch));
98e03262 3761
00bf0b85 3762 tp = get_tracepoint_by_number_on_target (tpnum);
c378eb4e 3763 /* FIXME this is a poor heuristic if multiple locations. */
00bf0b85
SS
3764 if (tp && tp->loc)
3765 addr = tp->loc->address;
3766
3767 /* Restore our seek position. */
3768 cur_offset = saved_offset;
3769 lseek (trace_fd, cur_offset, SEEK_SET);
3770 return addr;
3771}
3772
e6e4e701
PA
3773/* Make tfile's selected traceframe match GDB's selected
3774 traceframe. */
3775
3776static void
3777set_tfile_traceframe (void)
3778{
3779 int newnum;
3780
3781 if (cur_traceframe_number == get_traceframe_number ())
3782 return;
3783
3784 /* Avoid recursion, tfile_trace_find calls us again. */
3785 cur_traceframe_number = get_traceframe_number ();
3786
3787 newnum = target_trace_find (tfind_number,
3788 get_traceframe_number (), 0, 0, NULL);
3789
3790 /* Should not happen. If it does, all bets are off. */
3791 if (newnum != get_traceframe_number ())
3792 warning (_("could not set tfile's traceframe"));
3793}
3794
00bf0b85
SS
3795/* Given a type of search and some parameters, scan the collection of
3796 traceframes in the file looking for a match. When found, return
3797 both the traceframe and tracepoint number, otherwise -1 for
3798 each. */
3799
3800static int
3801tfile_trace_find (enum trace_find_type type, int num,
3802 ULONGEST addr1, ULONGEST addr2, int *tpp)
3803{
3804 short tpnum;
9f41c731 3805 int tfnum = 0, found = 0;
8991e9fa 3806 unsigned int data_size;
00bf0b85
SS
3807 struct breakpoint *tp;
3808 off_t offset, tframe_offset;
3809 ULONGEST tfaddr;
3810
e6e4e701
PA
3811 /* Lookups other than by absolute frame number depend on the current
3812 trace selected, so make sure it is correct on the tfile end
3813 first. */
3814 if (type != tfind_number)
3815 set_tfile_traceframe ();
3816
00bf0b85
SS
3817 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3818 offset = trace_frames_offset;
3819 while (1)
3820 {
3821 tframe_offset = offset;
9f41c731 3822 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3823 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3824 gdbarch_byte_order
3825 (target_gdbarch));
00bf0b85
SS
3826 offset += 2;
3827 if (tpnum == 0)
3828 break;
9f41c731 3829 tfile_read ((gdb_byte *) &data_size, 4);
8991e9fa
HZ
3830 data_size = (unsigned int) extract_unsigned_integer
3831 ((gdb_byte *) &data_size, 4,
3832 gdbarch_byte_order (target_gdbarch));
00bf0b85
SS
3833 offset += 4;
3834 switch (type)
3835 {
3836 case tfind_number:
3837 if (tfnum == num)
3838 found = 1;
3839 break;
3840 case tfind_pc:
3841 tfaddr = tfile_get_traceframe_address (tframe_offset);
3842 if (tfaddr == addr1)
3843 found = 1;
3844 break;
3845 case tfind_tp:
3846 tp = get_tracepoint (num);
3847 if (tp && tpnum == tp->number_on_target)
3848 found = 1;
3849 break;
3850 case tfind_range:
3851 tfaddr = tfile_get_traceframe_address (tframe_offset);
3852 if (addr1 <= tfaddr && tfaddr <= addr2)
3853 found = 1;
3854 break;
3855 case tfind_outside:
3856 tfaddr = tfile_get_traceframe_address (tframe_offset);
3857 if (!(addr1 <= tfaddr && tfaddr <= addr2))
3858 found = 1;
3859 break;
3860 default:
3861 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3862 }
3863 if (found)
3864 {
00bf0b85
SS
3865 if (tpp)
3866 *tpp = tpnum;
3867 cur_offset = offset;
3868 cur_data_size = data_size;
e6e4e701 3869 cur_traceframe_number = tfnum;
00bf0b85
SS
3870 return tfnum;
3871 }
3872 /* Skip past the traceframe's data. */
3873 lseek (trace_fd, data_size, SEEK_CUR);
3874 offset += data_size;
3875 /* Update our own count of traceframes. */
3876 ++tfnum;
3877 }
3878 /* Did not find what we were looking for. */
3879 if (tpp)
3880 *tpp = -1;
3881 return -1;
3882}
3883
9f41c731
PA
3884/* Prototype of the callback passed to tframe_walk_blocks. */
3885typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
3886
3887/* Callback for traceframe_walk_blocks, used to find a given block
3888 type in a traceframe. */
3889
3890static int
3891match_blocktype (char blocktype, void *data)
3892{
3893 char *wantedp = data;
3894
3895 if (*wantedp == blocktype)
3896 return 1;
3897
3898 return 0;
3899}
3900
3901/* Walk over all traceframe block starting at POS offset from
3902 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
3903 unmodified. If CALLBACK returns true, this returns the position in
3904 the traceframe where the block is found, relative to the start of
3905 the traceframe (cur_offset). Returns -1 if no callback call
3906 returned true, indicating that all blocks have been walked. */
3907
3908static int
3909traceframe_walk_blocks (walk_blocks_callback_func callback,
3910 int pos, void *data)
3911{
3912 /* Iterate through a traceframe's blocks, looking for a block of the
3913 requested type. */
3914
3915 lseek (trace_fd, cur_offset + pos, SEEK_SET);
3916 while (pos < cur_data_size)
3917 {
3918 unsigned short mlen;
3919 char block_type;
3920
3921 tfile_read (&block_type, 1);
3922
3923 ++pos;
3924
3925 if ((*callback) (block_type, data))
3926 return pos;
3927
3928 switch (block_type)
3929 {
3930 case 'R':
3931 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
3932 pos += trace_regblock_size;
3933 break;
3934 case 'M':
3935 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
3936 tfile_read ((gdb_byte *) &mlen, 2);
3937 mlen = (unsigned short)
3938 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
3939 gdbarch_byte_order
3940 (target_gdbarch));
3941 lseek (trace_fd, mlen, SEEK_CUR);
3942 pos += (8 + 2 + mlen);
3943 break;
3944 case 'V':
3945 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
3946 pos += (4 + 8);
3947 break;
3948 default:
c2f0d045 3949 error (_("Unknown block type '%c' (0x%x) in trace frame"),
9f41c731
PA
3950 block_type, block_type);
3951 break;
3952 }
3953 }
3954
3955 return -1;
3956}
3957
3958/* Convenience wrapper around traceframe_walk_blocks. Looks for the
3959 position offset of a block of type TYPE_WANTED in the current trace
3960 frame, starting at POS. Returns -1 if no such block was found. */
3961
3962static int
3963traceframe_find_block_type (char type_wanted, int pos)
3964{
3965 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
3966}
3967
00bf0b85
SS
3968/* Look for a block of saved registers in the traceframe, and get the
3969 requested register from it. */
3970
3971static void
3972tfile_fetch_registers (struct target_ops *ops,
3973 struct regcache *regcache, int regno)
3974{
3975 struct gdbarch *gdbarch = get_regcache_arch (regcache);
3976 char block_type;
9f41c731 3977 int pos, offset, regn, regsize, pc_regno;
00bf0b85
SS
3978 unsigned short mlen;
3979 char *regs;
3980
3981 /* An uninitialized reg size says we're not going to be
3982 successful at getting register blocks. */
3983 if (!trace_regblock_size)
3984 return;
3985
e6e4e701
PA
3986 set_tfile_traceframe ();
3987
00bf0b85
SS
3988 regs = alloca (trace_regblock_size);
3989
9f41c731 3990 if (traceframe_find_block_type ('R', 0) >= 0)
00bf0b85 3991 {
9f41c731 3992 tfile_read (regs, trace_regblock_size);
98e03262 3993
9f41c731
PA
3994 /* Assume the block is laid out in GDB register number order,
3995 each register with the size that it has in GDB. */
3996 offset = 0;
3997 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
00bf0b85 3998 {
9f41c731
PA
3999 regsize = register_size (gdbarch, regn);
4000 /* Make sure we stay within block bounds. */
4001 if (offset + regsize >= trace_regblock_size)
4002 break;
4003 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
00bf0b85 4004 {
9f41c731 4005 if (regno == regn)
00bf0b85 4006 {
9f41c731
PA
4007 regcache_raw_supply (regcache, regno, regs + offset);
4008 break;
4009 }
4010 else if (regno == -1)
4011 {
4012 regcache_raw_supply (regcache, regn, regs + offset);
00bf0b85 4013 }
00bf0b85 4014 }
9f41c731 4015 offset += regsize;
00bf0b85 4016 }
9f41c731 4017 return;
00bf0b85 4018 }
af54718e 4019
9f41c731
PA
4020 /* We get here if no register data has been found. Mark registers
4021 as unavailable. */
af54718e
SS
4022 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4023 regcache_raw_supply (regcache, regn, NULL);
4024
4025 /* We can often usefully guess that the PC is going to be the same
4026 as the address of the tracepoint. */
4027 pc_regno = gdbarch_pc_regnum (gdbarch);
4028 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4029 {
4030 struct breakpoint *tp = get_tracepoint (tracepoint_number);
4031
4032 if (tp && tp->loc)
4033 {
4034 /* But don't try to guess if tracepoint is multi-location... */
4035 if (tp->loc->next)
4036 {
a73c6dcd
MS
4037 warning (_("Tracepoint %d has multiple "
4038 "locations, cannot infer $pc"),
af54718e
SS
4039 tp->number);
4040 return;
4041 }
4042 /* ... or does while-stepping. */
4043 if (tp->step_count > 0)
4044 {
a73c6dcd
MS
4045 warning (_("Tracepoint %d does while-stepping, "
4046 "cannot infer $pc"),
af54718e
SS
4047 tp->number);
4048 return;
4049 }
4050
4051 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4052 gdbarch_byte_order (gdbarch),
4053 tp->loc->address);
4054 regcache_raw_supply (regcache, pc_regno, regs);
4055 }
4056 }
00bf0b85
SS
4057}
4058
4059static LONGEST
4060tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4061 const char *annex, gdb_byte *readbuf,
4062 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4063{
00bf0b85
SS
4064 /* We're only doing regular memory for now. */
4065 if (object != TARGET_OBJECT_MEMORY)
4066 return -1;
4067
4068 if (readbuf == NULL)
a73c6dcd 4069 error (_("tfile_xfer_partial: trace file is read-only"));
00bf0b85 4070
e6e4e701
PA
4071 set_tfile_traceframe ();
4072
4073 if (traceframe_number != -1)
00bf0b85 4074 {
ffd5ec24 4075 int pos = 0;
9f41c731 4076
ffd5ec24
PA
4077 /* Iterate through the traceframe's blocks, looking for
4078 memory. */
4079 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
00bf0b85 4080 {
ffd5ec24
PA
4081 ULONGEST maddr, amt;
4082 unsigned short mlen;
4083 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
fce3c1f0 4084
ffd5ec24
PA
4085 tfile_read ((gdb_byte *) &maddr, 8);
4086 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4087 byte_order);
4088 tfile_read ((gdb_byte *) &mlen, 2);
4089 mlen = (unsigned short)
4090 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4091
4092 /* If the block includes the first part of the desired
4093 range, return as much it has; GDB will re-request the
4094 remainder, which might be in a different block of this
4095 trace frame. */
4096 if (maddr <= offset && offset < (maddr + mlen))
4097 {
4098 amt = (maddr + mlen) - offset;
4099 if (amt > len)
4100 amt = len;
4101
4102 tfile_read (readbuf, amt);
4103 return amt;
4104 }
9f41c731 4105
ffd5ec24
PA
4106 /* Skip over this block. */
4107 pos += (8 + 2 + mlen);
4108 }
00bf0b85 4109 }
fce3c1f0
SS
4110
4111 /* It's unduly pedantic to refuse to look at the executable for
4112 read-only pieces; so do the equivalent of readonly regions aka
4113 QTro packet. */
c378eb4e 4114 /* FIXME account for relocation at some point. */
fce3c1f0
SS
4115 if (exec_bfd)
4116 {
4117 asection *s;
4118 bfd_size_type size;
2209c807 4119 bfd_vma vma;
fce3c1f0
SS
4120
4121 for (s = exec_bfd->sections; s; s = s->next)
4122 {
9f41c731
PA
4123 if ((s->flags & SEC_LOAD) == 0
4124 || (s->flags & SEC_READONLY) == 0)
fce3c1f0
SS
4125 continue;
4126
2209c807 4127 vma = s->vma;
fce3c1f0 4128 size = bfd_get_section_size (s);
2209c807 4129 if (vma <= offset && offset < (vma + size))
fce3c1f0 4130 {
9f41c731
PA
4131 ULONGEST amt;
4132
2209c807 4133 amt = (vma + size) - offset;
fce3c1f0
SS
4134 if (amt > len)
4135 amt = len;
4136
4137 amt = bfd_get_section_contents (exec_bfd, s,
2209c807 4138 readbuf, offset - vma, amt);
fce3c1f0
SS
4139 return amt;
4140 }
4141 }
4142 }
4143
00bf0b85
SS
4144 /* Indicate failure to find the requested memory block. */
4145 return -1;
4146}
4147
4148/* Iterate through the blocks of a trace frame, looking for a 'V'
4149 block with a matching tsv number. */
4150
4151static int
4152tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4153{
9f41c731 4154 int pos;
00bf0b85 4155
e6e4e701
PA
4156 set_tfile_traceframe ();
4157
00bf0b85 4158 pos = 0;
9f41c731 4159 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
00bf0b85 4160 {
9f41c731
PA
4161 int vnum;
4162
4163 tfile_read ((gdb_byte *) &vnum, 4);
4164 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
8991e9fa 4165 gdbarch_byte_order
9f41c731
PA
4166 (target_gdbarch));
4167 if (tsvnum == vnum)
4168 {
4169 tfile_read ((gdb_byte *) val, 8);
4170 *val = extract_signed_integer ((gdb_byte *) val, 8,
4171 gdbarch_byte_order
4172 (target_gdbarch));
4173 return 1;
00bf0b85 4174 }
9f41c731 4175 pos += (4 + 8);
00bf0b85 4176 }
9f41c731 4177
00bf0b85
SS
4178 /* Didn't find anything. */
4179 return 0;
4180}
4181
fce3c1f0
SS
4182static int
4183tfile_has_all_memory (struct target_ops *ops)
4184{
4185 return 1;
4186}
4187
00bf0b85
SS
4188static int
4189tfile_has_memory (struct target_ops *ops)
4190{
4191 return 1;
4192}
4193
4194static int
4195tfile_has_stack (struct target_ops *ops)
4196{
ffd5ec24 4197 return traceframe_number != -1;
00bf0b85
SS
4198}
4199
4200static int
4201tfile_has_registers (struct target_ops *ops)
4202{
ffd5ec24 4203 return traceframe_number != -1;
00bf0b85
SS
4204}
4205
b3b9301e
PA
4206/* Callback for traceframe_walk_blocks. Builds a traceframe_info
4207 object for the tfile target's current traceframe. */
4208
4209static int
4210build_traceframe_info (char blocktype, void *data)
4211{
4212 struct traceframe_info *info = data;
4213
4214 switch (blocktype)
4215 {
4216 case 'M':
4217 {
4218 struct mem_range *r;
4219 ULONGEST maddr;
4220 unsigned short mlen;
4221
4222 tfile_read ((gdb_byte *) &maddr, 8);
4223 tfile_read ((gdb_byte *) &mlen, 2);
4224
4225 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4226
4227 r->start = maddr;
4228 r->length = mlen;
4229 break;
4230 }
4231 case 'V':
4232 case 'R':
4233 case 'S':
4234 {
4235 break;
4236 }
4237 default:
4238 warning (_("Unhandled trace block type (%d) '%c ' "
4239 "while building trace frame info."),
4240 blocktype, blocktype);
4241 break;
4242 }
4243
4244 return 0;
4245}
4246
4247static struct traceframe_info *
4248tfile_traceframe_info (void)
4249{
4250 struct traceframe_info *info = XCNEW (struct traceframe_info);
4251
4252 traceframe_walk_blocks (build_traceframe_info, 0, info);
4253 return info;
4254}
4255
00bf0b85
SS
4256static void
4257init_tfile_ops (void)
4258{
4259 tfile_ops.to_shortname = "tfile";
4260 tfile_ops.to_longname = "Local trace dump file";
3e43a32a
MS
4261 tfile_ops.to_doc
4262 = "Use a trace file as a target. Specify the filename of the trace file.";
00bf0b85
SS
4263 tfile_ops.to_open = tfile_open;
4264 tfile_ops.to_close = tfile_close;
4265 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4266 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4267 tfile_ops.to_files_info = tfile_files_info;
4268 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4269 tfile_ops.to_trace_find = tfile_trace_find;
3e43a32a
MS
4270 tfile_ops.to_get_trace_state_variable_value
4271 = tfile_get_trace_state_variable_value;
00bf0b85 4272 tfile_ops.to_stratum = process_stratum;
fce3c1f0 4273 tfile_ops.to_has_all_memory = tfile_has_all_memory;
00bf0b85
SS
4274 tfile_ops.to_has_memory = tfile_has_memory;
4275 tfile_ops.to_has_stack = tfile_has_stack;
4276 tfile_ops.to_has_registers = tfile_has_registers;
b3b9301e 4277 tfile_ops.to_traceframe_info = tfile_traceframe_info;
00bf0b85
SS
4278 tfile_ops.to_magic = OPS_MAGIC;
4279}
4280
0fb4aa4b
PA
4281/* Given a line of text defining a static tracepoint marker, parse it
4282 into a "static tracepoint marker" object. Throws an error is
4283 parsing fails. If PP is non-null, it points to one past the end of
4284 the parsed marker definition. */
4285
4286void
4287parse_static_tracepoint_marker_definition (char *line, char **pp,
4288 struct static_tracepoint_marker *marker)
4289{
4290 char *p, *endp;
4291 ULONGEST addr;
4292 int end;
4293
4294 p = line;
4295 p = unpack_varlen_hex (p, &addr);
4296 p++; /* skip a colon */
4297
4298 marker->gdbarch = target_gdbarch;
4299 marker->address = (CORE_ADDR) addr;
4300
4301 endp = strchr (p, ':');
4302 if (endp == NULL)
74232302 4303 error (_("bad marker definition: %s"), line);
0fb4aa4b
PA
4304
4305 marker->str_id = xmalloc (endp - p + 1);
4306 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4307 marker->str_id[end] = '\0';
4308
4309 p += 2 * end;
4310 p++; /* skip a colon */
4311
4312 marker->extra = xmalloc (strlen (p) + 1);
4313 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4314 marker->extra[end] = '\0';
4315
4316 if (pp)
4317 *pp = p;
4318}
4319
4320/* Release a static tracepoint marker's contents. Note that the
4321 object itself isn't released here. There objects are usually on
4322 the stack. */
4323
4324void
4325release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4326{
4327 xfree (marker->str_id);
4328 marker->str_id = NULL;
4329}
4330
4331/* Print MARKER to gdb_stdout. */
4332
4333static void
4334print_one_static_tracepoint_marker (int count,
4335 struct static_tracepoint_marker *marker)
4336{
4337 struct command_line *l;
4338 struct symbol *sym;
4339
4340 char wrap_indent[80];
4341 char extra_field_indent[80];
4342 struct ui_stream *stb = ui_out_stream_new (uiout);
4343 struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4344 struct cleanup *bkpt_chain;
4345 VEC(breakpoint_p) *tracepoints;
4346
4347 struct symtab_and_line sal;
4348
4349 init_sal (&sal);
4350
4351 sal.pc = marker->address;
4352
4353 tracepoints = static_tracepoints_here (marker->address);
4354
4355 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4356
4357 /* A counter field to help readability. This is not a stable
4358 identifier! */
4359 ui_out_field_int (uiout, "count", count);
4360
4361 ui_out_field_string (uiout, "marker-id", marker->str_id);
4362
4363 ui_out_field_fmt (uiout, "enabled", "%c",
4364 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4365 ui_out_spaces (uiout, 2);
4366
4367 strcpy (wrap_indent, " ");
4368
4369 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4370 strcat (wrap_indent, " ");
4371 else
4372 strcat (wrap_indent, " ");
4373
4374 strcpy (extra_field_indent, " ");
4375
4376 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4377
4378 sal = find_pc_line (marker->address, 0);
4379 sym = find_pc_sect_function (marker->address, NULL);
4380 if (sym)
4381 {
4382 ui_out_text (uiout, "in ");
4383 ui_out_field_string (uiout, "func",
4384 SYMBOL_PRINT_NAME (sym));
4385 ui_out_wrap_hint (uiout, wrap_indent);
4386 ui_out_text (uiout, " at ");
4387 }
4388 else
4389 ui_out_field_skip (uiout, "func");
4390
4391 if (sal.symtab != NULL)
4392 {
4393 ui_out_field_string (uiout, "file", sal.symtab->filename);
4394 ui_out_text (uiout, ":");
4395
4396 if (ui_out_is_mi_like_p (uiout))
4397 {
4398 char *fullname = symtab_to_fullname (sal.symtab);
4399
4400 if (fullname)
4401 ui_out_field_string (uiout, "fullname", fullname);
4402 }
4403 else
4404 ui_out_field_skip (uiout, "fullname");
4405
4406 ui_out_field_int (uiout, "line", sal.line);
4407 }
4408 else
4409 {
4410 ui_out_field_skip (uiout, "fullname");
4411 ui_out_field_skip (uiout, "line");
4412 }
4413
4414 ui_out_text (uiout, "\n");
4415 ui_out_text (uiout, extra_field_indent);
4416 ui_out_text (uiout, _("Data: \""));
4417 ui_out_field_string (uiout, "extra-data", marker->extra);
4418 ui_out_text (uiout, "\"\n");
4419
4420 if (!VEC_empty (breakpoint_p, tracepoints))
4421 {
4422 struct cleanup *cleanup_chain;
4423 int ix;
4424 struct breakpoint *b;
4425
4426 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4427 "tracepoints-at");
4428
4429 ui_out_text (uiout, extra_field_indent);
4430 ui_out_text (uiout, _("Probed by static tracepoints: "));
4431 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4432 {
4433 if (ix > 0)
4434 ui_out_text (uiout, ", ");
4435 ui_out_text (uiout, "#");
4436 ui_out_field_int (uiout, "tracepoint-id", b->number);
4437 }
4438
4439 do_cleanups (cleanup_chain);
4440
4441 if (ui_out_is_mi_like_p (uiout))
4442 ui_out_field_int (uiout, "number-of-tracepoints",
4443 VEC_length(breakpoint_p, tracepoints));
4444 else
4445 ui_out_text (uiout, "\n");
4446 }
4447 VEC_free (breakpoint_p, tracepoints);
4448
4449 do_cleanups (bkpt_chain);
4450 do_cleanups (old_chain);
4451}
4452
4453static void
4454info_static_tracepoint_markers_command (char *arg, int from_tty)
4455{
4456 VEC(static_tracepoint_marker_p) *markers;
4457 struct cleanup *old_chain;
4458 struct static_tracepoint_marker *marker;
4459 int i;
4460
4461 old_chain
4462 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4463 "StaticTracepointMarkersTable");
4464
4465 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4466
4467 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4468
4469 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4470 if (gdbarch_addr_bit (target_gdbarch) <= 32)
4471 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4472 else
4473 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4474 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4475
4476 ui_out_table_body (uiout);
4477
4478 markers = target_static_tracepoint_markers_by_strid (NULL);
4479 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4480
4481 for (i = 0;
4482 VEC_iterate (static_tracepoint_marker_p,
4483 markers, i, marker);
4484 i++)
4485 {
4486 print_one_static_tracepoint_marker (i + 1, marker);
4487 release_static_tracepoint_marker (marker);
4488 }
4489
4490 do_cleanups (old_chain);
4491}
4492
4493/* The $_sdata convenience variable is a bit special. We don't know
4494 for sure type of the value until we actually have a chance to fetch
4495 the data --- the size of the object depends on what has been
4496 collected. We solve this by making $_sdata be an internalvar that
4497 creates a new value on access. */
4498
4499/* Return a new value with the correct type for the sdata object of
4500 the current trace frame. Return a void value if there's no object
4501 available. */
4502
4503static struct value *
4504sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4505{
4506 LONGEST size;
4507 gdb_byte *buf;
4508
4509 /* We need to read the whole object before we know its size. */
4510 size = target_read_alloc (&current_target,
4511 TARGET_OBJECT_STATIC_TRACE_DATA,
4512 NULL, &buf);
4513 if (size >= 0)
4514 {
4515 struct value *v;
4516 struct type *type;
4517
4518 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4519 size);
4520 v = allocate_value (type);
4521 memcpy (value_contents_raw (v), buf, size);
4522 xfree (buf);
4523 return v;
4524 }
4525 else
4526 return allocate_value (builtin_type (gdbarch)->builtin_void);
4527}
4528
b3b9301e
PA
4529#if !defined(HAVE_LIBEXPAT)
4530
4531struct traceframe_info *
4532parse_traceframe_info (const char *tframe_info)
4533{
4534 static int have_warned;
4535
4536 if (!have_warned)
4537 {
4538 have_warned = 1;
4539 warning (_("Can not parse XML trace frame info; XML support "
4540 "was disabled at compile time"));
4541 }
4542
4543 return NULL;
4544}
4545
4546#else /* HAVE_LIBEXPAT */
4547
4548#include "xml-support.h"
4549
4550/* Handle the start of a <memory> element. */
4551
4552static void
4553traceframe_info_start_memory (struct gdb_xml_parser *parser,
4554 const struct gdb_xml_element *element,
4555 void *user_data, VEC(gdb_xml_value_s) *attributes)
4556{
4557 struct traceframe_info *info = user_data;
4558 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4559 ULONGEST *start_p, *length_p;
4560
4561 start_p = xml_find_attribute (attributes, "start")->value;
4562 length_p = xml_find_attribute (attributes, "length")->value;
4563
4564 r->start = *start_p;
4565 r->length = *length_p;
4566}
4567
4568/* Discard the constructed trace frame info (if an error occurs). */
4569
4570static void
4571free_result (void *p)
4572{
4573 struct traceframe_info *result = p;
4574
4575 free_traceframe_info (result);
4576}
4577
4578/* The allowed elements and attributes for an XML memory map. */
4579
4580static const struct gdb_xml_attribute memory_attributes[] = {
4581 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4582 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4583 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4584};
4585
4586static const struct gdb_xml_element traceframe_info_children[] = {
4587 { "memory", memory_attributes, NULL,
4588 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4589 traceframe_info_start_memory, NULL },
4590 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4591};
4592
4593static const struct gdb_xml_element traceframe_info_elements[] = {
4594 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4595 NULL, NULL },
4596 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4597};
4598
4599/* Parse a traceframe-info XML document. */
4600
4601struct traceframe_info *
4602parse_traceframe_info (const char *tframe_info)
4603{
4604 struct traceframe_info *result;
4605 struct cleanup *back_to;
4606
4607 result = XCNEW (struct traceframe_info);
4608 back_to = make_cleanup (free_result, result);
4609
4610 if (gdb_xml_parse_quick (_("trace frame info"),
4611 "traceframe-info.dtd", traceframe_info_elements,
4612 tframe_info, result) == 0)
4613 {
4614 /* Parsed successfully, keep the result. */
4615 discard_cleanups (back_to);
4616
4617 return result;
4618 }
4619
4620 do_cleanups (back_to);
4621 return NULL;
4622}
4623
4624#endif /* HAVE_LIBEXPAT */
4625
4626/* Returns the traceframe_info object for the current traceframe.
4627 This is where we avoid re-fetching the object from the target if we
4628 already have it cached. */
4629
4630struct traceframe_info *
4631get_traceframe_info (void)
4632{
4633 if (traceframe_info == NULL)
4634 traceframe_info = target_traceframe_info ();
4635
4636 return traceframe_info;
4637}
4638
2a7498d8
PA
4639/* Return in RESULT, the set of collected memory in the current
4640 traceframe, found within the LEN bytes range starting at MEMADDR.
4641 Returns true if the target supports the query, otherwise returns
4642 false. */
4643
4644int
4645traceframe_available_memory (VEC(mem_range_s) **result,
4646 CORE_ADDR memaddr, ULONGEST len)
4647{
4648 struct traceframe_info *info = get_traceframe_info ();
4649
4650 if (info != NULL)
4651 {
4652 struct mem_range *r;
4653 int i;
4654
4655 *result = NULL;
4656
4657 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4658 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4659 {
4660 ULONGEST lo1, hi1, lo2, hi2;
4661 struct mem_range *nr;
4662
4663 lo1 = memaddr;
4664 hi1 = memaddr + len;
4665
4666 lo2 = r->start;
4667 hi2 = r->start + r->length;
4668
4669 nr = VEC_safe_push (mem_range_s, *result, NULL);
4670
4671 nr->start = max (lo1, lo2);
4672 nr->length = min (hi1, hi2) - nr->start;
4673 }
4674
4675 normalize_mem_ranges (*result);
4676 return 1;
4677 }
4678
4679 return 0;
4680}
4681
c906108c
SS
4682/* module initialization */
4683void
fba45db2 4684_initialize_tracepoint (void)
c906108c 4685{
fa58ee11
EZ
4686 struct cmd_list_element *c;
4687
0fb4aa4b
PA
4688 /* Explicitly create without lookup, since that tries to create a
4689 value with a void typed value, and when we get here, gdbarch
4690 isn't initialized yet. At this point, we're quite sure there
4691 isn't another convenience variable of the same name. */
4692 create_internalvar_type_lazy ("_sdata", sdata_make_value);
4693
c906108c
SS
4694 traceframe_number = -1;
4695 tracepoint_number = -1;
4696
c906108c
SS
4697 if (tracepoint_list.list == NULL)
4698 {
4699 tracepoint_list.listsize = 128;
c5aa993b 4700 tracepoint_list.list = xmalloc
c906108c
SS
4701 (tracepoint_list.listsize * sizeof (struct memrange));
4702 }
4703 if (tracepoint_list.aexpr_list == NULL)
4704 {
4705 tracepoint_list.aexpr_listsize = 128;
4706 tracepoint_list.aexpr_list = xmalloc
4707 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4708 }
4709
4710 if (stepping_list.list == NULL)
4711 {
4712 stepping_list.listsize = 128;
c5aa993b 4713 stepping_list.list = xmalloc
c906108c
SS
4714 (stepping_list.listsize * sizeof (struct memrange));
4715 }
4716
4717 if (stepping_list.aexpr_list == NULL)
4718 {
4719 stepping_list.aexpr_listsize = 128;
4720 stepping_list.aexpr_list = xmalloc
4721 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4722 }
4723
c5aa993b 4724 add_info ("scope", scope_info,
1bedd215 4725 _("List the variables local to a scope"));
c906108c 4726
e00d1dc8 4727 add_cmd ("tracepoints", class_trace, NULL,
1a966eab 4728 _("Tracing of program execution without stopping the program."),
c906108c
SS
4729 &cmdlist);
4730
c5aa993b 4731 add_com ("tdump", class_trace, trace_dump_command,
1bedd215 4732 _("Print everything collected at the current tracepoint."));
c906108c 4733
00bf0b85
SS
4734 add_com ("tsave", class_trace, trace_save_command, _("\
4735Save the trace data to a file.\n\
4736Use the '-r' option to direct the target to save directly to the file,\n\
4737using its own filesystem."));
4738
f61e138d
SS
4739 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4740Define a trace state variable.\n\
4741Argument is a $-prefixed name, optionally followed\n\
4742by '=' and an expression that sets the initial value\n\
4743at the start of tracing."));
4744 set_cmd_completer (c, expression_completer);
4745
4746 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4747Delete one or more trace state variables.\n\
4748Arguments are the names of the variables to delete.\n\
4749If no arguments are supplied, delete all variables."), &deletelist);
c378eb4e 4750 /* FIXME add a trace variable completer. */
f61e138d
SS
4751
4752 add_info ("tvariables", tvariables_info, _("\
4753Status of trace state variables and their values.\n\
0fb4aa4b
PA
4754"));
4755
4756 add_info ("static-tracepoint-markers",
4757 info_static_tracepoint_markers_command, _("\
4758List target static tracepoints markers.\n\
f61e138d
SS
4759"));
4760
1bedd215
AC
4761 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4762Select a trace frame;\n\
4763No argument means forward by one frame; '-' means backward by one frame."),
c906108c
SS
4764 &tfindlist, "tfind ", 1, &cmdlist);
4765
1a966eab 4766 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
081dfbf7 4767Select a trace frame whose PC is outside the given range (exclusive).\n\
1a966eab 4768Usage: tfind outside addr1, addr2"),
c906108c
SS
4769 &tfindlist);
4770
1a966eab 4771 add_cmd ("range", class_trace, trace_find_range_command, _("\
081dfbf7 4772Select a trace frame whose PC is in the given range (inclusive).\n\
1a966eab 4773Usage: tfind range addr1,addr2"),
c906108c
SS
4774 &tfindlist);
4775
1a966eab
AC
4776 add_cmd ("line", class_trace, trace_find_line_command, _("\
4777Select a trace frame by source line.\n\
cce7e648 4778Argument can be a line number (with optional source file),\n\
c906108c 4779a function name, or '*' followed by an address.\n\
1a966eab 4780Default argument is 'the next source line that was traced'."),
c906108c
SS
4781 &tfindlist);
4782
1a966eab
AC
4783 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4784Select a trace frame by tracepoint number.\n\
4785Default is the tracepoint for the current trace frame."),
c906108c
SS
4786 &tfindlist);
4787
1a966eab
AC
4788 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4789Select a trace frame by PC.\n\
4790Default is the current PC, or the PC of the current trace frame."),
c906108c
SS
4791 &tfindlist);
4792
1a966eab
AC
4793 add_cmd ("end", class_trace, trace_find_end_command, _("\
4794Synonym for 'none'.\n\
4795De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4796 &tfindlist);
4797
4798 add_cmd ("none", class_trace, trace_find_none_command,
1a966eab 4799 _("De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4800 &tfindlist);
4801
4802 add_cmd ("start", class_trace, trace_find_start_command,
1a966eab 4803 _("Select the first trace frame in the trace buffer."),
c906108c
SS
4804 &tfindlist);
4805
c5aa993b 4806 add_com ("tstatus", class_trace, trace_status_command,
1bedd215 4807 _("Display the status of the current trace data collection."));
c906108c 4808
c5aa993b 4809 add_com ("tstop", class_trace, trace_stop_command,
1bedd215 4810 _("Stop trace data collection."));
c906108c
SS
4811
4812 add_com ("tstart", class_trace, trace_start_command,
1bedd215 4813 _("Start trace data collection."));
c906108c 4814
1bedd215
AC
4815 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4816Ends a list of commands or actions.\n\
c906108c
SS
4817Several GDB commands allow you to enter a list of commands or actions.\n\
4818Entering \"end\" on a line by itself is the normal way to terminate\n\
4819such a list.\n\n\
1bedd215 4820Note: the \"end\" command cannot be used at the gdb prompt."));
c906108c 4821
1bedd215
AC
4822 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4823Specify single-stepping behavior at a tracepoint.\n\
c906108c
SS
4824Argument is number of instructions to trace in single-step mode\n\
4825following the tracepoint. This command is normally followed by\n\
4826one or more \"collect\" commands, to specify what to collect\n\
4827while single-stepping.\n\n\
1bedd215 4828Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 4829
c5aa993b
JM
4830 add_com_alias ("ws", "while-stepping", class_alias, 0);
4831 add_com_alias ("stepping", "while-stepping", class_alias, 0);
c906108c 4832
1bedd215
AC
4833 add_com ("collect", class_trace, collect_pseudocommand, _("\
4834Specify one or more data items to be collected at a tracepoint.\n\
c906108c
SS
4835Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4836collect all data (variables, registers) referenced by that expression.\n\
4837Also accepts the following special arguments:\n\
4838 $regs -- all registers.\n\
4839 $args -- all function arguments.\n\
4840 $locals -- all variables local to the block/function scope.\n\
0fb4aa4b 4841 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
1bedd215 4842Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 4843
6da95a67
SS
4844 add_com ("teval", class_trace, teval_pseudocommand, _("\
4845Specify one or more expressions to be evaluated at a tracepoint.\n\
4846Accepts a comma-separated list of (one or more) expressions.\n\
4847The result of each evaluation will be discarded.\n\
4848Note: this command can only be used in a tracepoint \"actions\" list."));
4849
1bedd215
AC
4850 add_com ("actions", class_trace, trace_actions_command, _("\
4851Specify the actions to be taken at a tracepoint.\n\
cce7e648
PA
4852Tracepoint actions may include collecting of specified data,\n\
4853single-stepping, or enabling/disabling other tracepoints,\n\
1bedd215 4854depending on target's capabilities."));
c906108c 4855
236f1d4d
SS
4856 default_collect = xstrdup ("");
4857 add_setshow_string_cmd ("default-collect", class_trace,
4858 &default_collect, _("\
4859Set the list of expressions to collect by default"), _("\
4860Show the list of expressions to collect by default"), NULL,
4861 NULL, NULL,
4862 &setlist, &showlist);
4863
d5551862
SS
4864 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4865 &disconnected_tracing, _("\
4866Set whether tracing continues after GDB disconnects."), _("\
4867Show whether tracing continues after GDB disconnects."), _("\
4868Use this to continue a tracing run even if GDB disconnects\n\
4869or detaches from the target. You can reconnect later and look at\n\
4870trace data collected in the meantime."),
4871 set_disconnected_tracing,
4872 NULL,
4873 &setlist,
4874 &showlist);
00bf0b85 4875
4daf5ac0
SS
4876 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4877 &circular_trace_buffer, _("\
4878Set target's use of circular trace buffer."), _("\
4879Show target's use of circular trace buffer."), _("\
4880Use this to make the trace buffer into a circular buffer,\n\
4881which will discard traceframes (oldest first) instead of filling\n\
4882up and stopping the trace run."),
4883 set_circular_trace_buffer,
4884 NULL,
4885 &setlist,
4886 &showlist);
4887
00bf0b85
SS
4888 init_tfile_ops ();
4889
4890 add_target (&tfile_ops);
c906108c 4891}
This page took 1.569211 seconds and 4 git commands to generate.