2011-09-27 Tristan Gingold <gingold@adacore.com>
[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
4e5c165d
HZ
3094/* FIXME this function is heuristic and will miss the cases where the
3095 conditional is semantically identical but differs in whitespace,
3096 such as "x == 0" vs "x==0". */
3097
3098static int
3099cond_string_is_same (char *str1, char *str2)
3100{
3101 if (str1 == NULL || str2 == NULL)
3102 return (str1 == str2);
3103
3104 return (strcmp (str1, str2) == 0);
3105}
3106
00bf0b85
SS
3107/* Look for an existing tracepoint that seems similar enough to the
3108 uploaded one. Enablement isn't compared, because the user can
3109 toggle that freely, and may have done so in anticipation of the
3110 next trace run. */
3111
d9b3f62e 3112struct tracepoint *
00bf0b85
SS
3113find_matching_tracepoint (struct uploaded_tp *utp)
3114{
3115 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3116 int ix;
d9b3f62e 3117 struct breakpoint *b;
00bf0b85
SS
3118 struct bp_location *loc;
3119
d9b3f62e 3120 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
00bf0b85 3121 {
d9b3f62e
PA
3122 struct tracepoint *t = (struct tracepoint *) b;
3123
3124 if (b->type == utp->type
00bf0b85
SS
3125 && t->step_count == utp->step
3126 && t->pass_count == utp->pass
4e5c165d
HZ
3127 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3128 /* FIXME also test actions. */
00bf0b85
SS
3129 )
3130 {
3131 /* Scan the locations for an address match. */
d9b3f62e 3132 for (loc = b->loc; loc; loc = loc->next)
00bf0b85
SS
3133 {
3134 if (loc->address == utp->addr)
3135 return t;
3136 }
3137 }
3138 }
3139 return NULL;
3140}
3141
3142/* Given a list of tracepoints uploaded from a target, attempt to
3143 match them up with existing tracepoints, and create new ones if not
3144 found. */
3145
3146void
3147merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3148{
3149 struct uploaded_tp *utp;
d9b3f62e 3150 struct tracepoint *t;
00bf0b85
SS
3151
3152 /* Look for GDB tracepoints that match up with our uploaded versions. */
3153 for (utp = *uploaded_tps; utp; utp = utp->next)
3154 {
3155 t = find_matching_tracepoint (utp);
3156 if (t)
3e43a32a
MS
3157 printf_filtered (_("Assuming tracepoint %d is same "
3158 "as target's tracepoint %d at %s.\n"),
d9b3f62e 3159 t->base.number, utp->number,
3e43a32a 3160 paddress (get_current_arch (), utp->addr));
00bf0b85
SS
3161 else
3162 {
3163 t = create_tracepoint_from_upload (utp);
3164 if (t)
3e43a32a
MS
3165 printf_filtered (_("Created tracepoint %d for "
3166 "target's tracepoint %d at %s.\n"),
d9b3f62e 3167 t->base.number, utp->number,
3e43a32a 3168 paddress (get_current_arch (), utp->addr));
00bf0b85 3169 else
3e43a32a
MS
3170 printf_filtered (_("Failed to create tracepoint for target's "
3171 "tracepoint %d at %s, skipping it.\n"),
3172 utp->number,
3173 paddress (get_current_arch (), utp->addr));
00bf0b85
SS
3174 }
3175 /* Whether found or created, record the number used by the
3176 target, to help with mapping target tracepoints back to their
3177 counterparts here. */
3178 if (t)
3179 t->number_on_target = utp->number;
3180 }
3181
3182 free_uploaded_tps (uploaded_tps);
3183}
3184
3185/* Trace state variables don't have much to identify them beyond their
3186 name, so just use that to detect matches. */
3187
3188struct trace_state_variable *
3189find_matching_tsv (struct uploaded_tsv *utsv)
3190{
3191 if (!utsv->name)
3192 return NULL;
3193
3194 return find_trace_state_variable (utsv->name);
3195}
3196
3197struct trace_state_variable *
3198create_tsv_from_upload (struct uploaded_tsv *utsv)
3199{
3200 const char *namebase;
3201 char buf[20];
3202 int try_num = 0;
3203 struct trace_state_variable *tsv;
3204
3205 if (utsv->name)
3206 {
3207 namebase = utsv->name;
3208 sprintf (buf, "%s", namebase);
3209 }
3210 else
3211 {
3212 namebase = "__tsv";
3213 sprintf (buf, "%s_%d", namebase, try_num++);
3214 }
3215
3216 /* Fish for a name that is not in use. */
c378eb4e 3217 /* (should check against all internal vars?) */
00bf0b85
SS
3218 while (find_trace_state_variable (buf))
3219 sprintf (buf, "%s_%d", namebase, try_num++);
3220
3221 /* We have an available name, create the variable. */
a0aa2878 3222 tsv = create_trace_state_variable (buf);
00bf0b85
SS
3223 tsv->initial_value = utsv->initial_value;
3224 tsv->builtin = utsv->builtin;
3225
3226 return tsv;
3227}
3228
3229/* Given a list of uploaded trace state variables, try to match them
3230 up with existing variables, or create additional ones. */
3231
3232void
3233merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3234{
3235 int ix;
3236 struct uploaded_tsv *utsv;
3237 struct trace_state_variable *tsv;
3238 int highest;
3239
3240 /* Most likely some numbers will have to be reassigned as part of
3241 the merge, so clear them all in anticipation. */
3242 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3243 tsv->number = 0;
3244
3245 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3246 {
3247 tsv = find_matching_tsv (utsv);
3248 if (tsv)
417b5110
DJ
3249 {
3250 if (info_verbose)
3e43a32a
MS
3251 printf_filtered (_("Assuming trace state variable $%s "
3252 "is same as target's variable %d.\n"),
417b5110
DJ
3253 tsv->name, utsv->number);
3254 }
00bf0b85
SS
3255 else
3256 {
3257 tsv = create_tsv_from_upload (utsv);
417b5110 3258 if (info_verbose)
3e43a32a
MS
3259 printf_filtered (_("Created trace state variable "
3260 "$%s for target's variable %d.\n"),
417b5110 3261 tsv->name, utsv->number);
00bf0b85
SS
3262 }
3263 /* Give precedence to numberings that come from the target. */
3264 if (tsv)
3265 tsv->number = utsv->number;
3266 }
3267
3268 /* Renumber everything that didn't get a target-assigned number. */
3269 highest = 0;
3270 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3271 if (tsv->number > highest)
3272 highest = tsv->number;
3273
3274 ++highest;
3275 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3276 if (tsv->number == 0)
3277 tsv->number = highest++;
3278
3279 free_uploaded_tsvs (uploaded_tsvs);
3280}
3281
3282/* target tfile command */
3283
3284struct target_ops tfile_ops;
3285
3286/* Fill in tfile_ops with its defined operations and properties. */
3287
3288#define TRACE_HEADER_SIZE 8
3289
98e03262 3290char *trace_filename;
00bf0b85
SS
3291int trace_fd = -1;
3292off_t trace_frames_offset;
3293off_t cur_offset;
e6e4e701 3294int cur_traceframe_number;
00bf0b85
SS
3295int cur_data_size;
3296int trace_regblock_size;
3297
3298static void tfile_interp_line (char *line,
3299 struct uploaded_tp **utpp,
3300 struct uploaded_tsv **utsvp);
3301
9f41c731
PA
3302/* Read SIZE bytes into READBUF from the trace frame, starting at
3303 TRACE_FD's current position. Note that this call `read'
3304 underneath, hence it advances the file's seek position. Throws an
3305 error if the `read' syscall fails, or less than SIZE bytes are
3306 read. */
3307
3308static void
3309tfile_read (gdb_byte *readbuf, int size)
3310{
3311 int gotten;
3312
3313 gotten = read (trace_fd, readbuf, size);
3314 if (gotten < 0)
3315 perror_with_name (trace_filename);
3316 else if (gotten < size)
3317 error (_("Premature end of file while reading trace file"));
3318}
3319
00bf0b85
SS
3320static void
3321tfile_open (char *filename, int from_tty)
3322{
e93a69ed 3323 volatile struct gdb_exception ex;
00bf0b85
SS
3324 char *temp;
3325 struct cleanup *old_chain;
3326 int flags;
3327 int scratch_chan;
3328 char header[TRACE_HEADER_SIZE];
c378eb4e 3329 char linebuf[1000]; /* Should be max remote packet size or so. */
00bf0b85 3330 char byte;
9f41c731 3331 int bytes, i;
00bf0b85
SS
3332 struct trace_status *ts;
3333 struct uploaded_tp *uploaded_tps = NULL;
3334 struct uploaded_tsv *uploaded_tsvs = NULL;
3335
3336 target_preopen (from_tty);
3337 if (!filename)
3338 error (_("No trace file specified."));
3339
3340 filename = tilde_expand (filename);
3341 if (!IS_ABSOLUTE_PATH(filename))
3342 {
c4f7c687 3343 temp = concat (current_directory, "/", filename, (char *) NULL);
00bf0b85
SS
3344 xfree (filename);
3345 filename = temp;
3346 }
3347
3348 old_chain = make_cleanup (xfree, filename);
3349
3350 flags = O_BINARY | O_LARGEFILE;
3351 flags |= O_RDONLY;
3352 scratch_chan = open (filename, flags, 0);
3353 if (scratch_chan < 0)
3354 perror_with_name (filename);
3355
3356 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3357
c378eb4e 3358 discard_cleanups (old_chain); /* Don't free filename any more. */
00bf0b85
SS
3359 unpush_target (&tfile_ops);
3360
98e03262 3361 trace_filename = xstrdup (filename);
00bf0b85
SS
3362 trace_fd = scratch_chan;
3363
3364 bytes = 0;
3365 /* Read the file header and test for validity. */
9f41c731 3366 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
98e03262 3367
00bf0b85
SS
3368 bytes += TRACE_HEADER_SIZE;
3369 if (!(header[0] == 0x7f
3370 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3371 error (_("File is not a valid trace file."));
3372
e93a69ed
PA
3373 push_target (&tfile_ops);
3374
00bf0b85
SS
3375 trace_regblock_size = 0;
3376 ts = current_trace_status ();
3377 /* We know we're working with a file. */
3378 ts->from_file = 1;
3379 /* Set defaults in case there is no status line. */
3380 ts->running_known = 0;
3381 ts->stop_reason = trace_stop_reason_unknown;
3382 ts->traceframe_count = -1;
3383 ts->buffer_free = 0;
33da3f1c
SS
3384 ts->disconnected_tracing = 0;
3385 ts->circular_buffer = 0;
00bf0b85 3386
e6e4e701
PA
3387 cur_traceframe_number = -1;
3388
e93a69ed 3389 TRY_CATCH (ex, RETURN_MASK_ALL)
00bf0b85 3390 {
e93a69ed
PA
3391 /* Read through a section of newline-terminated lines that
3392 define things like tracepoints. */
3393 i = 0;
3394 while (1)
00bf0b85 3395 {
e93a69ed
PA
3396 tfile_read (&byte, 1);
3397
3398 ++bytes;
3399 if (byte == '\n')
3400 {
3401 /* Empty line marks end of the definition section. */
3402 if (i == 0)
3403 break;
3404 linebuf[i] = '\0';
3405 i = 0;
3406 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3407 }
3408 else
3409 linebuf[i++] = byte;
3410 if (i >= 1000)
3411 error (_("Excessively long lines in trace file"));
00bf0b85 3412 }
e93a69ed
PA
3413
3414 /* Record the starting offset of the binary trace data. */
3415 trace_frames_offset = bytes;
3416
3417 /* If we don't have a blocksize, we can't interpret the
3418 traceframes. */
3419 if (trace_regblock_size == 0)
3420 error (_("No register block size recorded in trace file"));
3421 }
3422 if (ex.reason < 0)
3423 {
3424 /* Pop the partially set up target. */
3425 pop_target ();
3426 throw_exception (ex);
00bf0b85
SS
3427 }
3428
e93a69ed
PA
3429 inferior_appeared (current_inferior (), TFILE_PID);
3430 inferior_ptid = pid_to_ptid (TFILE_PID);
3431 add_thread_silent (inferior_ptid);
3432
3433 if (ts->traceframe_count <= 0)
3434 warning (_("No traceframes present in this file."));
3435
00bf0b85
SS
3436 /* Add the file's tracepoints and variables into the current mix. */
3437
10ef8d6a
PA
3438 /* Get trace state variables first, they may be checked when parsing
3439 uploaded commands. */
00bf0b85
SS
3440 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3441
10ef8d6a
PA
3442 merge_uploaded_tracepoints (&uploaded_tps);
3443
00bf0b85 3444 post_create_inferior (&tfile_ops, from_tty);
00bf0b85
SS
3445}
3446
3447/* Interpret the given line from the definitions part of the trace
3448 file. */
3449
3450static void
3451tfile_interp_line (char *line,
3452 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3453{
3454 char *p = line;
3455
3456 if (strncmp (p, "R ", strlen ("R ")) == 0)
3457 {
3458 p += strlen ("R ");
3459 trace_regblock_size = strtol (p, &p, 16);
3460 }
3461 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3462 {
3463 p += strlen ("status ");
3464 parse_trace_status (p, current_trace_status ());
3465 }
3466 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3467 {
3468 p += strlen ("tp ");
3469 parse_tracepoint_definition (p, utpp);
3470 }
3471 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3472 {
3473 p += strlen ("tsv ");
3474 parse_tsv_definition (p, utsvp);
3475 }
3476 else
a73c6dcd 3477 warning (_("Ignoring trace file definition \"%s\""), line);
00bf0b85
SS
3478}
3479
3480/* Parse the part of trace status syntax that is shared between
3481 the remote protocol and the trace file reader. */
3482
00bf0b85
SS
3483void
3484parse_trace_status (char *line, struct trace_status *ts)
3485{
6c28cbf2 3486 char *p = line, *p1, *p2, *p_temp;
00bf0b85
SS
3487 ULONGEST val;
3488
3489 ts->running_known = 1;
3490 ts->running = (*p++ == '1');
3491 ts->stop_reason = trace_stop_reason_unknown;
a609a0c8
PA
3492 xfree (ts->error_desc);
3493 ts->error_desc = NULL;
4daf5ac0
SS
3494 ts->traceframe_count = -1;
3495 ts->traceframes_created = -1;
3496 ts->buffer_free = -1;
3497 ts->buffer_size = -1;
33da3f1c
SS
3498 ts->disconnected_tracing = 0;
3499 ts->circular_buffer = 0;
4daf5ac0 3500
00bf0b85
SS
3501 while (*p++)
3502 {
3503 p1 = strchr (p, ':');
3504 if (p1 == NULL)
3505 error (_("Malformed trace status, at %s\n\
3506Status line: '%s'\n"), p, line);
3507 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3508 {
3509 p = unpack_varlen_hex (++p1, &val);
3510 ts->stop_reason = trace_buffer_full;
3511 }
3512 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3513 {
3514 p = unpack_varlen_hex (++p1, &val);
3515 ts->stop_reason = trace_never_run;
3516 }
3e43a32a
MS
3517 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3518 p1 - p) == 0)
00bf0b85
SS
3519 {
3520 p = unpack_varlen_hex (++p1, &val);
3521 ts->stop_reason = tracepoint_passcount;
3522 ts->stopping_tracepoint = val;
3523 }
3524 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3525 {
3526 p = unpack_varlen_hex (++p1, &val);
3527 ts->stop_reason = tstop_command;
3528 }
33da3f1c
SS
3529 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3530 {
3531 p = unpack_varlen_hex (++p1, &val);
3532 ts->stop_reason = trace_disconnected;
3533 }
6c28cbf2
SS
3534 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3535 {
3536 p2 = strchr (++p1, ':');
3537 if (p2 != p1)
3538 {
3539 int end;
99b5e152
PA
3540
3541 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3542 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
6c28cbf2
SS
3543 ts->error_desc[end] = '\0';
3544 }
a609a0c8
PA
3545 else
3546 ts->error_desc = xstrdup ("");
3547
6c28cbf2
SS
3548 p = unpack_varlen_hex (++p2, &val);
3549 ts->stopping_tracepoint = val;
3550 ts->stop_reason = tracepoint_error;
3551 }
4daf5ac0 3552 else if (strncmp (p, "tframes", p1 - p) == 0)
00bf0b85
SS
3553 {
3554 p = unpack_varlen_hex (++p1, &val);
3555 ts->traceframe_count = val;
3556 }
4daf5ac0
SS
3557 else if (strncmp (p, "tcreated", p1 - p) == 0)
3558 {
3559 p = unpack_varlen_hex (++p1, &val);
3560 ts->traceframes_created = val;
3561 }
3562 else if (strncmp (p, "tfree", p1 - p) == 0)
00bf0b85
SS
3563 {
3564 p = unpack_varlen_hex (++p1, &val);
3565 ts->buffer_free = val;
3566 }
4daf5ac0
SS
3567 else if (strncmp (p, "tsize", p1 - p) == 0)
3568 {
3569 p = unpack_varlen_hex (++p1, &val);
3570 ts->buffer_size = val;
3571 }
33da3f1c
SS
3572 else if (strncmp (p, "disconn", p1 - p) == 0)
3573 {
3574 p = unpack_varlen_hex (++p1, &val);
3575 ts->disconnected_tracing = val;
3576 }
3577 else if (strncmp (p, "circular", p1 - p) == 0)
3578 {
3579 p = unpack_varlen_hex (++p1, &val);
3580 ts->circular_buffer = val;
3581 }
00bf0b85
SS
3582 else
3583 {
3584 /* Silently skip unknown optional info. */
3585 p_temp = strchr (p1 + 1, ';');
3586 if (p_temp)
3587 p = p_temp;
3588 else
3589 /* Must be at the end. */
3590 break;
3591 }
3592 }
3593}
3594
409873ef
SS
3595/* Given a line of text defining a part of a tracepoint, parse it into
3596 an "uploaded tracepoint". */
00bf0b85
SS
3597
3598void
3599parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3600{
3601 char *p;
3602 char piece;
409873ef 3603 ULONGEST num, addr, step, pass, orig_size, xlen, start;
2a2287c7 3604 int enabled, end;
00bf0b85 3605 enum bptype type;
2a2287c7 3606 char *cond, *srctype, *buf;
00bf0b85
SS
3607 struct uploaded_tp *utp = NULL;
3608
3609 p = line;
3610 /* Both tracepoint and action definitions start with the same number
3611 and address sequence. */
3612 piece = *p++;
3613 p = unpack_varlen_hex (p, &num);
3614 p++; /* skip a colon */
3615 p = unpack_varlen_hex (p, &addr);
3616 p++; /* skip a colon */
3617 if (piece == 'T')
3618 {
3619 enabled = (*p++ == 'E');
3620 p++; /* skip a colon */
3621 p = unpack_varlen_hex (p, &step);
3622 p++; /* skip a colon */
3623 p = unpack_varlen_hex (p, &pass);
3624 type = bp_tracepoint;
3625 cond = NULL;
3626 /* Thumb through optional fields. */
3627 while (*p == ':')
3628 {
3629 p++; /* skip a colon */
3630 if (*p == 'F')
3631 {
3632 type = bp_fast_tracepoint;
3633 p++;
3634 p = unpack_varlen_hex (p, &orig_size);
3635 }
0fb4aa4b
PA
3636 else if (*p == 'S')
3637 {
3638 type = bp_static_tracepoint;
3639 p++;
3640 }
00bf0b85
SS
3641 else if (*p == 'X')
3642 {
3643 p++;
3644 p = unpack_varlen_hex (p, &xlen);
3645 p++; /* skip a comma */
3646 cond = (char *) xmalloc (2 * xlen + 1);
3647 strncpy (cond, p, 2 * xlen);
3648 cond[2 * xlen] = '\0';
3649 p += 2 * xlen;
3650 }
3651 else
3e43a32a
MS
3652 warning (_("Unrecognized char '%c' in tracepoint "
3653 "definition, skipping rest"), *p);
00bf0b85
SS
3654 }
3655 utp = get_uploaded_tp (num, addr, utpp);
3656 utp->type = type;
3657 utp->enabled = enabled;
3658 utp->step = step;
3659 utp->pass = pass;
3660 utp->cond = cond;
3661 }
3662 else if (piece == 'A')
3663 {
3664 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3665 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
00bf0b85
SS
3666 }
3667 else if (piece == 'S')
3668 {
3669 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3670 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
00bf0b85 3671 }
409873ef
SS
3672 else if (piece == 'Z')
3673 {
3674 /* Parse a chunk of source form definition. */
3675 utp = get_uploaded_tp (num, addr, utpp);
3676 srctype = p;
3677 p = strchr (p, ':');
3678 p++; /* skip a colon */
3679 p = unpack_varlen_hex (p, &start);
3680 p++; /* skip a colon */
3681 p = unpack_varlen_hex (p, &xlen);
3682 p++; /* skip a colon */
3683
3684 buf = alloca (strlen (line));
3685
3686 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3687 buf[end] = '\0';
3688
3689 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3690 utp->at_string = xstrdup (buf);
3691 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3692 utp->cond_string = xstrdup (buf);
3693 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3149d8c1 3694 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
409873ef 3695 }
00bf0b85
SS
3696 else
3697 {
409873ef
SS
3698 /* Don't error out, the target might be sending us optional
3699 info that we don't care about. */
3700 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
00bf0b85
SS
3701 }
3702}
3703
3704/* Convert a textual description of a trace state variable into an
3705 uploaded object. */
3706
3707void
3708parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3709{
3710 char *p, *buf;
3711 ULONGEST num, initval, builtin;
3712 int end;
3713 struct uploaded_tsv *utsv = NULL;
3714
3715 buf = alloca (strlen (line));
3716
3717 p = line;
3718 p = unpack_varlen_hex (p, &num);
3719 p++; /* skip a colon */
3720 p = unpack_varlen_hex (p, &initval);
3721 p++; /* skip a colon */
3722 p = unpack_varlen_hex (p, &builtin);
3723 p++; /* skip a colon */
3724 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3725 buf[end] = '\0';
3726
3727 utsv = get_uploaded_tsv (num, utsvp);
3728 utsv->initial_value = initval;
3729 utsv->builtin = builtin;
3730 utsv->name = xstrdup (buf);
3731}
3732
3733/* Close the trace file and generally clean up. */
3734
3735static void
3736tfile_close (int quitting)
3737{
3738 int pid;
3739
3740 if (trace_fd < 0)
3741 return;
3742
3743 pid = ptid_get_pid (inferior_ptid);
c378eb4e 3744 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
00bf0b85
SS
3745 exit_inferior_silent (pid);
3746
3747 close (trace_fd);
3748 trace_fd = -1;
e93a69ed
PA
3749 xfree (trace_filename);
3750 trace_filename = NULL;
00bf0b85
SS
3751}
3752
3753static void
3754tfile_files_info (struct target_ops *t)
3755{
c378eb4e 3756 /* (it would be useful to mention the name of the file). */
00bf0b85
SS
3757 printf_filtered ("Looking at a trace file.\n");
3758}
3759
3760/* The trace status for a file is that tracing can never be run. */
3761
3762static int
3763tfile_get_trace_status (struct trace_status *ts)
3764{
3765 /* Other bits of trace status were collected as part of opening the
3766 trace files, so nothing to do here. */
3767
3768 return -1;
3769}
3770
3771/* Given the position of a traceframe in the file, figure out what
3772 address the frame was collected at. This would normally be the
3773 value of a collected PC register, but if not available, we
3774 improvise. */
3775
3776static ULONGEST
3777tfile_get_traceframe_address (off_t tframe_offset)
3778{
3779 ULONGEST addr = 0;
3780 short tpnum;
d9b3f62e 3781 struct tracepoint *tp;
00bf0b85
SS
3782 off_t saved_offset = cur_offset;
3783
c378eb4e 3784 /* FIXME dig pc out of collected registers. */
00bf0b85
SS
3785
3786 /* Fall back to using tracepoint address. */
3787 lseek (trace_fd, tframe_offset, SEEK_SET);
9f41c731 3788 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3789 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3790 gdbarch_byte_order
3791 (target_gdbarch));
98e03262 3792
00bf0b85 3793 tp = get_tracepoint_by_number_on_target (tpnum);
c378eb4e 3794 /* FIXME this is a poor heuristic if multiple locations. */
d9b3f62e
PA
3795 if (tp && tp->base.loc)
3796 addr = tp->base.loc->address;
00bf0b85
SS
3797
3798 /* Restore our seek position. */
3799 cur_offset = saved_offset;
3800 lseek (trace_fd, cur_offset, SEEK_SET);
3801 return addr;
3802}
3803
e6e4e701
PA
3804/* Make tfile's selected traceframe match GDB's selected
3805 traceframe. */
3806
3807static void
3808set_tfile_traceframe (void)
3809{
3810 int newnum;
3811
3812 if (cur_traceframe_number == get_traceframe_number ())
3813 return;
3814
3815 /* Avoid recursion, tfile_trace_find calls us again. */
3816 cur_traceframe_number = get_traceframe_number ();
3817
3818 newnum = target_trace_find (tfind_number,
3819 get_traceframe_number (), 0, 0, NULL);
3820
3821 /* Should not happen. If it does, all bets are off. */
3822 if (newnum != get_traceframe_number ())
3823 warning (_("could not set tfile's traceframe"));
3824}
3825
00bf0b85
SS
3826/* Given a type of search and some parameters, scan the collection of
3827 traceframes in the file looking for a match. When found, return
3828 both the traceframe and tracepoint number, otherwise -1 for
3829 each. */
3830
3831static int
3832tfile_trace_find (enum trace_find_type type, int num,
3833 ULONGEST addr1, ULONGEST addr2, int *tpp)
3834{
3835 short tpnum;
9f41c731 3836 int tfnum = 0, found = 0;
8991e9fa 3837 unsigned int data_size;
d9b3f62e 3838 struct tracepoint *tp;
00bf0b85
SS
3839 off_t offset, tframe_offset;
3840 ULONGEST tfaddr;
3841
e6e4e701
PA
3842 /* Lookups other than by absolute frame number depend on the current
3843 trace selected, so make sure it is correct on the tfile end
3844 first. */
3845 if (type != tfind_number)
3846 set_tfile_traceframe ();
fb80a3c5
HZ
3847 else if (num == -1)
3848 {
3849 if (tpp)
3850 *tpp = -1;
3851 return -1;
3852 }
e6e4e701 3853
00bf0b85
SS
3854 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3855 offset = trace_frames_offset;
3856 while (1)
3857 {
3858 tframe_offset = offset;
9f41c731 3859 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3860 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3861 gdbarch_byte_order
3862 (target_gdbarch));
00bf0b85
SS
3863 offset += 2;
3864 if (tpnum == 0)
3865 break;
9f41c731 3866 tfile_read ((gdb_byte *) &data_size, 4);
8991e9fa
HZ
3867 data_size = (unsigned int) extract_unsigned_integer
3868 ((gdb_byte *) &data_size, 4,
3869 gdbarch_byte_order (target_gdbarch));
00bf0b85
SS
3870 offset += 4;
3871 switch (type)
3872 {
3873 case tfind_number:
3874 if (tfnum == num)
3875 found = 1;
3876 break;
3877 case tfind_pc:
3878 tfaddr = tfile_get_traceframe_address (tframe_offset);
3879 if (tfaddr == addr1)
3880 found = 1;
3881 break;
3882 case tfind_tp:
3883 tp = get_tracepoint (num);
3884 if (tp && tpnum == tp->number_on_target)
3885 found = 1;
3886 break;
3887 case tfind_range:
3888 tfaddr = tfile_get_traceframe_address (tframe_offset);
3889 if (addr1 <= tfaddr && tfaddr <= addr2)
3890 found = 1;
3891 break;
3892 case tfind_outside:
3893 tfaddr = tfile_get_traceframe_address (tframe_offset);
3894 if (!(addr1 <= tfaddr && tfaddr <= addr2))
3895 found = 1;
3896 break;
3897 default:
3898 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
3899 }
3900 if (found)
3901 {
00bf0b85
SS
3902 if (tpp)
3903 *tpp = tpnum;
3904 cur_offset = offset;
3905 cur_data_size = data_size;
e6e4e701 3906 cur_traceframe_number = tfnum;
00bf0b85
SS
3907 return tfnum;
3908 }
3909 /* Skip past the traceframe's data. */
3910 lseek (trace_fd, data_size, SEEK_CUR);
3911 offset += data_size;
3912 /* Update our own count of traceframes. */
3913 ++tfnum;
3914 }
3915 /* Did not find what we were looking for. */
3916 if (tpp)
3917 *tpp = -1;
3918 return -1;
3919}
3920
9f41c731
PA
3921/* Prototype of the callback passed to tframe_walk_blocks. */
3922typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
3923
3924/* Callback for traceframe_walk_blocks, used to find a given block
3925 type in a traceframe. */
3926
3927static int
3928match_blocktype (char blocktype, void *data)
3929{
3930 char *wantedp = data;
3931
3932 if (*wantedp == blocktype)
3933 return 1;
3934
3935 return 0;
3936}
3937
3938/* Walk over all traceframe block starting at POS offset from
3939 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
3940 unmodified. If CALLBACK returns true, this returns the position in
3941 the traceframe where the block is found, relative to the start of
3942 the traceframe (cur_offset). Returns -1 if no callback call
3943 returned true, indicating that all blocks have been walked. */
3944
3945static int
3946traceframe_walk_blocks (walk_blocks_callback_func callback,
3947 int pos, void *data)
3948{
3949 /* Iterate through a traceframe's blocks, looking for a block of the
3950 requested type. */
3951
3952 lseek (trace_fd, cur_offset + pos, SEEK_SET);
3953 while (pos < cur_data_size)
3954 {
3955 unsigned short mlen;
3956 char block_type;
3957
3958 tfile_read (&block_type, 1);
3959
3960 ++pos;
3961
3962 if ((*callback) (block_type, data))
3963 return pos;
3964
3965 switch (block_type)
3966 {
3967 case 'R':
3968 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
3969 pos += trace_regblock_size;
3970 break;
3971 case 'M':
3972 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
3973 tfile_read ((gdb_byte *) &mlen, 2);
3974 mlen = (unsigned short)
3975 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
3976 gdbarch_byte_order
3977 (target_gdbarch));
3978 lseek (trace_fd, mlen, SEEK_CUR);
3979 pos += (8 + 2 + mlen);
3980 break;
3981 case 'V':
3982 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
3983 pos += (4 + 8);
3984 break;
3985 default:
c2f0d045 3986 error (_("Unknown block type '%c' (0x%x) in trace frame"),
9f41c731
PA
3987 block_type, block_type);
3988 break;
3989 }
3990 }
3991
3992 return -1;
3993}
3994
3995/* Convenience wrapper around traceframe_walk_blocks. Looks for the
3996 position offset of a block of type TYPE_WANTED in the current trace
3997 frame, starting at POS. Returns -1 if no such block was found. */
3998
3999static int
4000traceframe_find_block_type (char type_wanted, int pos)
4001{
4002 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4003}
4004
00bf0b85
SS
4005/* Look for a block of saved registers in the traceframe, and get the
4006 requested register from it. */
4007
4008static void
4009tfile_fetch_registers (struct target_ops *ops,
4010 struct regcache *regcache, int regno)
4011{
4012 struct gdbarch *gdbarch = get_regcache_arch (regcache);
4013 char block_type;
9f41c731 4014 int pos, offset, regn, regsize, pc_regno;
00bf0b85
SS
4015 unsigned short mlen;
4016 char *regs;
4017
4018 /* An uninitialized reg size says we're not going to be
4019 successful at getting register blocks. */
4020 if (!trace_regblock_size)
4021 return;
4022
e6e4e701
PA
4023 set_tfile_traceframe ();
4024
00bf0b85
SS
4025 regs = alloca (trace_regblock_size);
4026
9f41c731 4027 if (traceframe_find_block_type ('R', 0) >= 0)
00bf0b85 4028 {
9f41c731 4029 tfile_read (regs, trace_regblock_size);
98e03262 4030
9f41c731
PA
4031 /* Assume the block is laid out in GDB register number order,
4032 each register with the size that it has in GDB. */
4033 offset = 0;
4034 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
00bf0b85 4035 {
9f41c731
PA
4036 regsize = register_size (gdbarch, regn);
4037 /* Make sure we stay within block bounds. */
4038 if (offset + regsize >= trace_regblock_size)
4039 break;
4040 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
00bf0b85 4041 {
9f41c731 4042 if (regno == regn)
00bf0b85 4043 {
9f41c731
PA
4044 regcache_raw_supply (regcache, regno, regs + offset);
4045 break;
4046 }
4047 else if (regno == -1)
4048 {
4049 regcache_raw_supply (regcache, regn, regs + offset);
00bf0b85 4050 }
00bf0b85 4051 }
9f41c731 4052 offset += regsize;
00bf0b85 4053 }
9f41c731 4054 return;
00bf0b85 4055 }
af54718e 4056
9f41c731
PA
4057 /* We get here if no register data has been found. Mark registers
4058 as unavailable. */
af54718e
SS
4059 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4060 regcache_raw_supply (regcache, regn, NULL);
4061
4062 /* We can often usefully guess that the PC is going to be the same
4063 as the address of the tracepoint. */
4064 pc_regno = gdbarch_pc_regnum (gdbarch);
4065 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4066 {
d9b3f62e 4067 struct tracepoint *tp = get_tracepoint (tracepoint_number);
af54718e 4068
d9b3f62e 4069 if (tp && tp->base.loc)
af54718e
SS
4070 {
4071 /* But don't try to guess if tracepoint is multi-location... */
d9b3f62e 4072 if (tp->base.loc->next)
af54718e 4073 {
a73c6dcd
MS
4074 warning (_("Tracepoint %d has multiple "
4075 "locations, cannot infer $pc"),
d9b3f62e 4076 tp->base.number);
af54718e
SS
4077 return;
4078 }
4079 /* ... or does while-stepping. */
4080 if (tp->step_count > 0)
4081 {
a73c6dcd
MS
4082 warning (_("Tracepoint %d does while-stepping, "
4083 "cannot infer $pc"),
d9b3f62e 4084 tp->base.number);
af54718e
SS
4085 return;
4086 }
4087
4088 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4089 gdbarch_byte_order (gdbarch),
d9b3f62e 4090 tp->base.loc->address);
af54718e
SS
4091 regcache_raw_supply (regcache, pc_regno, regs);
4092 }
4093 }
00bf0b85
SS
4094}
4095
4096static LONGEST
4097tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4098 const char *annex, gdb_byte *readbuf,
4099 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4100{
00bf0b85
SS
4101 /* We're only doing regular memory for now. */
4102 if (object != TARGET_OBJECT_MEMORY)
4103 return -1;
4104
4105 if (readbuf == NULL)
a73c6dcd 4106 error (_("tfile_xfer_partial: trace file is read-only"));
00bf0b85 4107
e6e4e701
PA
4108 set_tfile_traceframe ();
4109
4110 if (traceframe_number != -1)
00bf0b85 4111 {
ffd5ec24 4112 int pos = 0;
9f41c731 4113
ffd5ec24
PA
4114 /* Iterate through the traceframe's blocks, looking for
4115 memory. */
4116 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
00bf0b85 4117 {
ffd5ec24
PA
4118 ULONGEST maddr, amt;
4119 unsigned short mlen;
4120 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
fce3c1f0 4121
ffd5ec24
PA
4122 tfile_read ((gdb_byte *) &maddr, 8);
4123 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4124 byte_order);
4125 tfile_read ((gdb_byte *) &mlen, 2);
4126 mlen = (unsigned short)
4127 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4128
4129 /* If the block includes the first part of the desired
4130 range, return as much it has; GDB will re-request the
4131 remainder, which might be in a different block of this
4132 trace frame. */
4133 if (maddr <= offset && offset < (maddr + mlen))
4134 {
4135 amt = (maddr + mlen) - offset;
4136 if (amt > len)
4137 amt = len;
4138
4139 tfile_read (readbuf, amt);
4140 return amt;
4141 }
9f41c731 4142
ffd5ec24
PA
4143 /* Skip over this block. */
4144 pos += (8 + 2 + mlen);
4145 }
00bf0b85 4146 }
fce3c1f0
SS
4147
4148 /* It's unduly pedantic to refuse to look at the executable for
4149 read-only pieces; so do the equivalent of readonly regions aka
4150 QTro packet. */
c378eb4e 4151 /* FIXME account for relocation at some point. */
fce3c1f0
SS
4152 if (exec_bfd)
4153 {
4154 asection *s;
4155 bfd_size_type size;
2209c807 4156 bfd_vma vma;
fce3c1f0
SS
4157
4158 for (s = exec_bfd->sections; s; s = s->next)
4159 {
9f41c731
PA
4160 if ((s->flags & SEC_LOAD) == 0
4161 || (s->flags & SEC_READONLY) == 0)
fce3c1f0
SS
4162 continue;
4163
2209c807 4164 vma = s->vma;
fce3c1f0 4165 size = bfd_get_section_size (s);
2209c807 4166 if (vma <= offset && offset < (vma + size))
fce3c1f0 4167 {
9f41c731
PA
4168 ULONGEST amt;
4169
2209c807 4170 amt = (vma + size) - offset;
fce3c1f0
SS
4171 if (amt > len)
4172 amt = len;
4173
4174 amt = bfd_get_section_contents (exec_bfd, s,
2209c807 4175 readbuf, offset - vma, amt);
fce3c1f0
SS
4176 return amt;
4177 }
4178 }
4179 }
4180
00bf0b85
SS
4181 /* Indicate failure to find the requested memory block. */
4182 return -1;
4183}
4184
4185/* Iterate through the blocks of a trace frame, looking for a 'V'
4186 block with a matching tsv number. */
4187
4188static int
4189tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4190{
9f41c731 4191 int pos;
00bf0b85 4192
e6e4e701
PA
4193 set_tfile_traceframe ();
4194
00bf0b85 4195 pos = 0;
9f41c731 4196 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
00bf0b85 4197 {
9f41c731
PA
4198 int vnum;
4199
4200 tfile_read ((gdb_byte *) &vnum, 4);
4201 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
8991e9fa 4202 gdbarch_byte_order
9f41c731
PA
4203 (target_gdbarch));
4204 if (tsvnum == vnum)
4205 {
4206 tfile_read ((gdb_byte *) val, 8);
4207 *val = extract_signed_integer ((gdb_byte *) val, 8,
4208 gdbarch_byte_order
4209 (target_gdbarch));
4210 return 1;
00bf0b85 4211 }
9f41c731 4212 pos += (4 + 8);
00bf0b85 4213 }
9f41c731 4214
00bf0b85
SS
4215 /* Didn't find anything. */
4216 return 0;
4217}
4218
fce3c1f0
SS
4219static int
4220tfile_has_all_memory (struct target_ops *ops)
4221{
4222 return 1;
4223}
4224
00bf0b85
SS
4225static int
4226tfile_has_memory (struct target_ops *ops)
4227{
4228 return 1;
4229}
4230
4231static int
4232tfile_has_stack (struct target_ops *ops)
4233{
ffd5ec24 4234 return traceframe_number != -1;
00bf0b85
SS
4235}
4236
4237static int
4238tfile_has_registers (struct target_ops *ops)
4239{
ffd5ec24 4240 return traceframe_number != -1;
00bf0b85
SS
4241}
4242
e93a69ed
PA
4243static int
4244tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4245{
4246 return 1;
4247}
4248
b3b9301e
PA
4249/* Callback for traceframe_walk_blocks. Builds a traceframe_info
4250 object for the tfile target's current traceframe. */
4251
4252static int
4253build_traceframe_info (char blocktype, void *data)
4254{
4255 struct traceframe_info *info = data;
4256
4257 switch (blocktype)
4258 {
4259 case 'M':
4260 {
4261 struct mem_range *r;
4262 ULONGEST maddr;
4263 unsigned short mlen;
4264
4265 tfile_read ((gdb_byte *) &maddr, 8);
4266 tfile_read ((gdb_byte *) &mlen, 2);
4267
4268 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4269
4270 r->start = maddr;
4271 r->length = mlen;
4272 break;
4273 }
4274 case 'V':
4275 case 'R':
4276 case 'S':
4277 {
4278 break;
4279 }
4280 default:
4281 warning (_("Unhandled trace block type (%d) '%c ' "
4282 "while building trace frame info."),
4283 blocktype, blocktype);
4284 break;
4285 }
4286
4287 return 0;
4288}
4289
4290static struct traceframe_info *
4291tfile_traceframe_info (void)
4292{
4293 struct traceframe_info *info = XCNEW (struct traceframe_info);
4294
4295 traceframe_walk_blocks (build_traceframe_info, 0, info);
4296 return info;
4297}
4298
00bf0b85
SS
4299static void
4300init_tfile_ops (void)
4301{
4302 tfile_ops.to_shortname = "tfile";
4303 tfile_ops.to_longname = "Local trace dump file";
3e43a32a
MS
4304 tfile_ops.to_doc
4305 = "Use a trace file as a target. Specify the filename of the trace file.";
00bf0b85
SS
4306 tfile_ops.to_open = tfile_open;
4307 tfile_ops.to_close = tfile_close;
4308 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4309 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4310 tfile_ops.to_files_info = tfile_files_info;
4311 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4312 tfile_ops.to_trace_find = tfile_trace_find;
3e43a32a
MS
4313 tfile_ops.to_get_trace_state_variable_value
4314 = tfile_get_trace_state_variable_value;
00bf0b85 4315 tfile_ops.to_stratum = process_stratum;
fce3c1f0 4316 tfile_ops.to_has_all_memory = tfile_has_all_memory;
00bf0b85
SS
4317 tfile_ops.to_has_memory = tfile_has_memory;
4318 tfile_ops.to_has_stack = tfile_has_stack;
4319 tfile_ops.to_has_registers = tfile_has_registers;
b3b9301e 4320 tfile_ops.to_traceframe_info = tfile_traceframe_info;
e93a69ed 4321 tfile_ops.to_thread_alive = tfile_thread_alive;
00bf0b85
SS
4322 tfile_ops.to_magic = OPS_MAGIC;
4323}
4324
0fb4aa4b
PA
4325/* Given a line of text defining a static tracepoint marker, parse it
4326 into a "static tracepoint marker" object. Throws an error is
4327 parsing fails. If PP is non-null, it points to one past the end of
4328 the parsed marker definition. */
4329
4330void
4331parse_static_tracepoint_marker_definition (char *line, char **pp,
4332 struct static_tracepoint_marker *marker)
4333{
4334 char *p, *endp;
4335 ULONGEST addr;
4336 int end;
4337
4338 p = line;
4339 p = unpack_varlen_hex (p, &addr);
4340 p++; /* skip a colon */
4341
4342 marker->gdbarch = target_gdbarch;
4343 marker->address = (CORE_ADDR) addr;
4344
4345 endp = strchr (p, ':');
4346 if (endp == NULL)
74232302 4347 error (_("bad marker definition: %s"), line);
0fb4aa4b
PA
4348
4349 marker->str_id = xmalloc (endp - p + 1);
4350 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4351 marker->str_id[end] = '\0';
4352
4353 p += 2 * end;
4354 p++; /* skip a colon */
4355
4356 marker->extra = xmalloc (strlen (p) + 1);
4357 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4358 marker->extra[end] = '\0';
4359
4360 if (pp)
4361 *pp = p;
4362}
4363
4364/* Release a static tracepoint marker's contents. Note that the
4365 object itself isn't released here. There objects are usually on
4366 the stack. */
4367
4368void
4369release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4370{
4371 xfree (marker->str_id);
4372 marker->str_id = NULL;
4373}
4374
4375/* Print MARKER to gdb_stdout. */
4376
4377static void
4378print_one_static_tracepoint_marker (int count,
4379 struct static_tracepoint_marker *marker)
4380{
4381 struct command_line *l;
4382 struct symbol *sym;
4383
4384 char wrap_indent[80];
4385 char extra_field_indent[80];
79a45e25 4386 struct ui_out *uiout = current_uiout;
0fb4aa4b
PA
4387 struct ui_stream *stb = ui_out_stream_new (uiout);
4388 struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4389 struct cleanup *bkpt_chain;
4390 VEC(breakpoint_p) *tracepoints;
4391
4392 struct symtab_and_line sal;
4393
4394 init_sal (&sal);
4395
4396 sal.pc = marker->address;
4397
4398 tracepoints = static_tracepoints_here (marker->address);
4399
4400 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4401
4402 /* A counter field to help readability. This is not a stable
4403 identifier! */
4404 ui_out_field_int (uiout, "count", count);
4405
4406 ui_out_field_string (uiout, "marker-id", marker->str_id);
4407
4408 ui_out_field_fmt (uiout, "enabled", "%c",
4409 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4410 ui_out_spaces (uiout, 2);
4411
4412 strcpy (wrap_indent, " ");
4413
4414 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4415 strcat (wrap_indent, " ");
4416 else
4417 strcat (wrap_indent, " ");
4418
4419 strcpy (extra_field_indent, " ");
4420
4421 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4422
4423 sal = find_pc_line (marker->address, 0);
4424 sym = find_pc_sect_function (marker->address, NULL);
4425 if (sym)
4426 {
4427 ui_out_text (uiout, "in ");
4428 ui_out_field_string (uiout, "func",
4429 SYMBOL_PRINT_NAME (sym));
4430 ui_out_wrap_hint (uiout, wrap_indent);
4431 ui_out_text (uiout, " at ");
4432 }
4433 else
4434 ui_out_field_skip (uiout, "func");
4435
4436 if (sal.symtab != NULL)
4437 {
4438 ui_out_field_string (uiout, "file", sal.symtab->filename);
4439 ui_out_text (uiout, ":");
4440
4441 if (ui_out_is_mi_like_p (uiout))
4442 {
4443 char *fullname = symtab_to_fullname (sal.symtab);
4444
4445 if (fullname)
4446 ui_out_field_string (uiout, "fullname", fullname);
4447 }
4448 else
4449 ui_out_field_skip (uiout, "fullname");
4450
4451 ui_out_field_int (uiout, "line", sal.line);
4452 }
4453 else
4454 {
4455 ui_out_field_skip (uiout, "fullname");
4456 ui_out_field_skip (uiout, "line");
4457 }
4458
4459 ui_out_text (uiout, "\n");
4460 ui_out_text (uiout, extra_field_indent);
4461 ui_out_text (uiout, _("Data: \""));
4462 ui_out_field_string (uiout, "extra-data", marker->extra);
4463 ui_out_text (uiout, "\"\n");
4464
4465 if (!VEC_empty (breakpoint_p, tracepoints))
4466 {
4467 struct cleanup *cleanup_chain;
4468 int ix;
4469 struct breakpoint *b;
4470
4471 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4472 "tracepoints-at");
4473
4474 ui_out_text (uiout, extra_field_indent);
4475 ui_out_text (uiout, _("Probed by static tracepoints: "));
4476 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4477 {
4478 if (ix > 0)
4479 ui_out_text (uiout, ", ");
4480 ui_out_text (uiout, "#");
4481 ui_out_field_int (uiout, "tracepoint-id", b->number);
4482 }
4483
4484 do_cleanups (cleanup_chain);
4485
4486 if (ui_out_is_mi_like_p (uiout))
4487 ui_out_field_int (uiout, "number-of-tracepoints",
4488 VEC_length(breakpoint_p, tracepoints));
4489 else
4490 ui_out_text (uiout, "\n");
4491 }
4492 VEC_free (breakpoint_p, tracepoints);
4493
4494 do_cleanups (bkpt_chain);
4495 do_cleanups (old_chain);
4496}
4497
4498static void
4499info_static_tracepoint_markers_command (char *arg, int from_tty)
4500{
4501 VEC(static_tracepoint_marker_p) *markers;
4502 struct cleanup *old_chain;
4503 struct static_tracepoint_marker *marker;
79a45e25 4504 struct ui_out *uiout = current_uiout;
0fb4aa4b
PA
4505 int i;
4506
4507 old_chain
4508 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4509 "StaticTracepointMarkersTable");
4510
4511 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4512
4513 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4514
4515 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4516 if (gdbarch_addr_bit (target_gdbarch) <= 32)
4517 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4518 else
4519 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4520 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4521
4522 ui_out_table_body (uiout);
4523
4524 markers = target_static_tracepoint_markers_by_strid (NULL);
4525 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4526
4527 for (i = 0;
4528 VEC_iterate (static_tracepoint_marker_p,
4529 markers, i, marker);
4530 i++)
4531 {
4532 print_one_static_tracepoint_marker (i + 1, marker);
4533 release_static_tracepoint_marker (marker);
4534 }
4535
4536 do_cleanups (old_chain);
4537}
4538
4539/* The $_sdata convenience variable is a bit special. We don't know
4540 for sure type of the value until we actually have a chance to fetch
4541 the data --- the size of the object depends on what has been
4542 collected. We solve this by making $_sdata be an internalvar that
4543 creates a new value on access. */
4544
4545/* Return a new value with the correct type for the sdata object of
4546 the current trace frame. Return a void value if there's no object
4547 available. */
4548
4549static struct value *
4550sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4551{
4552 LONGEST size;
4553 gdb_byte *buf;
4554
4555 /* We need to read the whole object before we know its size. */
4556 size = target_read_alloc (&current_target,
4557 TARGET_OBJECT_STATIC_TRACE_DATA,
4558 NULL, &buf);
4559 if (size >= 0)
4560 {
4561 struct value *v;
4562 struct type *type;
4563
4564 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4565 size);
4566 v = allocate_value (type);
4567 memcpy (value_contents_raw (v), buf, size);
4568 xfree (buf);
4569 return v;
4570 }
4571 else
4572 return allocate_value (builtin_type (gdbarch)->builtin_void);
4573}
4574
b3b9301e
PA
4575#if !defined(HAVE_LIBEXPAT)
4576
4577struct traceframe_info *
4578parse_traceframe_info (const char *tframe_info)
4579{
4580 static int have_warned;
4581
4582 if (!have_warned)
4583 {
4584 have_warned = 1;
4585 warning (_("Can not parse XML trace frame info; XML support "
4586 "was disabled at compile time"));
4587 }
4588
4589 return NULL;
4590}
4591
4592#else /* HAVE_LIBEXPAT */
4593
4594#include "xml-support.h"
4595
4596/* Handle the start of a <memory> element. */
4597
4598static void
4599traceframe_info_start_memory (struct gdb_xml_parser *parser,
4600 const struct gdb_xml_element *element,
4601 void *user_data, VEC(gdb_xml_value_s) *attributes)
4602{
4603 struct traceframe_info *info = user_data;
4604 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4605 ULONGEST *start_p, *length_p;
4606
4607 start_p = xml_find_attribute (attributes, "start")->value;
4608 length_p = xml_find_attribute (attributes, "length")->value;
4609
4610 r->start = *start_p;
4611 r->length = *length_p;
4612}
4613
4614/* Discard the constructed trace frame info (if an error occurs). */
4615
4616static void
4617free_result (void *p)
4618{
4619 struct traceframe_info *result = p;
4620
4621 free_traceframe_info (result);
4622}
4623
4624/* The allowed elements and attributes for an XML memory map. */
4625
4626static const struct gdb_xml_attribute memory_attributes[] = {
4627 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4628 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4629 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4630};
4631
4632static const struct gdb_xml_element traceframe_info_children[] = {
4633 { "memory", memory_attributes, NULL,
4634 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4635 traceframe_info_start_memory, NULL },
4636 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4637};
4638
4639static const struct gdb_xml_element traceframe_info_elements[] = {
4640 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4641 NULL, NULL },
4642 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4643};
4644
4645/* Parse a traceframe-info XML document. */
4646
4647struct traceframe_info *
4648parse_traceframe_info (const char *tframe_info)
4649{
4650 struct traceframe_info *result;
4651 struct cleanup *back_to;
4652
4653 result = XCNEW (struct traceframe_info);
4654 back_to = make_cleanup (free_result, result);
4655
4656 if (gdb_xml_parse_quick (_("trace frame info"),
4657 "traceframe-info.dtd", traceframe_info_elements,
4658 tframe_info, result) == 0)
4659 {
4660 /* Parsed successfully, keep the result. */
4661 discard_cleanups (back_to);
4662
4663 return result;
4664 }
4665
4666 do_cleanups (back_to);
4667 return NULL;
4668}
4669
4670#endif /* HAVE_LIBEXPAT */
4671
4672/* Returns the traceframe_info object for the current traceframe.
4673 This is where we avoid re-fetching the object from the target if we
4674 already have it cached. */
4675
4676struct traceframe_info *
4677get_traceframe_info (void)
4678{
4679 if (traceframe_info == NULL)
4680 traceframe_info = target_traceframe_info ();
4681
4682 return traceframe_info;
4683}
4684
c0f61f9c
PA
4685/* If the target supports the query, return in RESULT the set of
4686 collected memory in the current traceframe, found within the LEN
4687 bytes range starting at MEMADDR. Returns true if the target
4688 supports the query, otherwise returns false, and RESULT is left
4689 undefined. */
2a7498d8
PA
4690
4691int
4692traceframe_available_memory (VEC(mem_range_s) **result,
4693 CORE_ADDR memaddr, ULONGEST len)
4694{
4695 struct traceframe_info *info = get_traceframe_info ();
4696
4697 if (info != NULL)
4698 {
4699 struct mem_range *r;
4700 int i;
4701
4702 *result = NULL;
4703
4704 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4705 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4706 {
4707 ULONGEST lo1, hi1, lo2, hi2;
4708 struct mem_range *nr;
4709
4710 lo1 = memaddr;
4711 hi1 = memaddr + len;
4712
4713 lo2 = r->start;
4714 hi2 = r->start + r->length;
4715
4716 nr = VEC_safe_push (mem_range_s, *result, NULL);
4717
4718 nr->start = max (lo1, lo2);
4719 nr->length = min (hi1, hi2) - nr->start;
4720 }
4721
4722 normalize_mem_ranges (*result);
4723 return 1;
4724 }
4725
4726 return 0;
4727}
4728
c906108c
SS
4729/* module initialization */
4730void
fba45db2 4731_initialize_tracepoint (void)
c906108c 4732{
fa58ee11
EZ
4733 struct cmd_list_element *c;
4734
0fb4aa4b
PA
4735 /* Explicitly create without lookup, since that tries to create a
4736 value with a void typed value, and when we get here, gdbarch
4737 isn't initialized yet. At this point, we're quite sure there
4738 isn't another convenience variable of the same name. */
4739 create_internalvar_type_lazy ("_sdata", sdata_make_value);
4740
c906108c
SS
4741 traceframe_number = -1;
4742 tracepoint_number = -1;
4743
c906108c
SS
4744 if (tracepoint_list.list == NULL)
4745 {
4746 tracepoint_list.listsize = 128;
c5aa993b 4747 tracepoint_list.list = xmalloc
c906108c
SS
4748 (tracepoint_list.listsize * sizeof (struct memrange));
4749 }
4750 if (tracepoint_list.aexpr_list == NULL)
4751 {
4752 tracepoint_list.aexpr_listsize = 128;
4753 tracepoint_list.aexpr_list = xmalloc
4754 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4755 }
4756
4757 if (stepping_list.list == NULL)
4758 {
4759 stepping_list.listsize = 128;
c5aa993b 4760 stepping_list.list = xmalloc
c906108c
SS
4761 (stepping_list.listsize * sizeof (struct memrange));
4762 }
4763
4764 if (stepping_list.aexpr_list == NULL)
4765 {
4766 stepping_list.aexpr_listsize = 128;
4767 stepping_list.aexpr_list = xmalloc
4768 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4769 }
4770
c5aa993b 4771 add_info ("scope", scope_info,
1bedd215 4772 _("List the variables local to a scope"));
c906108c 4773
e00d1dc8 4774 add_cmd ("tracepoints", class_trace, NULL,
1a966eab 4775 _("Tracing of program execution without stopping the program."),
c906108c
SS
4776 &cmdlist);
4777
c5aa993b 4778 add_com ("tdump", class_trace, trace_dump_command,
1bedd215 4779 _("Print everything collected at the current tracepoint."));
c906108c 4780
00bf0b85
SS
4781 add_com ("tsave", class_trace, trace_save_command, _("\
4782Save the trace data to a file.\n\
4783Use the '-r' option to direct the target to save directly to the file,\n\
4784using its own filesystem."));
4785
f61e138d
SS
4786 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4787Define a trace state variable.\n\
4788Argument is a $-prefixed name, optionally followed\n\
4789by '=' and an expression that sets the initial value\n\
4790at the start of tracing."));
4791 set_cmd_completer (c, expression_completer);
4792
4793 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4794Delete one or more trace state variables.\n\
4795Arguments are the names of the variables to delete.\n\
4796If no arguments are supplied, delete all variables."), &deletelist);
c378eb4e 4797 /* FIXME add a trace variable completer. */
f61e138d
SS
4798
4799 add_info ("tvariables", tvariables_info, _("\
4800Status of trace state variables and their values.\n\
0fb4aa4b
PA
4801"));
4802
4803 add_info ("static-tracepoint-markers",
4804 info_static_tracepoint_markers_command, _("\
4805List target static tracepoints markers.\n\
f61e138d
SS
4806"));
4807
1bedd215
AC
4808 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4809Select a trace frame;\n\
4810No argument means forward by one frame; '-' means backward by one frame."),
c906108c
SS
4811 &tfindlist, "tfind ", 1, &cmdlist);
4812
1a966eab 4813 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
081dfbf7 4814Select a trace frame whose PC is outside the given range (exclusive).\n\
1a966eab 4815Usage: tfind outside addr1, addr2"),
c906108c
SS
4816 &tfindlist);
4817
1a966eab 4818 add_cmd ("range", class_trace, trace_find_range_command, _("\
081dfbf7 4819Select a trace frame whose PC is in the given range (inclusive).\n\
1a966eab 4820Usage: tfind range addr1,addr2"),
c906108c
SS
4821 &tfindlist);
4822
1a966eab
AC
4823 add_cmd ("line", class_trace, trace_find_line_command, _("\
4824Select a trace frame by source line.\n\
cce7e648 4825Argument can be a line number (with optional source file),\n\
c906108c 4826a function name, or '*' followed by an address.\n\
1a966eab 4827Default argument is 'the next source line that was traced'."),
c906108c
SS
4828 &tfindlist);
4829
1a966eab
AC
4830 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4831Select a trace frame by tracepoint number.\n\
4832Default is the tracepoint for the current trace frame."),
c906108c
SS
4833 &tfindlist);
4834
1a966eab
AC
4835 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4836Select a trace frame by PC.\n\
4837Default is the current PC, or the PC of the current trace frame."),
c906108c
SS
4838 &tfindlist);
4839
1a966eab
AC
4840 add_cmd ("end", class_trace, trace_find_end_command, _("\
4841Synonym for 'none'.\n\
4842De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4843 &tfindlist);
4844
4845 add_cmd ("none", class_trace, trace_find_none_command,
1a966eab 4846 _("De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4847 &tfindlist);
4848
4849 add_cmd ("start", class_trace, trace_find_start_command,
1a966eab 4850 _("Select the first trace frame in the trace buffer."),
c906108c
SS
4851 &tfindlist);
4852
c5aa993b 4853 add_com ("tstatus", class_trace, trace_status_command,
1bedd215 4854 _("Display the status of the current trace data collection."));
c906108c 4855
c5aa993b 4856 add_com ("tstop", class_trace, trace_stop_command,
1bedd215 4857 _("Stop trace data collection."));
c906108c
SS
4858
4859 add_com ("tstart", class_trace, trace_start_command,
1bedd215 4860 _("Start trace data collection."));
c906108c 4861
1bedd215
AC
4862 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4863Ends a list of commands or actions.\n\
c906108c
SS
4864Several GDB commands allow you to enter a list of commands or actions.\n\
4865Entering \"end\" on a line by itself is the normal way to terminate\n\
4866such a list.\n\n\
1bedd215 4867Note: the \"end\" command cannot be used at the gdb prompt."));
c906108c 4868
1bedd215
AC
4869 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4870Specify single-stepping behavior at a tracepoint.\n\
c906108c
SS
4871Argument is number of instructions to trace in single-step mode\n\
4872following the tracepoint. This command is normally followed by\n\
4873one or more \"collect\" commands, to specify what to collect\n\
4874while single-stepping.\n\n\
1bedd215 4875Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 4876
c5aa993b
JM
4877 add_com_alias ("ws", "while-stepping", class_alias, 0);
4878 add_com_alias ("stepping", "while-stepping", class_alias, 0);
c906108c 4879
1bedd215
AC
4880 add_com ("collect", class_trace, collect_pseudocommand, _("\
4881Specify one or more data items to be collected at a tracepoint.\n\
c906108c
SS
4882Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4883collect all data (variables, registers) referenced by that expression.\n\
4884Also accepts the following special arguments:\n\
4885 $regs -- all registers.\n\
4886 $args -- all function arguments.\n\
4887 $locals -- all variables local to the block/function scope.\n\
0fb4aa4b 4888 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
1bedd215 4889Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 4890
6da95a67
SS
4891 add_com ("teval", class_trace, teval_pseudocommand, _("\
4892Specify one or more expressions to be evaluated at a tracepoint.\n\
4893Accepts a comma-separated list of (one or more) expressions.\n\
4894The result of each evaluation will be discarded.\n\
4895Note: this command can only be used in a tracepoint \"actions\" list."));
4896
1bedd215
AC
4897 add_com ("actions", class_trace, trace_actions_command, _("\
4898Specify the actions to be taken at a tracepoint.\n\
cce7e648
PA
4899Tracepoint actions may include collecting of specified data,\n\
4900single-stepping, or enabling/disabling other tracepoints,\n\
1bedd215 4901depending on target's capabilities."));
c906108c 4902
236f1d4d
SS
4903 default_collect = xstrdup ("");
4904 add_setshow_string_cmd ("default-collect", class_trace,
4905 &default_collect, _("\
4906Set the list of expressions to collect by default"), _("\
4907Show the list of expressions to collect by default"), NULL,
4908 NULL, NULL,
4909 &setlist, &showlist);
4910
d5551862
SS
4911 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
4912 &disconnected_tracing, _("\
4913Set whether tracing continues after GDB disconnects."), _("\
4914Show whether tracing continues after GDB disconnects."), _("\
4915Use this to continue a tracing run even if GDB disconnects\n\
4916or detaches from the target. You can reconnect later and look at\n\
4917trace data collected in the meantime."),
4918 set_disconnected_tracing,
4919 NULL,
4920 &setlist,
4921 &showlist);
00bf0b85 4922
4daf5ac0
SS
4923 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
4924 &circular_trace_buffer, _("\
4925Set target's use of circular trace buffer."), _("\
4926Show target's use of circular trace buffer."), _("\
4927Use this to make the trace buffer into a circular buffer,\n\
4928which will discard traceframes (oldest first) instead of filling\n\
4929up and stopping the trace run."),
4930 set_circular_trace_buffer,
4931 NULL,
4932 &setlist,
4933 &showlist);
4934
00bf0b85
SS
4935 init_tfile_ops ();
4936
4937 add_target (&tfile_ops);
c906108c 4938}
This page took 1.542097 seconds and 4 git commands to generate.