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