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