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