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