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