gdb/
[deliverable/binutils-gdb.git] / gdb / tracepoint.c
CommitLineData
c906108c 1/* Tracing functionality for remote targets in custom GDB protocol
9f60d481 2
6aba47ca 3 Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
7b6bb8da 4 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc.
c906108c 5
c5aa993b 6 This file is part of GDB.
c906108c 7
c5aa993b
JM
8 This program is free software; you can redistribute it and/or modify
9 it under the terms of the GNU General Public License as published by
a9762ec7 10 the Free Software Foundation; either version 3 of the License, or
c5aa993b 11 (at your option) any later version.
c906108c 12
c5aa993b
JM
13 This program is distributed in the hope that it will be useful,
14 but WITHOUT ANY WARRANTY; without even the implied warranty of
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 GNU General Public License for more details.
c906108c 17
c5aa993b 18 You should have received a copy of the GNU General Public License
a9762ec7 19 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
20
21#include "defs.h"
5af949e3 22#include "arch-utils.h"
c906108c
SS
23#include "symtab.h"
24#include "frame.h"
c906108c
SS
25#include "gdbtypes.h"
26#include "expression.h"
27#include "gdbcmd.h"
28#include "value.h"
29#include "target.h"
30#include "language.h"
31#include "gdb_string.h"
104c1213 32#include "inferior.h"
1042e4c0 33#include "breakpoint.h"
104c1213 34#include "tracepoint.h"
c5f0f3d0 35#include "linespec.h"
4e052eda 36#include "regcache.h"
c94fdfd0 37#include "completer.h"
fe898f56 38#include "block.h"
de4f826b 39#include "dictionary.h"
383f836e 40#include "observer.h"
029a67e4 41#include "user-regs.h"
79a45b7d 42#include "valprint.h"
41575630 43#include "gdbcore.h"
768a979c 44#include "objfiles.h"
35b1e5cc 45#include "filenames.h"
00bf0b85 46#include "gdbthread.h"
2c58c0a9 47#include "stack.h"
fce3c1f0 48#include "gdbcore.h"
176a6961 49#include "remote.h"
0fb4aa4b 50#include "source.h"
c906108c
SS
51#include "ax.h"
52#include "ax-gdb.h"
2a7498d8 53#include "memrange.h"
e93a69ed 54#include "exceptions.h"
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)
1e4d1764
YQ
1714 {
1715 /* Since tracepoint locations are never duplicated, `inserted'
1716 flag should be zero. */
1717 gdb_assert (!loc->inserted);
1718
1719 target_download_tracepoint (loc);
1720
1721 loc->inserted = 1;
1722 }
e8ba3115 1723
d9b3f62e 1724 t->number_on_target = b->number;
7a697b8d 1725 }
35b1e5cc 1726 VEC_free (breakpoint_p, tp_vec);
76a2b958 1727
00bf0b85 1728 /* Send down all the trace state variables too. */
35b1e5cc 1729 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
782b2b07 1730 {
00bf0b85 1731 target_download_trace_state_variable (tsv);
782b2b07 1732 }
35b1e5cc
SS
1733
1734 /* Tell target to treat text-like sections as transparent. */
1735 target_trace_set_readonly_regions ();
4daf5ac0
SS
1736 /* Set some mode flags. */
1737 target_set_disconnected_tracing (disconnected_tracing);
1738 target_set_circular_trace_buffer (circular_trace_buffer);
1042e4c0 1739
35b1e5cc
SS
1740 /* Now insert traps and begin collecting data. */
1741 target_trace_start ();
1042e4c0 1742
35b1e5cc
SS
1743 /* Reset our local state. */
1744 set_traceframe_num (-1);
1745 set_tracepoint_num (-1);
1746 set_traceframe_context (NULL);
00bf0b85 1747 current_trace_status()->running = 1;
b3b9301e 1748 clear_traceframe_info ();
1042e4c0
SS
1749}
1750
f224b49d
VP
1751/* tstart command:
1752
1753 Tell target to clear any previous trace experiment.
1754 Walk the list of tracepoints, and send them (and their actions)
1755 to the target. If no errors,
1756 Tell target to start a new trace experiment. */
1757
1758static void
1759trace_start_command (char *args, int from_tty)
1760{
1761 dont_repeat (); /* Like "run", dangerous to repeat accidentally. */
1762
615bcdef
SS
1763 if (current_trace_status ()->running)
1764 {
1765 if (from_tty
1766 && !query (_("A trace is running already. Start a new run? ")))
1767 error (_("New trace run not started."));
1768 }
1769
f224b49d
VP
1770 start_tracing ();
1771}
1772
c906108c
SS
1773/* tstop command */
1774static void
fba45db2 1775trace_stop_command (char *args, int from_tty)
d183932d 1776{
615bcdef
SS
1777 if (!current_trace_status ()->running)
1778 error (_("Trace is not running."));
1779
35b1e5cc 1780 stop_tracing ();
c906108c
SS
1781}
1782
d5551862 1783void
f224b49d 1784stop_tracing (void)
d5551862 1785{
35b1e5cc 1786 target_trace_stop ();
c378eb4e 1787 /* Should change in response to reply? */
00bf0b85 1788 current_trace_status ()->running = 0;
d5551862
SS
1789}
1790
c906108c
SS
1791/* tstatus command */
1792static void
fba45db2 1793trace_status_command (char *args, int from_tty)
d183932d 1794{
00bf0b85
SS
1795 struct trace_status *ts = current_trace_status ();
1796 int status;
35b1e5cc 1797
00bf0b85
SS
1798 status = target_get_trace_status (ts);
1799
1800 if (status == -1)
1801 {
1802 if (ts->from_file)
1803 printf_filtered (_("Using a trace file.\n"));
1804 else
1805 {
1806 printf_filtered (_("Trace can not be run on this target.\n"));
1807 return;
1808 }
1809 }
1810
1811 if (!ts->running_known)
1812 {
1813 printf_filtered (_("Run/stop status is unknown.\n"));
1814 }
1815 else if (ts->running)
c906108c 1816 {
35b1e5cc 1817 printf_filtered (_("Trace is running on the target.\n"));
c906108c
SS
1818 }
1819 else
00bf0b85
SS
1820 {
1821 switch (ts->stop_reason)
1822 {
1823 case trace_never_run:
1824 printf_filtered (_("No trace has been run on the target.\n"));
1825 break;
1826 case tstop_command:
1827 printf_filtered (_("Trace stopped by a tstop command.\n"));
1828 break;
1829 case trace_buffer_full:
1830 printf_filtered (_("Trace stopped because the buffer was full.\n"));
1831 break;
1832 case trace_disconnected:
1833 printf_filtered (_("Trace stopped because of disconnection.\n"));
1834 break;
1835 case tracepoint_passcount:
00bf0b85
SS
1836 printf_filtered (_("Trace stopped by tracepoint %d.\n"),
1837 ts->stopping_tracepoint);
1838 break;
6c28cbf2
SS
1839 case tracepoint_error:
1840 if (ts->stopping_tracepoint)
3e43a32a
MS
1841 printf_filtered (_("Trace stopped by an "
1842 "error (%s, tracepoint %d).\n"),
6c28cbf2
SS
1843 ts->error_desc, ts->stopping_tracepoint);
1844 else
1845 printf_filtered (_("Trace stopped by an error (%s).\n"),
1846 ts->error_desc);
1847 break;
00bf0b85
SS
1848 case trace_stop_reason_unknown:
1849 printf_filtered (_("Trace stopped for an unknown reason.\n"));
1850 break;
1851 default:
1852 printf_filtered (_("Trace stopped for some other reason (%d).\n"),
1853 ts->stop_reason);
1854 break;
1855 }
1856 }
1857
4daf5ac0
SS
1858 if (ts->traceframes_created >= 0
1859 && ts->traceframe_count != ts->traceframes_created)
1860 {
3e43a32a
MS
1861 printf_filtered (_("Buffer contains %d trace "
1862 "frames (of %d created total).\n"),
4daf5ac0
SS
1863 ts->traceframe_count, ts->traceframes_created);
1864 }
1865 else if (ts->traceframe_count >= 0)
00bf0b85
SS
1866 {
1867 printf_filtered (_("Collected %d trace frames.\n"),
1868 ts->traceframe_count);
1869 }
1870
4daf5ac0 1871 if (ts->buffer_free >= 0)
00bf0b85 1872 {
4daf5ac0
SS
1873 if (ts->buffer_size >= 0)
1874 {
1875 printf_filtered (_("Trace buffer has %d bytes of %d bytes free"),
1876 ts->buffer_free, ts->buffer_size);
1877 if (ts->buffer_size > 0)
1878 printf_filtered (_(" (%d%% full)"),
1879 ((int) ((((long long) (ts->buffer_size
1880 - ts->buffer_free)) * 100)
1881 / ts->buffer_size)));
1882 printf_filtered (_(".\n"));
1883 }
1884 else
1885 printf_filtered (_("Trace buffer has %d bytes free.\n"),
1886 ts->buffer_free);
00bf0b85 1887 }
35b1e5cc 1888
33da3f1c
SS
1889 if (ts->disconnected_tracing)
1890 printf_filtered (_("Trace will continue if GDB disconnects.\n"));
1891 else
1892 printf_filtered (_("Trace will stop if GDB disconnects.\n"));
1893
1894 if (ts->circular_buffer)
1895 printf_filtered (_("Trace buffer is circular.\n"));
1896
00bf0b85 1897 /* Now report on what we're doing with tfind. */
35b1e5cc
SS
1898 if (traceframe_number >= 0)
1899 printf_filtered (_("Looking at trace frame %d, tracepoint %d.\n"),
1900 traceframe_number, tracepoint_number);
1901 else
1902 printf_filtered (_("Not looking at any trace frame.\n"));
c906108c
SS
1903}
1904
f224b49d
VP
1905/* Report the trace status to uiout, in a way suitable for MI, and not
1906 suitable for CLI. If ON_STOP is true, suppress a few fields that
1907 are not meaningful in the -trace-stop response.
1908
1909 The implementation is essentially parallel to trace_status_command, but
1910 merging them will result in unreadable code. */
1911void
1912trace_status_mi (int on_stop)
1913{
79a45e25 1914 struct ui_out *uiout = current_uiout;
f224b49d
VP
1915 struct trace_status *ts = current_trace_status ();
1916 int status;
f224b49d
VP
1917
1918 status = target_get_trace_status (ts);
1919
1920 if (status == -1 && !ts->from_file)
1921 {
1922 ui_out_field_string (uiout, "supported", "0");
1923 return;
1924 }
1925
1926 if (ts->from_file)
1927 ui_out_field_string (uiout, "supported", "file");
1928 else if (!on_stop)
1929 ui_out_field_string (uiout, "supported", "1");
1930
1931 gdb_assert (ts->running_known);
1932
1933 if (ts->running)
1934 {
1935 ui_out_field_string (uiout, "running", "1");
1936
1937 /* Unlike CLI, do not show the state of 'disconnected-tracing' variable.
1938 Given that the frontend gets the status either on -trace-stop, or from
1939 -trace-status after re-connection, it does not seem like this
1940 information is necessary for anything. It is not necessary for either
1941 figuring the vital state of the target nor for navigation of trace
1942 frames. If the frontend wants to show the current state is some
1943 configure dialog, it can request the value when such dialog is
1944 invoked by the user. */
1945 }
1946 else
1947 {
1948 char *stop_reason = NULL;
1949 int stopping_tracepoint = -1;
1950
1951 if (!on_stop)
1952 ui_out_field_string (uiout, "running", "0");
1953
1954 if (ts->stop_reason != trace_stop_reason_unknown)
1955 {
1956 switch (ts->stop_reason)
1957 {
1958 case tstop_command:
1959 stop_reason = "request";
1960 break;
1961 case trace_buffer_full:
1962 stop_reason = "overflow";
1963 break;
1964 case trace_disconnected:
1965 stop_reason = "disconnection";
1966 break;
1967 case tracepoint_passcount:
1968 stop_reason = "passcount";
1969 stopping_tracepoint = ts->stopping_tracepoint;
1970 break;
6c28cbf2
SS
1971 case tracepoint_error:
1972 stop_reason = "error";
1973 stopping_tracepoint = ts->stopping_tracepoint;
1974 break;
f224b49d
VP
1975 }
1976
1977 if (stop_reason)
1978 {
1979 ui_out_field_string (uiout, "stop-reason", stop_reason);
1980 if (stopping_tracepoint != -1)
1981 ui_out_field_int (uiout, "stopping-tracepoint",
1982 stopping_tracepoint);
6c28cbf2
SS
1983 if (ts->stop_reason == tracepoint_error)
1984 ui_out_field_string (uiout, "error-description",
1985 ts->error_desc);
f224b49d
VP
1986 }
1987 }
1988 }
1989
a97153c7 1990 if (ts->traceframe_count != -1)
f224b49d 1991 ui_out_field_int (uiout, "frames", ts->traceframe_count);
87290684
SS
1992 if (ts->traceframes_created != -1)
1993 ui_out_field_int (uiout, "frames-created", ts->traceframes_created);
a97153c7
PA
1994 if (ts->buffer_size != -1)
1995 ui_out_field_int (uiout, "buffer-size", ts->buffer_size);
1996 if (ts->buffer_free != -1)
1997 ui_out_field_int (uiout, "buffer-free", ts->buffer_free);
1998
1999 ui_out_field_int (uiout, "disconnected", ts->disconnected_tracing);
2000 ui_out_field_int (uiout, "circular", ts->circular_buffer);
f224b49d
VP
2001}
2002
33da3f1c
SS
2003/* This function handles the details of what to do about an ongoing
2004 tracing run if the user has asked to detach or otherwise disconnect
2005 from the target. */
d5551862 2006void
33da3f1c 2007disconnect_tracing (int from_tty)
d5551862 2008{
00bf0b85
SS
2009 /* It can happen that the target that was tracing went away on its
2010 own, and we didn't notice. Get a status update, and if the
2011 current target doesn't even do tracing, then assume it's not
2012 running anymore. */
26afc0d7 2013 if (target_get_trace_status (current_trace_status ()) < 0)
00bf0b85
SS
2014 current_trace_status ()->running = 0;
2015
33da3f1c
SS
2016 /* If running interactively, give the user the option to cancel and
2017 then decide what to do differently with the run. Scripts are
2018 just going to disconnect and let the target deal with it,
2019 according to how it's been instructed previously via
2020 disconnected-tracing. */
00bf0b85 2021 if (current_trace_status ()->running && from_tty)
d5551862 2022 {
33da3f1c
SS
2023 if (current_trace_status ()->disconnected_tracing)
2024 {
3e43a32a
MS
2025 if (!query (_("Trace is running and will "
2026 "continue after detach; detach anyway? ")))
33da3f1c
SS
2027 error (_("Not confirmed."));
2028 }
2029 else
2030 {
3e43a32a
MS
2031 if (!query (_("Trace is running but will "
2032 "stop on detach; detach anyway? ")))
33da3f1c
SS
2033 error (_("Not confirmed."));
2034 }
d5551862 2035 }
8b9b7ef8
SS
2036
2037 /* Also we want to be out of tfind mode, otherwise things can get
2038 confusing upon reconnection. Just use these calls instead of
2039 full tfind_1 behavior because we're in the middle of detaching,
2040 and there's no point to updating current stack frame etc. */
e6e4e701 2041 set_current_traceframe (-1);
8b9b7ef8 2042 set_traceframe_context (NULL);
d5551862
SS
2043}
2044
d183932d 2045/* Worker function for the various flavors of the tfind command. */
f197e0f1
VP
2046void
2047tfind_1 (enum trace_find_type type, int num,
2048 ULONGEST addr1, ULONGEST addr2,
2049 int from_tty)
c906108c
SS
2050{
2051 int target_frameno = -1, target_tracept = -1;
2ce6d6bf 2052 struct frame_id old_frame_id = null_frame_id;
d9b3f62e 2053 struct tracepoint *tp;
79a45e25 2054 struct ui_out *uiout = current_uiout;
c906108c 2055
2ce6d6bf
SS
2056 /* Only try to get the current stack frame if we have a chance of
2057 succeeding. In particular, if we're trying to get a first trace
2058 frame while all threads are running, it's not going to succeed,
2059 so leave it with a default value and let the frame comparison
2060 below (correctly) decide to print out the source location of the
2061 trace frame. */
2062 if (!(type == tfind_number && num == -1)
2063 && (has_stack_frames () || traceframe_number >= 0))
2064 old_frame_id = get_frame_id (get_current_frame ());
c906108c 2065
35b1e5cc
SS
2066 target_frameno = target_trace_find (type, num, addr1, addr2,
2067 &target_tracept);
2068
2069 if (type == tfind_number
2070 && num == -1
2071 && target_frameno == -1)
2072 {
2073 /* We told the target to get out of tfind mode, and it did. */
2074 }
2075 else if (target_frameno == -1)
2076 {
2ce6d6bf 2077 /* A request for a non-existent trace frame has failed.
35b1e5cc
SS
2078 Our response will be different, depending on FROM_TTY:
2079
2080 If FROM_TTY is true, meaning that this command was
2081 typed interactively by the user, then give an error
2082 and DO NOT change the state of traceframe_number etc.
2083
2084 However if FROM_TTY is false, meaning that we're either
2085 in a script, a loop, or a user-defined command, then
2086 DON'T give an error, but DO change the state of
2087 traceframe_number etc. to invalid.
2088
2089 The rationalle is that if you typed the command, you
2090 might just have committed a typo or something, and you'd
2091 like to NOT lose your current debugging state. However
2092 if you're in a user-defined command or especially in a
2093 loop, then you need a way to detect that the command
2094 failed WITHOUT aborting. This allows you to write
2095 scripts that search thru the trace buffer until the end,
2096 and then continue on to do something else. */
2097
2098 if (from_tty)
2099 error (_("Target failed to find requested trace frame."));
2100 else
2101 {
2102 if (info_verbose)
2103 printf_filtered ("End of trace buffer.\n");
c378eb4e 2104#if 0 /* dubious now? */
35b1e5cc
SS
2105 /* The following will not recurse, since it's
2106 special-cased. */
2107 trace_find_command ("-1", from_tty);
2108#endif
2109 }
2110 }
2111
d5551862
SS
2112 tp = get_tracepoint_by_number_on_target (target_tracept);
2113
35f196d9 2114 reinit_frame_cache ();
c906108c 2115 registers_changed ();
2f4d8875 2116 target_dcache_invalidate ();
c906108c 2117 set_traceframe_num (target_frameno);
b3b9301e 2118 clear_traceframe_info ();
d9b3f62e 2119 set_tracepoint_num (tp ? tp->base.number : target_tracept);
c906108c 2120 if (target_frameno == -1)
fb14de7b 2121 set_traceframe_context (NULL);
c906108c 2122 else
fb14de7b 2123 set_traceframe_context (get_current_frame ());
c906108c 2124
f197e0f1
VP
2125 if (traceframe_number >= 0)
2126 {
2127 /* Use different branches for MI and CLI to make CLI messages
2128 i18n-eable. */
2129 if (ui_out_is_mi_like_p (uiout))
2130 {
2131 ui_out_field_string (uiout, "found", "1");
2132 ui_out_field_int (uiout, "tracepoint", tracepoint_number);
2133 ui_out_field_int (uiout, "traceframe", traceframe_number);
2134 }
2135 else
2136 {
2137 printf_unfiltered (_("Found trace frame %d, tracepoint %d\n"),
2138 traceframe_number, tracepoint_number);
2139 }
2140 }
2141 else
2142 {
2143 if (ui_out_is_mi_like_p (uiout))
2144 ui_out_field_string (uiout, "found", "0");
4136fdd2
SS
2145 else if (type == tfind_number && num == -1)
2146 printf_unfiltered (_("No longer looking at any trace frame\n"));
c378eb4e 2147 else /* This case may never occur, check. */
4136fdd2 2148 printf_unfiltered (_("No trace frame found\n"));
f197e0f1
VP
2149 }
2150
00bf0b85
SS
2151 /* If we're in nonstop mode and getting out of looking at trace
2152 frames, there won't be any current frame to go back to and
2153 display. */
2154 if (from_tty
2155 && (has_stack_frames () || traceframe_number >= 0))
c906108c 2156 {
0faf0076 2157 enum print_what print_what;
c906108c 2158
2ce6d6bf 2159 /* NOTE: in imitation of the step command, try to determine
d183932d
MS
2160 whether we have made a transition from one function to
2161 another. If so, we'll print the "stack frame" (ie. the new
2162 function and it's arguments) -- otherwise we'll just show the
fb14de7b
UW
2163 new source line. */
2164
2165 if (frame_id_eq (old_frame_id,
2166 get_frame_id (get_current_frame ())))
0faf0076 2167 print_what = SRC_LINE;
c906108c 2168 else
0faf0076 2169 print_what = SRC_AND_LOC;
c906108c 2170
b04f3ab4 2171 print_stack_frame (get_selected_frame (NULL), 1, print_what);
c906108c
SS
2172 do_displays ();
2173 }
2174}
2175
2176/* trace_find_command takes a trace frame number n,
2177 sends "QTFrame:<n>" to the target,
2178 and accepts a reply that may contain several optional pieces
2179 of information: a frame number, a tracepoint number, and an
2180 indication of whether this is a trap frame or a stepping frame.
2181
2182 The minimal response is just "OK" (which indicates that the
2183 target does not give us a frame number or a tracepoint number).
2184 Instead of that, the target may send us a string containing
2185 any combination of:
c5aa993b
JM
2186 F<hexnum> (gives the selected frame number)
2187 T<hexnum> (gives the selected tracepoint number)
2188 */
c906108c
SS
2189
2190/* tfind command */
2191static void
fba45db2 2192trace_find_command (char *args, int from_tty)
c378eb4e 2193{ /* This should only be called with a numeric argument. */
c906108c 2194 int frameno = -1;
c906108c 2195
00bf0b85 2196 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2197 error (_("May not look at trace frames while trace is running."));
35b1e5cc
SS
2198
2199 if (args == 0 || *args == 0)
2200 { /* TFIND with no args means find NEXT trace frame. */
2201 if (traceframe_number == -1)
c378eb4e 2202 frameno = 0; /* "next" is first one. */
35b1e5cc
SS
2203 else
2204 frameno = traceframe_number + 1;
2205 }
2206 else if (0 == strcmp (args, "-"))
c906108c 2207 {
35b1e5cc
SS
2208 if (traceframe_number == -1)
2209 error (_("not debugging trace buffer"));
2210 else if (from_tty && traceframe_number == 0)
2211 error (_("already at start of trace buffer"));
2212
2213 frameno = traceframe_number - 1;
2214 }
2215 /* A hack to work around eval's need for fp to have been collected. */
2216 else if (0 == strcmp (args, "-1"))
2217 frameno = -1;
2218 else
2219 frameno = parse_and_eval_long (args);
c906108c 2220
35b1e5cc
SS
2221 if (frameno < -1)
2222 error (_("invalid input (%d is less than zero)"), frameno);
c906108c 2223
f197e0f1 2224 tfind_1 (tfind_number, frameno, 0, 0, from_tty);
c906108c
SS
2225}
2226
2227/* tfind end */
2228static void
fba45db2 2229trace_find_end_command (char *args, int from_tty)
c906108c
SS
2230{
2231 trace_find_command ("-1", from_tty);
2232}
2233
2234/* tfind none */
2235static void
fba45db2 2236trace_find_none_command (char *args, int from_tty)
c906108c
SS
2237{
2238 trace_find_command ("-1", from_tty);
2239}
2240
2241/* tfind start */
2242static void
fba45db2 2243trace_find_start_command (char *args, int from_tty)
c906108c
SS
2244{
2245 trace_find_command ("0", from_tty);
2246}
2247
2248/* tfind pc command */
2249static void
fba45db2 2250trace_find_pc_command (char *args, int from_tty)
d183932d 2251{
c906108c 2252 CORE_ADDR pc;
c906108c 2253
00bf0b85 2254 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2255 error (_("May not look at trace frames while trace is running."));
c906108c 2256
35b1e5cc
SS
2257 if (args == 0 || *args == 0)
2258 pc = regcache_read_pc (get_current_regcache ());
c906108c 2259 else
35b1e5cc
SS
2260 pc = parse_and_eval_address (args);
2261
f197e0f1 2262 tfind_1 (tfind_pc, 0, pc, 0, from_tty);
c906108c
SS
2263}
2264
2265/* tfind tracepoint command */
2266static void
fba45db2 2267trace_find_tracepoint_command (char *args, int from_tty)
d183932d 2268{
c906108c 2269 int tdp;
d9b3f62e 2270 struct tracepoint *tp;
c906108c 2271
00bf0b85 2272 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2273 error (_("May not look at trace frames while trace is running."));
383e5f85 2274
35b1e5cc
SS
2275 if (args == 0 || *args == 0)
2276 {
2277 if (tracepoint_number == -1)
2278 error (_("No current tracepoint -- please supply an argument."));
c906108c 2279 else
c378eb4e 2280 tdp = tracepoint_number; /* Default is current TDP. */
c906108c
SS
2281 }
2282 else
35b1e5cc
SS
2283 tdp = parse_and_eval_long (args);
2284
2285 /* If we have the tracepoint on hand, use the number that the
2286 target knows about (which may be different if we disconnected
2287 and reconnected). */
2288 tp = get_tracepoint (tdp);
2289 if (tp)
2290 tdp = tp->number_on_target;
2291
f197e0f1 2292 tfind_1 (tfind_tp, tdp, 0, 0, from_tty);
c906108c
SS
2293}
2294
2295/* TFIND LINE command:
c5aa993b 2296
c906108c 2297 This command will take a sourceline for argument, just like BREAK
d183932d 2298 or TRACE (ie. anything that "decode_line_1" can handle).
c5aa993b 2299
c906108c
SS
2300 With no argument, this command will find the next trace frame
2301 corresponding to a source line OTHER THAN THE CURRENT ONE. */
2302
2303static void
fba45db2 2304trace_find_line_command (char *args, int from_tty)
d183932d 2305{
c906108c
SS
2306 static CORE_ADDR start_pc, end_pc;
2307 struct symtabs_and_lines sals;
2308 struct symtab_and_line sal;
c906108c
SS
2309 struct cleanup *old_chain;
2310
00bf0b85 2311 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2312 error (_("May not look at trace frames while trace is running."));
5af949e3 2313
35b1e5cc
SS
2314 if (args == 0 || *args == 0)
2315 {
2316 sal = find_pc_line (get_frame_pc (get_current_frame ()), 0);
2317 sals.nelts = 1;
2318 sals.sals = (struct symtab_and_line *)
2319 xmalloc (sizeof (struct symtab_and_line));
2320 sals.sals[0] = sal;
2321 }
2322 else
42e08e69 2323 {
35b1e5cc
SS
2324 sals = decode_line_spec (args, 1);
2325 sal = sals.sals[0];
2326 }
2327
2328 old_chain = make_cleanup (xfree, sals.sals);
2329 if (sal.symtab == 0)
42e08e69
SS
2330 error (_("No line number information available."));
2331
2332 if (sal.line > 0 && find_line_pc_range (sal, &start_pc, &end_pc))
35b1e5cc
SS
2333 {
2334 if (start_pc == end_pc)
2335 {
2336 printf_filtered ("Line %d of \"%s\"",
2337 sal.line, sal.symtab->filename);
2338 wrap_here (" ");
2339 printf_filtered (" is at address ");
2340 print_address (get_current_arch (), start_pc, gdb_stdout);
2341 wrap_here (" ");
2342 printf_filtered (" but contains no code.\n");
2343 sal = find_pc_line (start_pc, 0);
2344 if (sal.line > 0
2345 && find_line_pc_range (sal, &start_pc, &end_pc)
2346 && start_pc != end_pc)
2347 printf_filtered ("Attempting to find line %d instead.\n",
2348 sal.line);
2349 else
2350 error (_("Cannot find a good line."));
2351 }
2352 }
2353 else
2354 /* Is there any case in which we get here, and have an address
2355 which the user would want to see? If we have debugging
2356 symbols and no line numbers? */
2357 error (_("Line number %d is out of range for \"%s\"."),
2358 sal.line, sal.symtab->filename);
2359
2360 /* Find within range of stated line. */
2361 if (args && *args)
f197e0f1 2362 tfind_1 (tfind_range, 0, start_pc, end_pc - 1, from_tty);
c906108c 2363 else
f197e0f1 2364 tfind_1 (tfind_outside, 0, start_pc, end_pc - 1, from_tty);
35b1e5cc 2365 do_cleanups (old_chain);
c906108c
SS
2366}
2367
2368/* tfind range command */
2369static void
fba45db2 2370trace_find_range_command (char *args, int from_tty)
104c1213 2371{
c906108c
SS
2372 static CORE_ADDR start, stop;
2373 char *tmp;
2374
00bf0b85 2375 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2376 error (_("May not look at trace frames while trace is running."));
c906108c 2377
35b1e5cc
SS
2378 if (args == 0 || *args == 0)
2379 { /* XXX FIXME: what should default behavior be? */
2380 printf_filtered ("Usage: tfind range <startaddr>,<endaddr>\n");
2381 return;
2382 }
c906108c 2383
35b1e5cc
SS
2384 if (0 != (tmp = strchr (args, ',')))
2385 {
c378eb4e 2386 *tmp++ = '\0'; /* Terminate start address. */
35b1e5cc
SS
2387 while (isspace ((int) *tmp))
2388 tmp++;
2389 start = parse_and_eval_address (args);
2390 stop = parse_and_eval_address (tmp);
c906108c
SS
2391 }
2392 else
c378eb4e 2393 { /* No explicit end address? */
35b1e5cc
SS
2394 start = parse_and_eval_address (args);
2395 stop = start + 1; /* ??? */
2396 }
2397
f197e0f1 2398 tfind_1 (tfind_range, 0, start, stop, from_tty);
c906108c
SS
2399}
2400
2401/* tfind outside command */
2402static void
fba45db2 2403trace_find_outside_command (char *args, int from_tty)
104c1213 2404{
c906108c
SS
2405 CORE_ADDR start, stop;
2406 char *tmp;
2407
00bf0b85 2408 if (current_trace_status ()->running && !current_trace_status ()->from_file)
a73c6dcd 2409 error (_("May not look at trace frames while trace is running."));
c906108c 2410
35b1e5cc 2411 if (args == 0 || *args == 0)
c378eb4e 2412 { /* XXX FIXME: what should default behavior be? */
35b1e5cc
SS
2413 printf_filtered ("Usage: tfind outside <startaddr>,<endaddr>\n");
2414 return;
2415 }
c906108c 2416
35b1e5cc
SS
2417 if (0 != (tmp = strchr (args, ',')))
2418 {
c378eb4e 2419 *tmp++ = '\0'; /* Terminate start address. */
35b1e5cc
SS
2420 while (isspace ((int) *tmp))
2421 tmp++;
2422 start = parse_and_eval_address (args);
2423 stop = parse_and_eval_address (tmp);
c906108c
SS
2424 }
2425 else
c378eb4e 2426 { /* No explicit end address? */
35b1e5cc
SS
2427 start = parse_and_eval_address (args);
2428 stop = start + 1; /* ??? */
2429 }
2430
f197e0f1 2431 tfind_1 (tfind_outside, 0, start, stop, from_tty);
c906108c
SS
2432}
2433
c906108c
SS
2434/* info scope command: list the locals for a scope. */
2435static void
fba45db2 2436scope_info (char *args, int from_tty)
c906108c 2437{
c906108c
SS
2438 struct symtabs_and_lines sals;
2439 struct symbol *sym;
2440 struct minimal_symbol *msym;
2441 struct block *block;
21cbba77 2442 char *symname, *save_args = args;
de4f826b
DC
2443 struct dict_iterator iter;
2444 int j, count = 0;
768a979c
UW
2445 struct gdbarch *gdbarch;
2446 int regno;
c906108c
SS
2447
2448 if (args == 0 || *args == 0)
3e43a32a
MS
2449 error (_("requires an argument (function, "
2450 "line or *addr) to define a scope"));
c906108c 2451
58438ac1 2452 sals = decode_line_1 (&args, 1, NULL, 0, NULL);
c906108c 2453 if (sals.nelts == 0)
c378eb4e 2454 return; /* Presumably decode_line_1 has already warned. */
c906108c 2455
c378eb4e 2456 /* Resolve line numbers to PC. */
c906108c
SS
2457 resolve_sal_pc (&sals.sals[0]);
2458 block = block_for_pc (sals.sals[0].pc);
2459
2460 while (block != 0)
2461 {
c378eb4e 2462 QUIT; /* Allow user to bail out with ^C. */
de4f826b 2463 ALL_BLOCK_SYMBOLS (block, iter, sym)
c906108c 2464 {
c378eb4e 2465 QUIT; /* Allow user to bail out with ^C. */
c906108c
SS
2466 if (count == 0)
2467 printf_filtered ("Scope for %s:\n", save_args);
2468 count++;
e88c90f2 2469
3567439c 2470 symname = SYMBOL_PRINT_NAME (sym);
c906108c 2471 if (symname == NULL || *symname == '\0')
c378eb4e 2472 continue; /* Probably botched, certainly useless. */
c906108c 2473
768a979c
UW
2474 gdbarch = get_objfile_arch (SYMBOL_SYMTAB (sym)->objfile);
2475
c906108c 2476 printf_filtered ("Symbol %s is ", symname);
c5aa993b
JM
2477 switch (SYMBOL_CLASS (sym))
2478 {
2479 default:
c378eb4e 2480 case LOC_UNDEF: /* Messed up symbol? */
c5aa993b
JM
2481 printf_filtered ("a bogus symbol, class %d.\n",
2482 SYMBOL_CLASS (sym));
c378eb4e 2483 count--; /* Don't count this one. */
c5aa993b
JM
2484 continue;
2485 case LOC_CONST:
104c1213 2486 printf_filtered ("a constant with value %ld (0x%lx)",
c5aa993b
JM
2487 SYMBOL_VALUE (sym), SYMBOL_VALUE (sym));
2488 break;
2489 case LOC_CONST_BYTES:
2490 printf_filtered ("constant bytes: ");
2491 if (SYMBOL_TYPE (sym))
2492 for (j = 0; j < TYPE_LENGTH (SYMBOL_TYPE (sym)); j++)
2493 fprintf_filtered (gdb_stdout, " %02x",
2494 (unsigned) SYMBOL_VALUE_BYTES (sym)[j]);
2495 break;
2496 case LOC_STATIC:
2497 printf_filtered ("in static storage at address ");
5af949e3
UW
2498 printf_filtered ("%s", paddress (gdbarch,
2499 SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2500 break;
2501 case LOC_REGISTER:
768a979c
UW
2502 /* GDBARCH is the architecture associated with the objfile
2503 the symbol is defined in; the target architecture may be
2504 different, and may provide additional registers. However,
2505 we do not know the target architecture at this point.
2506 We assume the objfile architecture will contain all the
2507 standard registers that occur in debug info in that
2508 objfile. */
3e43a32a
MS
2509 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2510 gdbarch);
768a979c 2511
2a2d4dc3
AS
2512 if (SYMBOL_IS_ARGUMENT (sym))
2513 printf_filtered ("an argument in register $%s",
768a979c 2514 gdbarch_register_name (gdbarch, regno));
2a2d4dc3
AS
2515 else
2516 printf_filtered ("a local variable in register $%s",
768a979c 2517 gdbarch_register_name (gdbarch, regno));
c5aa993b
JM
2518 break;
2519 case LOC_ARG:
c5aa993b
JM
2520 printf_filtered ("an argument at stack/frame offset %ld",
2521 SYMBOL_VALUE (sym));
2522 break;
2523 case LOC_LOCAL:
2524 printf_filtered ("a local variable at frame offset %ld",
2525 SYMBOL_VALUE (sym));
2526 break;
2527 case LOC_REF_ARG:
2528 printf_filtered ("a reference argument at offset %ld",
2529 SYMBOL_VALUE (sym));
2530 break;
c5aa993b 2531 case LOC_REGPARM_ADDR:
768a979c 2532 /* Note comment at LOC_REGISTER. */
3e43a32a
MS
2533 regno = SYMBOL_REGISTER_OPS (sym)->register_number (sym,
2534 gdbarch);
c5aa993b 2535 printf_filtered ("the address of an argument, in register $%s",
768a979c 2536 gdbarch_register_name (gdbarch, regno));
c5aa993b
JM
2537 break;
2538 case LOC_TYPEDEF:
2539 printf_filtered ("a typedef.\n");
2540 continue;
2541 case LOC_LABEL:
2542 printf_filtered ("a label at address ");
5af949e3
UW
2543 printf_filtered ("%s", paddress (gdbarch,
2544 SYMBOL_VALUE_ADDRESS (sym)));
c5aa993b
JM
2545 break;
2546 case LOC_BLOCK:
2547 printf_filtered ("a function at address ");
5af949e3
UW
2548 printf_filtered ("%s",
2549 paddress (gdbarch, BLOCK_START (SYMBOL_BLOCK_VALUE (sym))));
c5aa993b 2550 break;
c5aa993b 2551 case LOC_UNRESOLVED:
3567439c 2552 msym = lookup_minimal_symbol (SYMBOL_LINKAGE_NAME (sym),
450bd37b 2553 NULL, NULL);
c5aa993b
JM
2554 if (msym == NULL)
2555 printf_filtered ("Unresolved Static");
2556 else
2557 {
2558 printf_filtered ("static storage at address ");
5af949e3
UW
2559 printf_filtered ("%s",
2560 paddress (gdbarch, SYMBOL_VALUE_ADDRESS (msym)));
c5aa993b
JM
2561 }
2562 break;
2563 case LOC_OPTIMIZED_OUT:
2564 printf_filtered ("optimized out.\n");
2565 continue;
450bd37b 2566 case LOC_COMPUTED:
08922a10
SS
2567 SYMBOL_COMPUTED_OPS (sym)->describe_location (sym,
2568 BLOCK_START (block),
2569 gdb_stdout);
450bd37b 2570 break;
c5aa993b 2571 }
c906108c 2572 if (SYMBOL_TYPE (sym))
c5aa993b 2573 printf_filtered (", length %d.\n",
450bd37b 2574 TYPE_LENGTH (check_typedef (SYMBOL_TYPE (sym))));
c906108c
SS
2575 }
2576 if (BLOCK_FUNCTION (block))
2577 break;
2578 else
2579 block = BLOCK_SUPERBLOCK (block);
2580 }
2581 if (count <= 0)
2582 printf_filtered ("Scope for %s contains no locals or arguments.\n",
2583 save_args);
2584}
2585
2586/* worker function (cleanup) */
2587static void
710b33bd 2588replace_comma (void *data)
c906108c 2589{
710b33bd 2590 char *comma = data;
c906108c
SS
2591 *comma = ',';
2592}
2593
afd02f27
PA
2594
2595/* Helper for trace_dump_command. Dump the action list starting at
2596 ACTION. STEPPING_ACTIONS is true if we're iterating over the
2597 actions of the body of a while-stepping action. STEPPING_FRAME is
2598 set if the current traceframe was determined to be a while-stepping
2599 traceframe. */
2600
c906108c 2601static void
afd02f27
PA
2602trace_dump_actions (struct command_line *action,
2603 int stepping_actions, int stepping_frame,
2604 int from_tty)
c906108c 2605{
c5aa993b 2606 char *action_exp, *next_comma;
c906108c 2607
afd02f27 2608 for (; action != NULL; action = action->next)
c906108c
SS
2609 {
2610 struct cmd_list_element *cmd;
2611
c378eb4e 2612 QUIT; /* Allow user to bail out with ^C. */
a7bdde9e 2613 action_exp = action->line;
104c1213 2614 while (isspace ((int) *action_exp))
c906108c
SS
2615 action_exp++;
2616
2617 /* The collection actions to be done while stepping are
c5aa993b 2618 bracketed by the commands "while-stepping" and "end". */
c906108c
SS
2619
2620 if (*action_exp == '#') /* comment line */
2621 continue;
2622
2623 cmd = lookup_cmd (&action_exp, cmdlist, "", -1, 1);
2624 if (cmd == 0)
8a3fe4f8 2625 error (_("Bad action list item: %s"), action_exp);
c906108c 2626
bbaca940 2627 if (cmd_cfunc_eq (cmd, while_stepping_pseudocommand))
afd02f27
PA
2628 {
2629 int i;
2630
2631 for (i = 0; i < action->body_count; ++i)
2632 trace_dump_actions (action->body_list[i],
2633 1, stepping_frame, from_tty);
2634 }
bbaca940 2635 else if (cmd_cfunc_eq (cmd, collect_pseudocommand))
c906108c
SS
2636 {
2637 /* Display the collected data.
d183932d
MS
2638 For the trap frame, display only what was collected at
2639 the trap. Likewise for stepping frames, display only
2640 what was collected while stepping. This means that the
2641 two boolean variables, STEPPING_FRAME and
2642 STEPPING_ACTIONS should be equal. */
c906108c
SS
2643 if (stepping_frame == stepping_actions)
2644 {
3065dfb6
SS
2645 if (*action_exp == '/')
2646 action_exp = decode_agent_options (action_exp);
2647
c5aa993b 2648 do
c378eb4e
MS
2649 { /* Repeat over a comma-separated list. */
2650 QUIT; /* Allow user to bail out with ^C. */
c5aa993b
JM
2651 if (*action_exp == ',')
2652 action_exp++;
104c1213 2653 while (isspace ((int) *action_exp))
c5aa993b
JM
2654 action_exp++;
2655
2656 next_comma = strchr (action_exp, ',');
2657
2658 if (0 == strncasecmp (action_exp, "$reg", 4))
2659 registers_info (NULL, from_tty);
6710bf39
SS
2660 else if (0 == strncasecmp (action_exp, "$_ret", 5))
2661 ;
c5aa993b
JM
2662 else if (0 == strncasecmp (action_exp, "$loc", 4))
2663 locals_info (NULL, from_tty);
2664 else if (0 == strncasecmp (action_exp, "$arg", 4))
2665 args_info (NULL, from_tty);
2666 else
2667 { /* variable */
2668 if (next_comma)
2669 {
2670 make_cleanup (replace_comma, next_comma);
2671 *next_comma = '\0';
2672 }
2673 printf_filtered ("%s = ", action_exp);
2674 output_command (action_exp, from_tty);
2675 printf_filtered ("\n");
2676 }
2677 if (next_comma)
2678 *next_comma = ',';
2679 action_exp = next_comma;
2680 }
2681 while (action_exp && *action_exp == ',');
c906108c
SS
2682 }
2683 }
2684 }
afd02f27
PA
2685}
2686
2687/* The tdump command. */
2688
2689static void
2690trace_dump_command (char *args, int from_tty)
2691{
2692 struct regcache *regcache;
d9b3f62e 2693 struct tracepoint *t;
afd02f27
PA
2694 int stepping_frame = 0;
2695 struct bp_location *loc;
2114d44c
SS
2696 char *line, *default_collect_line = NULL;
2697 struct command_line *actions, *default_collect_action = NULL;
2698 struct cleanup *old_chain = NULL;
afd02f27
PA
2699
2700 if (tracepoint_number == -1)
2701 {
2702 warning (_("No current trace frame."));
2703 return;
2704 }
2705
2706 t = get_tracepoint (tracepoint_number);
2707
2708 if (t == NULL)
2709 error (_("No known tracepoint matches 'current' tracepoint #%d."),
2710 tracepoint_number);
2711
2712 printf_filtered ("Data collected at tracepoint %d, trace frame %d:\n",
2713 tracepoint_number, traceframe_number);
2714
2715 /* The current frame is a trap frame if the frame PC is equal
2716 to the tracepoint PC. If not, then the current frame was
2717 collected during single-stepping. */
2718
2719 regcache = get_current_regcache ();
2720
2721 /* If the traceframe's address matches any of the tracepoint's
2722 locations, assume it is a direct hit rather than a while-stepping
2723 frame. (FIXME this is not reliable, should record each frame's
2724 type.) */
2725 stepping_frame = 1;
d9b3f62e 2726 for (loc = t->base.loc; loc; loc = loc->next)
afd02f27
PA
2727 if (loc->address == regcache_read_pc (regcache))
2728 stepping_frame = 0;
2729
d9b3f62e 2730 actions = breakpoint_commands (&t->base);
2114d44c
SS
2731
2732 /* If there is a default-collect list, make up a collect command,
2733 prepend to the tracepoint's commands, and pass the whole mess to
2734 the trace dump scanner. We need to validate because
2735 default-collect might have been junked since the trace run. */
2736 if (*default_collect)
2737 {
2738 default_collect_line = xstrprintf ("collect %s", default_collect);
2739 old_chain = make_cleanup (xfree, default_collect_line);
2740 line = default_collect_line;
d9b3f62e 2741 validate_actionline (&line, &t->base);
2114d44c
SS
2742 default_collect_action = xmalloc (sizeof (struct command_line));
2743 make_cleanup (xfree, default_collect_action);
2744 default_collect_action->next = actions;
2745 default_collect_action->line = line;
2746 actions = default_collect_action;
2747 }
2748
2749 trace_dump_actions (actions, 0, stepping_frame, from_tty);
2750
2751 if (*default_collect)
2752 do_cleanups (old_chain);
c906108c
SS
2753}
2754
409873ef
SS
2755/* Encode a piece of a tracepoint's source-level definition in a form
2756 that is suitable for both protocol and saving in files. */
2757/* This version does not do multiple encodes for long strings; it should
2758 return an offset to the next piece to encode. FIXME */
2759
2760extern int
2761encode_source_string (int tpnum, ULONGEST addr,
2762 char *srctype, char *src, char *buf, int buf_size)
2763{
2764 if (80 + strlen (srctype) > buf_size)
2765 error (_("Buffer too small for source encoding"));
2766 sprintf (buf, "%x:%s:%s:%x:%x:",
3e43a32a
MS
2767 tpnum, phex_nz (addr, sizeof (addr)),
2768 srctype, 0, (int) strlen (src));
409873ef
SS
2769 if (strlen (buf) + strlen (src) * 2 >= buf_size)
2770 error (_("Source string too long for buffer"));
2771 bin2hex (src, buf + strlen (buf), 0);
2772 return -1;
2773}
2774
00bf0b85
SS
2775extern int trace_regblock_size;
2776
011aacb0
VP
2777/* Save tracepoint data to file named FILENAME. If TARGET_DOES_SAVE is
2778 non-zero, the save is performed on the target, otherwise GDB obtains all
2779 trace data and saves it locally. */
2780
2781void
2782trace_save (const char *filename, int target_does_save)
00bf0b85 2783{
00bf0b85 2784 struct cleanup *cleanup;
011aacb0 2785 char *pathname;
00bf0b85
SS
2786 struct trace_status *ts = current_trace_status ();
2787 int err, status;
2788 FILE *fp;
2789 struct uploaded_tp *uploaded_tps = NULL, *utp;
2790 struct uploaded_tsv *uploaded_tsvs = NULL, *utsv;
2791 int a;
3149d8c1 2792 char *act;
00bf0b85
SS
2793 LONGEST gotten = 0;
2794 ULONGEST offset = 0;
2795#define MAX_TRACE_UPLOAD 2000
2796 gdb_byte buf[MAX_TRACE_UPLOAD];
98e03262 2797 int written;
00bf0b85 2798
00bf0b85
SS
2799 /* If the target is to save the data to a file on its own, then just
2800 send the command and be done with it. */
2801 if (target_does_save)
2802 {
2803 err = target_save_trace_data (filename);
2804 if (err < 0)
2805 error (_("Target failed to save trace data to '%s'."),
2806 filename);
2807 return;
2808 }
2809
2810 /* Get the trace status first before opening the file, so if the
2811 target is losing, we can get out without touching files. */
2812 status = target_get_trace_status (ts);
2813
011aacb0 2814 pathname = tilde_expand (filename);
00bf0b85
SS
2815 cleanup = make_cleanup (xfree, pathname);
2816
105c2d85 2817 fp = fopen (pathname, "wb");
00bf0b85
SS
2818 if (!fp)
2819 error (_("Unable to open file '%s' for saving trace data (%s)"),
011aacb0 2820 filename, safe_strerror (errno));
00bf0b85
SS
2821 make_cleanup_fclose (fp);
2822
2823 /* Write a file header, with a high-bit-set char to indicate a
2824 binary file, plus a hint as what this file is, and a version
2825 number in case of future needs. */
98e03262 2826 written = fwrite ("\x7fTRACE0\n", 8, 1, fp);
409873ef 2827 if (written < 1)
98e03262 2828 perror_with_name (pathname);
00bf0b85
SS
2829
2830 /* Write descriptive info. */
2831
2832 /* Write out the size of a register block. */
2833 fprintf (fp, "R %x\n", trace_regblock_size);
2834
2835 /* Write out status of the tracing run (aka "tstatus" info). */
6c28cbf2
SS
2836 fprintf (fp, "status %c;%s",
2837 (ts->running ? '1' : '0'), stop_reason_names[ts->stop_reason]);
6c28cbf2
SS
2838 if (ts->stop_reason == tracepoint_error)
2839 {
2840 char *buf = (char *) alloca (strlen (ts->error_desc) * 2 + 1);
5d502164 2841
6c28cbf2 2842 bin2hex ((gdb_byte *) ts->error_desc, buf, 0);
610197fd 2843 fprintf (fp, ":%s", buf);
6c28cbf2
SS
2844 }
2845 fprintf (fp, ":%x", ts->stopping_tracepoint);
4daf5ac0
SS
2846 if (ts->traceframe_count >= 0)
2847 fprintf (fp, ";tframes:%x", ts->traceframe_count);
2848 if (ts->traceframes_created >= 0)
2849 fprintf (fp, ";tcreated:%x", ts->traceframes_created);
2850 if (ts->buffer_free >= 0)
2851 fprintf (fp, ";tfree:%x", ts->buffer_free);
2852 if (ts->buffer_size >= 0)
2853 fprintf (fp, ";tsize:%x", ts->buffer_size);
33da3f1c
SS
2854 if (ts->disconnected_tracing)
2855 fprintf (fp, ";disconn:%x", ts->disconnected_tracing);
2856 if (ts->circular_buffer)
2857 fprintf (fp, ";circular:%x", ts->circular_buffer);
4daf5ac0 2858 fprintf (fp, "\n");
00bf0b85
SS
2859
2860 /* Note that we want to upload tracepoints and save those, rather
2861 than simply writing out the local ones, because the user may have
2862 changed tracepoints in GDB in preparation for a future tracing
2863 run, or maybe just mass-deleted all types of breakpoints as part
2864 of cleaning up. So as not to contaminate the session, leave the
2865 data in its uploaded form, don't make into real tracepoints. */
2866
2867 /* Get trace state variables first, they may be checked when parsing
2868 uploaded commands. */
2869
2870 target_upload_trace_state_variables (&uploaded_tsvs);
2871
2872 for (utsv = uploaded_tsvs; utsv; utsv = utsv->next)
2873 {
2874 char *buf = "";
2875
2876 if (utsv->name)
2877 {
2878 buf = (char *) xmalloc (strlen (utsv->name) * 2 + 1);
2879 bin2hex ((gdb_byte *) (utsv->name), buf, 0);
2880 }
2881
2882 fprintf (fp, "tsv %x:%s:%x:%s\n",
2883 utsv->number, phex_nz (utsv->initial_value, 8),
2884 utsv->builtin, buf);
2885
2886 if (utsv->name)
2887 xfree (buf);
2888 }
2889
2890 free_uploaded_tsvs (&uploaded_tsvs);
2891
2892 target_upload_tracepoints (&uploaded_tps);
2893
2894 for (utp = uploaded_tps; utp; utp = utp->next)
2895 {
2896 fprintf (fp, "tp T%x:%s:%c:%x:%x",
2897 utp->number, phex_nz (utp->addr, sizeof (utp->addr)),
2898 (utp->enabled ? 'E' : 'D'), utp->step, utp->pass);
2899 if (utp->type == bp_fast_tracepoint)
2900 fprintf (fp, ":F%x", utp->orig_size);
2901 if (utp->cond)
2902 fprintf (fp, ":X%x,%s", (unsigned int) strlen (utp->cond) / 2,
2903 utp->cond);
2904 fprintf (fp, "\n");
3149d8c1 2905 for (a = 0; VEC_iterate (char_ptr, utp->actions, a, act); ++a)
00bf0b85 2906 fprintf (fp, "tp A%x:%s:%s\n",
3149d8c1 2907 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
0a2a54b8 2908 for (a = 0; VEC_iterate (char_ptr, utp->step_actions, a, act); ++a)
00bf0b85 2909 fprintf (fp, "tp S%x:%s:%s\n",
3149d8c1 2910 utp->number, phex_nz (utp->addr, sizeof (utp->addr)), act);
409873ef
SS
2911 if (utp->at_string)
2912 {
2913 encode_source_string (utp->number, utp->addr,
2914 "at", utp->at_string, buf, MAX_TRACE_UPLOAD);
2915 fprintf (fp, "tp Z%s\n", buf);
2916 }
2917 if (utp->cond_string)
2918 {
2919 encode_source_string (utp->number, utp->addr,
3e43a32a
MS
2920 "cond", utp->cond_string,
2921 buf, MAX_TRACE_UPLOAD);
409873ef
SS
2922 fprintf (fp, "tp Z%s\n", buf);
2923 }
3149d8c1 2924 for (a = 0; VEC_iterate (char_ptr, utp->cmd_strings, a, act); ++a)
409873ef 2925 {
3149d8c1 2926 encode_source_string (utp->number, utp->addr, "cmd", act,
409873ef
SS
2927 buf, MAX_TRACE_UPLOAD);
2928 fprintf (fp, "tp Z%s\n", buf);
2929 }
00bf0b85
SS
2930 }
2931
2932 free_uploaded_tps (&uploaded_tps);
2933
2934 /* Mark the end of the definition section. */
2935 fprintf (fp, "\n");
2936
2937 /* Get and write the trace data proper. We ask for big blocks, in
2938 the hopes of efficiency, but will take less if the target has
2939 packet size limitations or some such. */
2940 while (1)
2941 {
2942 gotten = target_get_raw_trace_data (buf, offset, MAX_TRACE_UPLOAD);
2943 if (gotten < 0)
2944 error (_("Failure to get requested trace buffer data"));
2945 /* No more data is forthcoming, we're done. */
2946 if (gotten == 0)
2947 break;
98e03262 2948 written = fwrite (buf, gotten, 1, fp);
409873ef 2949 if (written < 1)
98e03262 2950 perror_with_name (pathname);
00bf0b85
SS
2951 offset += gotten;
2952 }
2953
409873ef 2954 /* Mark the end of trace data. (We know that gotten is 0 at this point.) */
98e03262 2955 written = fwrite (&gotten, 4, 1, fp);
409873ef 2956 if (written < 1)
98e03262 2957 perror_with_name (pathname);
00bf0b85
SS
2958
2959 do_cleanups (cleanup);
011aacb0
VP
2960}
2961
2962static void
2963trace_save_command (char *args, int from_tty)
2964{
2965 int target_does_save = 0;
2966 char **argv;
2967 char *filename = NULL;
2968 struct cleanup *back_to;
2969
2970 if (args == NULL)
2971 error_no_arg (_("file in which to save trace data"));
2972
2973 argv = gdb_buildargv (args);
2974 back_to = make_cleanup_freeargv (argv);
2975
2976 for (; *argv; ++argv)
2977 {
2978 if (strcmp (*argv, "-r") == 0)
2979 target_does_save = 1;
2980 else if (**argv == '-')
2981 error (_("unknown option `%s'"), *argv);
2982 else
2983 filename = *argv;
2984 }
2985
2986 if (!filename)
2987 error_no_arg (_("file in which to save trace data"));
2988
2989 trace_save (filename, target_does_save);
2990
00bf0b85 2991 if (from_tty)
a70633a2 2992 printf_filtered (_("Trace data saved to file '%s'.\n"), filename);
011aacb0
VP
2993
2994 do_cleanups (back_to);
00bf0b85
SS
2995}
2996
d5551862
SS
2997/* Tell the target what to do with an ongoing tracing run if GDB
2998 disconnects for some reason. */
2999
3000void
3001send_disconnected_tracing_value (int value)
3002{
35b1e5cc 3003 target_set_disconnected_tracing (value);
d5551862
SS
3004}
3005
3006static void
3007set_disconnected_tracing (char *args, int from_tty,
3008 struct cmd_list_element *c)
3009{
3010 send_disconnected_tracing_value (disconnected_tracing);
3011}
3012
4daf5ac0
SS
3013static void
3014set_circular_trace_buffer (char *args, int from_tty,
3015 struct cmd_list_element *c)
3016{
3017 target_set_circular_trace_buffer (circular_trace_buffer);
3018}
3019
c906108c
SS
3020/* Convert the memory pointed to by mem into hex, placing result in buf.
3021 * Return a pointer to the last char put in buf (null)
3022 * "stolen" from sparc-stub.c
3023 */
3024
c5aa993b 3025static const char hexchars[] = "0123456789abcdef";
c906108c 3026
47b667de
AC
3027static char *
3028mem2hex (gdb_byte *mem, char *buf, int count)
c906108c 3029{
47b667de 3030 gdb_byte ch;
c906108c
SS
3031
3032 while (count-- > 0)
3033 {
3034 ch = *mem++;
3035
3036 *buf++ = hexchars[ch >> 4];
3037 *buf++ = hexchars[ch & 0xf];
3038 }
3039
3040 *buf = 0;
3041
3042 return buf;
3043}
3044
c5aa993b 3045int
fba45db2 3046get_traceframe_number (void)
c906108c 3047{
c5aa993b 3048 return traceframe_number;
c906108c
SS
3049}
3050
06cd862c
PA
3051/* Make the traceframe NUM be the current trace frame. Does nothing
3052 if NUM is already current. */
3053
3054void
e6e4e701 3055set_current_traceframe (int num)
06cd862c
PA
3056{
3057 int newnum;
3058
3059 if (traceframe_number == num)
3060 {
3061 /* Nothing to do. */
3062 return;
3063 }
3064
3065 newnum = target_trace_find (tfind_number, num, 0, 0, NULL);
3066
3067 if (newnum != num)
3068 warning (_("could not change traceframe"));
3069
3070 traceframe_number = newnum;
3071
3072 /* Changing the traceframe changes our view of registers and of the
3073 frame chain. */
3074 registers_changed ();
b3b9301e
PA
3075
3076 clear_traceframe_info ();
06cd862c
PA
3077}
3078
e6e4e701
PA
3079/* Make the traceframe NUM be the current trace frame, and do nothing
3080 more. */
3081
3082void
3083set_traceframe_number (int num)
3084{
3085 traceframe_number = num;
3086}
3087
06cd862c
PA
3088/* A cleanup used when switching away and back from tfind mode. */
3089
3090struct current_traceframe_cleanup
3091{
3092 /* The traceframe we were inspecting. */
3093 int traceframe_number;
3094};
3095
3096static void
3097do_restore_current_traceframe_cleanup (void *arg)
3098{
3099 struct current_traceframe_cleanup *old = arg;
3100
e6e4e701 3101 set_current_traceframe (old->traceframe_number);
06cd862c
PA
3102}
3103
3104static void
3105restore_current_traceframe_cleanup_dtor (void *arg)
3106{
3107 struct current_traceframe_cleanup *old = arg;
3108
3109 xfree (old);
3110}
3111
3112struct cleanup *
3113make_cleanup_restore_current_traceframe (void)
3114{
3115 struct current_traceframe_cleanup *old;
3116
3117 old = xmalloc (sizeof (struct current_traceframe_cleanup));
3118 old->traceframe_number = traceframe_number;
3119
3120 return make_cleanup_dtor (do_restore_current_traceframe_cleanup, old,
3121 restore_current_traceframe_cleanup_dtor);
3122}
00bf0b85 3123
e6e4e701
PA
3124struct cleanup *
3125make_cleanup_restore_traceframe_number (void)
3126{
3127 return make_cleanup_restore_integer (&traceframe_number);
3128}
3129
00bf0b85
SS
3130/* Given a number and address, return an uploaded tracepoint with that
3131 number, creating if necessary. */
3132
3133struct uploaded_tp *
3134get_uploaded_tp (int num, ULONGEST addr, struct uploaded_tp **utpp)
3135{
3136 struct uploaded_tp *utp;
3137
3138 for (utp = *utpp; utp; utp = utp->next)
3139 if (utp->number == num && utp->addr == addr)
3140 return utp;
3141 utp = (struct uploaded_tp *) xmalloc (sizeof (struct uploaded_tp));
3142 memset (utp, 0, sizeof (struct uploaded_tp));
3143 utp->number = num;
3144 utp->addr = addr;
3149d8c1
SS
3145 utp->actions = NULL;
3146 utp->step_actions = NULL;
3147 utp->cmd_strings = NULL;
00bf0b85
SS
3148 utp->next = *utpp;
3149 *utpp = utp;
3150 return utp;
3151}
3152
3153static void
3154free_uploaded_tps (struct uploaded_tp **utpp)
3155{
3156 struct uploaded_tp *next_one;
3157
3158 while (*utpp)
3159 {
3160 next_one = (*utpp)->next;
3161 xfree (*utpp);
3162 *utpp = next_one;
3163 }
3164}
3165
3166/* Given a number and address, return an uploaded tracepoint with that
3167 number, creating if necessary. */
3168
3169struct uploaded_tsv *
3170get_uploaded_tsv (int num, struct uploaded_tsv **utsvp)
3171{
3172 struct uploaded_tsv *utsv;
3173
3174 for (utsv = *utsvp; utsv; utsv = utsv->next)
3175 if (utsv->number == num)
3176 return utsv;
3177 utsv = (struct uploaded_tsv *) xmalloc (sizeof (struct uploaded_tsv));
3178 memset (utsv, 0, sizeof (struct uploaded_tsv));
3179 utsv->number = num;
3180 utsv->next = *utsvp;
3181 *utsvp = utsv;
3182 return utsv;
3183}
3184
3185static void
3186free_uploaded_tsvs (struct uploaded_tsv **utsvp)
3187{
3188 struct uploaded_tsv *next_one;
3189
3190 while (*utsvp)
3191 {
3192 next_one = (*utsvp)->next;
3193 xfree (*utsvp);
3194 *utsvp = next_one;
3195 }
3196}
3197
4e5c165d
HZ
3198/* FIXME this function is heuristic and will miss the cases where the
3199 conditional is semantically identical but differs in whitespace,
3200 such as "x == 0" vs "x==0". */
3201
3202static int
3203cond_string_is_same (char *str1, char *str2)
3204{
3205 if (str1 == NULL || str2 == NULL)
3206 return (str1 == str2);
3207
3208 return (strcmp (str1, str2) == 0);
3209}
3210
00bf0b85
SS
3211/* Look for an existing tracepoint that seems similar enough to the
3212 uploaded one. Enablement isn't compared, because the user can
3213 toggle that freely, and may have done so in anticipation of the
1e4d1764 3214 next trace run. Return the location of matched tracepoint. */
00bf0b85 3215
1e4d1764
YQ
3216struct bp_location *
3217find_matching_tracepoint_location (struct uploaded_tp *utp)
00bf0b85
SS
3218{
3219 VEC(breakpoint_p) *tp_vec = all_tracepoints ();
3220 int ix;
d9b3f62e 3221 struct breakpoint *b;
00bf0b85
SS
3222 struct bp_location *loc;
3223
d9b3f62e 3224 for (ix = 0; VEC_iterate (breakpoint_p, tp_vec, ix, b); ix++)
00bf0b85 3225 {
d9b3f62e
PA
3226 struct tracepoint *t = (struct tracepoint *) b;
3227
3228 if (b->type == utp->type
00bf0b85
SS
3229 && t->step_count == utp->step
3230 && t->pass_count == utp->pass
4e5c165d
HZ
3231 && cond_string_is_same (t->base.cond_string, utp->cond_string)
3232 /* FIXME also test actions. */
00bf0b85
SS
3233 )
3234 {
3235 /* Scan the locations for an address match. */
d9b3f62e 3236 for (loc = b->loc; loc; loc = loc->next)
00bf0b85
SS
3237 {
3238 if (loc->address == utp->addr)
1e4d1764 3239 return loc;
00bf0b85
SS
3240 }
3241 }
3242 }
3243 return NULL;
3244}
3245
3246/* Given a list of tracepoints uploaded from a target, attempt to
3247 match them up with existing tracepoints, and create new ones if not
3248 found. */
3249
3250void
3251merge_uploaded_tracepoints (struct uploaded_tp **uploaded_tps)
3252{
3253 struct uploaded_tp *utp;
00bf0b85
SS
3254
3255 /* Look for GDB tracepoints that match up with our uploaded versions. */
3256 for (utp = *uploaded_tps; utp; utp = utp->next)
3257 {
1e4d1764
YQ
3258 struct bp_location *loc;
3259 struct tracepoint *t;
3260
3261 loc = find_matching_tracepoint_location (utp);
3262 if (loc)
3263 {
3264 /* Mark this location as already inserted. */
3265 loc->inserted = 1;
3266 t = (struct tracepoint *) loc->owner;
3267 printf_filtered (_("Assuming tracepoint %d is same "
3268 "as target's tracepoint %d at %s.\n"),
3269 loc->owner->number, utp->number,
3270 paddress (loc->gdbarch, utp->addr));
3271 }
00bf0b85
SS
3272 else
3273 {
3274 t = create_tracepoint_from_upload (utp);
3275 if (t)
3e43a32a
MS
3276 printf_filtered (_("Created tracepoint %d for "
3277 "target's tracepoint %d at %s.\n"),
d9b3f62e 3278 t->base.number, utp->number,
3e43a32a 3279 paddress (get_current_arch (), utp->addr));
00bf0b85 3280 else
3e43a32a
MS
3281 printf_filtered (_("Failed to create tracepoint for target's "
3282 "tracepoint %d at %s, skipping it.\n"),
3283 utp->number,
3284 paddress (get_current_arch (), utp->addr));
00bf0b85
SS
3285 }
3286 /* Whether found or created, record the number used by the
3287 target, to help with mapping target tracepoints back to their
3288 counterparts here. */
3289 if (t)
3290 t->number_on_target = utp->number;
3291 }
3292
3293 free_uploaded_tps (uploaded_tps);
3294}
3295
3296/* Trace state variables don't have much to identify them beyond their
3297 name, so just use that to detect matches. */
3298
3299struct trace_state_variable *
3300find_matching_tsv (struct uploaded_tsv *utsv)
3301{
3302 if (!utsv->name)
3303 return NULL;
3304
3305 return find_trace_state_variable (utsv->name);
3306}
3307
3308struct trace_state_variable *
3309create_tsv_from_upload (struct uploaded_tsv *utsv)
3310{
3311 const char *namebase;
3312 char buf[20];
3313 int try_num = 0;
3314 struct trace_state_variable *tsv;
3315
3316 if (utsv->name)
3317 {
3318 namebase = utsv->name;
3319 sprintf (buf, "%s", namebase);
3320 }
3321 else
3322 {
3323 namebase = "__tsv";
3324 sprintf (buf, "%s_%d", namebase, try_num++);
3325 }
3326
3327 /* Fish for a name that is not in use. */
c378eb4e 3328 /* (should check against all internal vars?) */
00bf0b85
SS
3329 while (find_trace_state_variable (buf))
3330 sprintf (buf, "%s_%d", namebase, try_num++);
3331
3332 /* We have an available name, create the variable. */
a0aa2878 3333 tsv = create_trace_state_variable (buf);
00bf0b85
SS
3334 tsv->initial_value = utsv->initial_value;
3335 tsv->builtin = utsv->builtin;
3336
3337 return tsv;
3338}
3339
3340/* Given a list of uploaded trace state variables, try to match them
3341 up with existing variables, or create additional ones. */
3342
3343void
3344merge_uploaded_trace_state_variables (struct uploaded_tsv **uploaded_tsvs)
3345{
3346 int ix;
3347 struct uploaded_tsv *utsv;
3348 struct trace_state_variable *tsv;
3349 int highest;
3350
3351 /* Most likely some numbers will have to be reassigned as part of
3352 the merge, so clear them all in anticipation. */
3353 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3354 tsv->number = 0;
3355
3356 for (utsv = *uploaded_tsvs; utsv; utsv = utsv->next)
3357 {
3358 tsv = find_matching_tsv (utsv);
3359 if (tsv)
417b5110
DJ
3360 {
3361 if (info_verbose)
3e43a32a
MS
3362 printf_filtered (_("Assuming trace state variable $%s "
3363 "is same as target's variable %d.\n"),
417b5110
DJ
3364 tsv->name, utsv->number);
3365 }
00bf0b85
SS
3366 else
3367 {
3368 tsv = create_tsv_from_upload (utsv);
417b5110 3369 if (info_verbose)
3e43a32a
MS
3370 printf_filtered (_("Created trace state variable "
3371 "$%s for target's variable %d.\n"),
417b5110 3372 tsv->name, utsv->number);
00bf0b85
SS
3373 }
3374 /* Give precedence to numberings that come from the target. */
3375 if (tsv)
3376 tsv->number = utsv->number;
3377 }
3378
3379 /* Renumber everything that didn't get a target-assigned number. */
3380 highest = 0;
3381 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3382 if (tsv->number > highest)
3383 highest = tsv->number;
3384
3385 ++highest;
3386 for (ix = 0; VEC_iterate (tsv_s, tvariables, ix, tsv); ++ix)
3387 if (tsv->number == 0)
3388 tsv->number = highest++;
3389
3390 free_uploaded_tsvs (uploaded_tsvs);
3391}
3392
3393/* target tfile command */
3394
3395struct target_ops tfile_ops;
3396
3397/* Fill in tfile_ops with its defined operations and properties. */
3398
3399#define TRACE_HEADER_SIZE 8
3400
98e03262 3401char *trace_filename;
00bf0b85
SS
3402int trace_fd = -1;
3403off_t trace_frames_offset;
3404off_t cur_offset;
e6e4e701 3405int cur_traceframe_number;
00bf0b85
SS
3406int cur_data_size;
3407int trace_regblock_size;
3408
3409static void tfile_interp_line (char *line,
3410 struct uploaded_tp **utpp,
3411 struct uploaded_tsv **utsvp);
3412
9f41c731
PA
3413/* Read SIZE bytes into READBUF from the trace frame, starting at
3414 TRACE_FD's current position. Note that this call `read'
3415 underneath, hence it advances the file's seek position. Throws an
3416 error if the `read' syscall fails, or less than SIZE bytes are
3417 read. */
3418
3419static void
3420tfile_read (gdb_byte *readbuf, int size)
3421{
3422 int gotten;
3423
3424 gotten = read (trace_fd, readbuf, size);
3425 if (gotten < 0)
3426 perror_with_name (trace_filename);
3427 else if (gotten < size)
3428 error (_("Premature end of file while reading trace file"));
3429}
3430
00bf0b85
SS
3431static void
3432tfile_open (char *filename, int from_tty)
3433{
e93a69ed 3434 volatile struct gdb_exception ex;
00bf0b85
SS
3435 char *temp;
3436 struct cleanup *old_chain;
3437 int flags;
3438 int scratch_chan;
3439 char header[TRACE_HEADER_SIZE];
c378eb4e 3440 char linebuf[1000]; /* Should be max remote packet size or so. */
00bf0b85 3441 char byte;
9f41c731 3442 int bytes, i;
00bf0b85
SS
3443 struct trace_status *ts;
3444 struct uploaded_tp *uploaded_tps = NULL;
3445 struct uploaded_tsv *uploaded_tsvs = NULL;
3446
3447 target_preopen (from_tty);
3448 if (!filename)
3449 error (_("No trace file specified."));
3450
3451 filename = tilde_expand (filename);
3452 if (!IS_ABSOLUTE_PATH(filename))
3453 {
c4f7c687 3454 temp = concat (current_directory, "/", filename, (char *) NULL);
00bf0b85
SS
3455 xfree (filename);
3456 filename = temp;
3457 }
3458
3459 old_chain = make_cleanup (xfree, filename);
3460
3461 flags = O_BINARY | O_LARGEFILE;
3462 flags |= O_RDONLY;
3463 scratch_chan = open (filename, flags, 0);
3464 if (scratch_chan < 0)
3465 perror_with_name (filename);
3466
3467 /* Looks semi-reasonable. Toss the old trace file and work on the new. */
3468
c378eb4e 3469 discard_cleanups (old_chain); /* Don't free filename any more. */
00bf0b85
SS
3470 unpush_target (&tfile_ops);
3471
98e03262 3472 trace_filename = xstrdup (filename);
00bf0b85
SS
3473 trace_fd = scratch_chan;
3474
3475 bytes = 0;
3476 /* Read the file header and test for validity. */
9f41c731 3477 tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE);
98e03262 3478
00bf0b85
SS
3479 bytes += TRACE_HEADER_SIZE;
3480 if (!(header[0] == 0x7f
3481 && (strncmp (header + 1, "TRACE0\n", 7) == 0)))
3482 error (_("File is not a valid trace file."));
3483
e93a69ed
PA
3484 push_target (&tfile_ops);
3485
00bf0b85
SS
3486 trace_regblock_size = 0;
3487 ts = current_trace_status ();
3488 /* We know we're working with a file. */
3489 ts->from_file = 1;
3490 /* Set defaults in case there is no status line. */
3491 ts->running_known = 0;
3492 ts->stop_reason = trace_stop_reason_unknown;
3493 ts->traceframe_count = -1;
3494 ts->buffer_free = 0;
33da3f1c
SS
3495 ts->disconnected_tracing = 0;
3496 ts->circular_buffer = 0;
00bf0b85 3497
e6e4e701
PA
3498 cur_traceframe_number = -1;
3499
e93a69ed 3500 TRY_CATCH (ex, RETURN_MASK_ALL)
00bf0b85 3501 {
e93a69ed
PA
3502 /* Read through a section of newline-terminated lines that
3503 define things like tracepoints. */
3504 i = 0;
3505 while (1)
00bf0b85 3506 {
e93a69ed
PA
3507 tfile_read (&byte, 1);
3508
3509 ++bytes;
3510 if (byte == '\n')
3511 {
3512 /* Empty line marks end of the definition section. */
3513 if (i == 0)
3514 break;
3515 linebuf[i] = '\0';
3516 i = 0;
3517 tfile_interp_line (linebuf, &uploaded_tps, &uploaded_tsvs);
3518 }
3519 else
3520 linebuf[i++] = byte;
3521 if (i >= 1000)
3522 error (_("Excessively long lines in trace file"));
00bf0b85 3523 }
e93a69ed
PA
3524
3525 /* Record the starting offset of the binary trace data. */
3526 trace_frames_offset = bytes;
3527
3528 /* If we don't have a blocksize, we can't interpret the
3529 traceframes. */
3530 if (trace_regblock_size == 0)
3531 error (_("No register block size recorded in trace file"));
3532 }
3533 if (ex.reason < 0)
3534 {
3535 /* Pop the partially set up target. */
3536 pop_target ();
3537 throw_exception (ex);
00bf0b85
SS
3538 }
3539
e93a69ed
PA
3540 inferior_appeared (current_inferior (), TFILE_PID);
3541 inferior_ptid = pid_to_ptid (TFILE_PID);
3542 add_thread_silent (inferior_ptid);
3543
3544 if (ts->traceframe_count <= 0)
3545 warning (_("No traceframes present in this file."));
3546
00bf0b85
SS
3547 /* Add the file's tracepoints and variables into the current mix. */
3548
10ef8d6a
PA
3549 /* Get trace state variables first, they may be checked when parsing
3550 uploaded commands. */
00bf0b85
SS
3551 merge_uploaded_trace_state_variables (&uploaded_tsvs);
3552
10ef8d6a
PA
3553 merge_uploaded_tracepoints (&uploaded_tps);
3554
00bf0b85 3555 post_create_inferior (&tfile_ops, from_tty);
00bf0b85
SS
3556}
3557
3558/* Interpret the given line from the definitions part of the trace
3559 file. */
3560
3561static void
3562tfile_interp_line (char *line,
3563 struct uploaded_tp **utpp, struct uploaded_tsv **utsvp)
3564{
3565 char *p = line;
3566
3567 if (strncmp (p, "R ", strlen ("R ")) == 0)
3568 {
3569 p += strlen ("R ");
3570 trace_regblock_size = strtol (p, &p, 16);
3571 }
3572 else if (strncmp (p, "status ", strlen ("status ")) == 0)
3573 {
3574 p += strlen ("status ");
3575 parse_trace_status (p, current_trace_status ());
3576 }
3577 else if (strncmp (p, "tp ", strlen ("tp ")) == 0)
3578 {
3579 p += strlen ("tp ");
3580 parse_tracepoint_definition (p, utpp);
3581 }
3582 else if (strncmp (p, "tsv ", strlen ("tsv ")) == 0)
3583 {
3584 p += strlen ("tsv ");
3585 parse_tsv_definition (p, utsvp);
3586 }
3587 else
a73c6dcd 3588 warning (_("Ignoring trace file definition \"%s\""), line);
00bf0b85
SS
3589}
3590
3591/* Parse the part of trace status syntax that is shared between
3592 the remote protocol and the trace file reader. */
3593
00bf0b85
SS
3594void
3595parse_trace_status (char *line, struct trace_status *ts)
3596{
6c28cbf2 3597 char *p = line, *p1, *p2, *p_temp;
00bf0b85
SS
3598 ULONGEST val;
3599
3600 ts->running_known = 1;
3601 ts->running = (*p++ == '1');
3602 ts->stop_reason = trace_stop_reason_unknown;
a609a0c8
PA
3603 xfree (ts->error_desc);
3604 ts->error_desc = NULL;
4daf5ac0
SS
3605 ts->traceframe_count = -1;
3606 ts->traceframes_created = -1;
3607 ts->buffer_free = -1;
3608 ts->buffer_size = -1;
33da3f1c
SS
3609 ts->disconnected_tracing = 0;
3610 ts->circular_buffer = 0;
4daf5ac0 3611
00bf0b85
SS
3612 while (*p++)
3613 {
3614 p1 = strchr (p, ':');
3615 if (p1 == NULL)
3616 error (_("Malformed trace status, at %s\n\
3617Status line: '%s'\n"), p, line);
3618 if (strncmp (p, stop_reason_names[trace_buffer_full], p1 - p) == 0)
3619 {
3620 p = unpack_varlen_hex (++p1, &val);
3621 ts->stop_reason = trace_buffer_full;
3622 }
3623 else if (strncmp (p, stop_reason_names[trace_never_run], p1 - p) == 0)
3624 {
3625 p = unpack_varlen_hex (++p1, &val);
3626 ts->stop_reason = trace_never_run;
3627 }
3e43a32a
MS
3628 else if (strncmp (p, stop_reason_names[tracepoint_passcount],
3629 p1 - p) == 0)
00bf0b85
SS
3630 {
3631 p = unpack_varlen_hex (++p1, &val);
3632 ts->stop_reason = tracepoint_passcount;
3633 ts->stopping_tracepoint = val;
3634 }
3635 else if (strncmp (p, stop_reason_names[tstop_command], p1 - p) == 0)
3636 {
3637 p = unpack_varlen_hex (++p1, &val);
3638 ts->stop_reason = tstop_command;
3639 }
33da3f1c
SS
3640 else if (strncmp (p, stop_reason_names[trace_disconnected], p1 - p) == 0)
3641 {
3642 p = unpack_varlen_hex (++p1, &val);
3643 ts->stop_reason = trace_disconnected;
3644 }
6c28cbf2
SS
3645 else if (strncmp (p, stop_reason_names[tracepoint_error], p1 - p) == 0)
3646 {
3647 p2 = strchr (++p1, ':');
3648 if (p2 != p1)
3649 {
3650 int end;
99b5e152
PA
3651
3652 ts->error_desc = xmalloc ((p2 - p1) / 2 + 1);
3653 end = hex2bin (p1, ts->error_desc, (p2 - p1) / 2);
6c28cbf2
SS
3654 ts->error_desc[end] = '\0';
3655 }
a609a0c8
PA
3656 else
3657 ts->error_desc = xstrdup ("");
3658
6c28cbf2
SS
3659 p = unpack_varlen_hex (++p2, &val);
3660 ts->stopping_tracepoint = val;
3661 ts->stop_reason = tracepoint_error;
3662 }
4daf5ac0 3663 else if (strncmp (p, "tframes", p1 - p) == 0)
00bf0b85
SS
3664 {
3665 p = unpack_varlen_hex (++p1, &val);
3666 ts->traceframe_count = val;
3667 }
4daf5ac0
SS
3668 else if (strncmp (p, "tcreated", p1 - p) == 0)
3669 {
3670 p = unpack_varlen_hex (++p1, &val);
3671 ts->traceframes_created = val;
3672 }
3673 else if (strncmp (p, "tfree", p1 - p) == 0)
00bf0b85
SS
3674 {
3675 p = unpack_varlen_hex (++p1, &val);
3676 ts->buffer_free = val;
3677 }
4daf5ac0
SS
3678 else if (strncmp (p, "tsize", p1 - p) == 0)
3679 {
3680 p = unpack_varlen_hex (++p1, &val);
3681 ts->buffer_size = val;
3682 }
33da3f1c
SS
3683 else if (strncmp (p, "disconn", p1 - p) == 0)
3684 {
3685 p = unpack_varlen_hex (++p1, &val);
3686 ts->disconnected_tracing = val;
3687 }
3688 else if (strncmp (p, "circular", p1 - p) == 0)
3689 {
3690 p = unpack_varlen_hex (++p1, &val);
3691 ts->circular_buffer = val;
3692 }
00bf0b85
SS
3693 else
3694 {
3695 /* Silently skip unknown optional info. */
3696 p_temp = strchr (p1 + 1, ';');
3697 if (p_temp)
3698 p = p_temp;
3699 else
3700 /* Must be at the end. */
3701 break;
3702 }
3703 }
3704}
3705
409873ef
SS
3706/* Given a line of text defining a part of a tracepoint, parse it into
3707 an "uploaded tracepoint". */
00bf0b85
SS
3708
3709void
3710parse_tracepoint_definition (char *line, struct uploaded_tp **utpp)
3711{
3712 char *p;
3713 char piece;
409873ef 3714 ULONGEST num, addr, step, pass, orig_size, xlen, start;
2a2287c7 3715 int enabled, end;
00bf0b85 3716 enum bptype type;
2a2287c7 3717 char *cond, *srctype, *buf;
00bf0b85
SS
3718 struct uploaded_tp *utp = NULL;
3719
3720 p = line;
3721 /* Both tracepoint and action definitions start with the same number
3722 and address sequence. */
3723 piece = *p++;
3724 p = unpack_varlen_hex (p, &num);
3725 p++; /* skip a colon */
3726 p = unpack_varlen_hex (p, &addr);
3727 p++; /* skip a colon */
3728 if (piece == 'T')
3729 {
3730 enabled = (*p++ == 'E');
3731 p++; /* skip a colon */
3732 p = unpack_varlen_hex (p, &step);
3733 p++; /* skip a colon */
3734 p = unpack_varlen_hex (p, &pass);
3735 type = bp_tracepoint;
3736 cond = NULL;
3737 /* Thumb through optional fields. */
3738 while (*p == ':')
3739 {
3740 p++; /* skip a colon */
3741 if (*p == 'F')
3742 {
3743 type = bp_fast_tracepoint;
3744 p++;
3745 p = unpack_varlen_hex (p, &orig_size);
3746 }
0fb4aa4b
PA
3747 else if (*p == 'S')
3748 {
3749 type = bp_static_tracepoint;
3750 p++;
3751 }
00bf0b85
SS
3752 else if (*p == 'X')
3753 {
3754 p++;
3755 p = unpack_varlen_hex (p, &xlen);
3756 p++; /* skip a comma */
3757 cond = (char *) xmalloc (2 * xlen + 1);
3758 strncpy (cond, p, 2 * xlen);
3759 cond[2 * xlen] = '\0';
3760 p += 2 * xlen;
3761 }
3762 else
3e43a32a
MS
3763 warning (_("Unrecognized char '%c' in tracepoint "
3764 "definition, skipping rest"), *p);
00bf0b85
SS
3765 }
3766 utp = get_uploaded_tp (num, addr, utpp);
3767 utp->type = type;
3768 utp->enabled = enabled;
3769 utp->step = step;
3770 utp->pass = pass;
3771 utp->cond = cond;
3772 }
3773 else if (piece == 'A')
3774 {
3775 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3776 VEC_safe_push (char_ptr, utp->actions, xstrdup (p));
00bf0b85
SS
3777 }
3778 else if (piece == 'S')
3779 {
3780 utp = get_uploaded_tp (num, addr, utpp);
3149d8c1 3781 VEC_safe_push (char_ptr, utp->step_actions, xstrdup (p));
00bf0b85 3782 }
409873ef
SS
3783 else if (piece == 'Z')
3784 {
3785 /* Parse a chunk of source form definition. */
3786 utp = get_uploaded_tp (num, addr, utpp);
3787 srctype = p;
3788 p = strchr (p, ':');
3789 p++; /* skip a colon */
3790 p = unpack_varlen_hex (p, &start);
3791 p++; /* skip a colon */
3792 p = unpack_varlen_hex (p, &xlen);
3793 p++; /* skip a colon */
3794
3795 buf = alloca (strlen (line));
3796
3797 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3798 buf[end] = '\0';
3799
3800 if (strncmp (srctype, "at:", strlen ("at:")) == 0)
3801 utp->at_string = xstrdup (buf);
3802 else if (strncmp (srctype, "cond:", strlen ("cond:")) == 0)
3803 utp->cond_string = xstrdup (buf);
3804 else if (strncmp (srctype, "cmd:", strlen ("cmd:")) == 0)
3149d8c1 3805 VEC_safe_push (char_ptr, utp->cmd_strings, xstrdup (buf));
409873ef 3806 }
00bf0b85
SS
3807 else
3808 {
409873ef
SS
3809 /* Don't error out, the target might be sending us optional
3810 info that we don't care about. */
3811 warning (_("Unrecognized tracepoint piece '%c', ignoring"), piece);
00bf0b85
SS
3812 }
3813}
3814
3815/* Convert a textual description of a trace state variable into an
3816 uploaded object. */
3817
3818void
3819parse_tsv_definition (char *line, struct uploaded_tsv **utsvp)
3820{
3821 char *p, *buf;
3822 ULONGEST num, initval, builtin;
3823 int end;
3824 struct uploaded_tsv *utsv = NULL;
3825
3826 buf = alloca (strlen (line));
3827
3828 p = line;
3829 p = unpack_varlen_hex (p, &num);
3830 p++; /* skip a colon */
3831 p = unpack_varlen_hex (p, &initval);
3832 p++; /* skip a colon */
3833 p = unpack_varlen_hex (p, &builtin);
3834 p++; /* skip a colon */
3835 end = hex2bin (p, (gdb_byte *) buf, strlen (p) / 2);
3836 buf[end] = '\0';
3837
3838 utsv = get_uploaded_tsv (num, utsvp);
3839 utsv->initial_value = initval;
3840 utsv->builtin = builtin;
3841 utsv->name = xstrdup (buf);
3842}
3843
3844/* Close the trace file and generally clean up. */
3845
3846static void
3847tfile_close (int quitting)
3848{
3849 int pid;
3850
3851 if (trace_fd < 0)
3852 return;
3853
3854 pid = ptid_get_pid (inferior_ptid);
c378eb4e 3855 inferior_ptid = null_ptid; /* Avoid confusion from thread stuff. */
00bf0b85
SS
3856 exit_inferior_silent (pid);
3857
3858 close (trace_fd);
3859 trace_fd = -1;
e93a69ed
PA
3860 xfree (trace_filename);
3861 trace_filename = NULL;
00bf0b85
SS
3862}
3863
3864static void
3865tfile_files_info (struct target_ops *t)
3866{
c378eb4e 3867 /* (it would be useful to mention the name of the file). */
00bf0b85
SS
3868 printf_filtered ("Looking at a trace file.\n");
3869}
3870
3871/* The trace status for a file is that tracing can never be run. */
3872
3873static int
3874tfile_get_trace_status (struct trace_status *ts)
3875{
3876 /* Other bits of trace status were collected as part of opening the
3877 trace files, so nothing to do here. */
3878
3879 return -1;
3880}
3881
3882/* Given the position of a traceframe in the file, figure out what
3883 address the frame was collected at. This would normally be the
3884 value of a collected PC register, but if not available, we
3885 improvise. */
3886
3887static ULONGEST
3888tfile_get_traceframe_address (off_t tframe_offset)
3889{
3890 ULONGEST addr = 0;
3891 short tpnum;
d9b3f62e 3892 struct tracepoint *tp;
00bf0b85
SS
3893 off_t saved_offset = cur_offset;
3894
c378eb4e 3895 /* FIXME dig pc out of collected registers. */
00bf0b85
SS
3896
3897 /* Fall back to using tracepoint address. */
3898 lseek (trace_fd, tframe_offset, SEEK_SET);
9f41c731 3899 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3900 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3901 gdbarch_byte_order
3902 (target_gdbarch));
98e03262 3903
00bf0b85 3904 tp = get_tracepoint_by_number_on_target (tpnum);
c378eb4e 3905 /* FIXME this is a poor heuristic if multiple locations. */
d9b3f62e
PA
3906 if (tp && tp->base.loc)
3907 addr = tp->base.loc->address;
00bf0b85
SS
3908
3909 /* Restore our seek position. */
3910 cur_offset = saved_offset;
3911 lseek (trace_fd, cur_offset, SEEK_SET);
3912 return addr;
3913}
3914
e6e4e701
PA
3915/* Make tfile's selected traceframe match GDB's selected
3916 traceframe. */
3917
3918static void
3919set_tfile_traceframe (void)
3920{
3921 int newnum;
3922
3923 if (cur_traceframe_number == get_traceframe_number ())
3924 return;
3925
3926 /* Avoid recursion, tfile_trace_find calls us again. */
3927 cur_traceframe_number = get_traceframe_number ();
3928
3929 newnum = target_trace_find (tfind_number,
3930 get_traceframe_number (), 0, 0, NULL);
3931
3932 /* Should not happen. If it does, all bets are off. */
3933 if (newnum != get_traceframe_number ())
3934 warning (_("could not set tfile's traceframe"));
3935}
3936
00bf0b85
SS
3937/* Given a type of search and some parameters, scan the collection of
3938 traceframes in the file looking for a match. When found, return
3939 both the traceframe and tracepoint number, otherwise -1 for
3940 each. */
3941
3942static int
3943tfile_trace_find (enum trace_find_type type, int num,
3944 ULONGEST addr1, ULONGEST addr2, int *tpp)
3945{
3946 short tpnum;
9f41c731 3947 int tfnum = 0, found = 0;
8991e9fa 3948 unsigned int data_size;
d9b3f62e 3949 struct tracepoint *tp;
00bf0b85
SS
3950 off_t offset, tframe_offset;
3951 ULONGEST tfaddr;
3952
e6e4e701
PA
3953 /* Lookups other than by absolute frame number depend on the current
3954 trace selected, so make sure it is correct on the tfile end
3955 first. */
3956 if (type != tfind_number)
3957 set_tfile_traceframe ();
fb80a3c5
HZ
3958 else if (num == -1)
3959 {
3960 if (tpp)
3961 *tpp = -1;
3962 return -1;
3963 }
e6e4e701 3964
00bf0b85
SS
3965 lseek (trace_fd, trace_frames_offset, SEEK_SET);
3966 offset = trace_frames_offset;
3967 while (1)
3968 {
3969 tframe_offset = offset;
9f41c731 3970 tfile_read ((gdb_byte *) &tpnum, 2);
8991e9fa
HZ
3971 tpnum = (short) extract_signed_integer ((gdb_byte *) &tpnum, 2,
3972 gdbarch_byte_order
3973 (target_gdbarch));
00bf0b85
SS
3974 offset += 2;
3975 if (tpnum == 0)
3976 break;
9f41c731 3977 tfile_read ((gdb_byte *) &data_size, 4);
8991e9fa
HZ
3978 data_size = (unsigned int) extract_unsigned_integer
3979 ((gdb_byte *) &data_size, 4,
3980 gdbarch_byte_order (target_gdbarch));
00bf0b85
SS
3981 offset += 4;
3982 switch (type)
3983 {
3984 case tfind_number:
3985 if (tfnum == num)
3986 found = 1;
3987 break;
3988 case tfind_pc:
3989 tfaddr = tfile_get_traceframe_address (tframe_offset);
3990 if (tfaddr == addr1)
3991 found = 1;
3992 break;
3993 case tfind_tp:
3994 tp = get_tracepoint (num);
3995 if (tp && tpnum == tp->number_on_target)
3996 found = 1;
3997 break;
3998 case tfind_range:
3999 tfaddr = tfile_get_traceframe_address (tframe_offset);
4000 if (addr1 <= tfaddr && tfaddr <= addr2)
4001 found = 1;
4002 break;
4003 case tfind_outside:
4004 tfaddr = tfile_get_traceframe_address (tframe_offset);
4005 if (!(addr1 <= tfaddr && tfaddr <= addr2))
4006 found = 1;
4007 break;
4008 default:
4009 internal_error (__FILE__, __LINE__, _("unknown tfind type"));
4010 }
4011 if (found)
4012 {
00bf0b85
SS
4013 if (tpp)
4014 *tpp = tpnum;
4015 cur_offset = offset;
4016 cur_data_size = data_size;
e6e4e701 4017 cur_traceframe_number = tfnum;
00bf0b85
SS
4018 return tfnum;
4019 }
4020 /* Skip past the traceframe's data. */
4021 lseek (trace_fd, data_size, SEEK_CUR);
4022 offset += data_size;
4023 /* Update our own count of traceframes. */
4024 ++tfnum;
4025 }
4026 /* Did not find what we were looking for. */
4027 if (tpp)
4028 *tpp = -1;
4029 return -1;
4030}
4031
9f41c731
PA
4032/* Prototype of the callback passed to tframe_walk_blocks. */
4033typedef int (*walk_blocks_callback_func) (char blocktype, void *data);
4034
4035/* Callback for traceframe_walk_blocks, used to find a given block
4036 type in a traceframe. */
4037
4038static int
4039match_blocktype (char blocktype, void *data)
4040{
4041 char *wantedp = data;
4042
4043 if (*wantedp == blocktype)
4044 return 1;
4045
4046 return 0;
4047}
4048
4049/* Walk over all traceframe block starting at POS offset from
4050 CUR_OFFSET, and call CALLBACK for each block found, passing in DATA
4051 unmodified. If CALLBACK returns true, this returns the position in
4052 the traceframe where the block is found, relative to the start of
4053 the traceframe (cur_offset). Returns -1 if no callback call
4054 returned true, indicating that all blocks have been walked. */
4055
4056static int
4057traceframe_walk_blocks (walk_blocks_callback_func callback,
4058 int pos, void *data)
4059{
4060 /* Iterate through a traceframe's blocks, looking for a block of the
4061 requested type. */
4062
4063 lseek (trace_fd, cur_offset + pos, SEEK_SET);
4064 while (pos < cur_data_size)
4065 {
4066 unsigned short mlen;
4067 char block_type;
4068
4069 tfile_read (&block_type, 1);
4070
4071 ++pos;
4072
4073 if ((*callback) (block_type, data))
4074 return pos;
4075
4076 switch (block_type)
4077 {
4078 case 'R':
4079 lseek (trace_fd, cur_offset + pos + trace_regblock_size, SEEK_SET);
4080 pos += trace_regblock_size;
4081 break;
4082 case 'M':
4083 lseek (trace_fd, cur_offset + pos + 8, SEEK_SET);
4084 tfile_read ((gdb_byte *) &mlen, 2);
4085 mlen = (unsigned short)
4086 extract_unsigned_integer ((gdb_byte *) &mlen, 2,
4087 gdbarch_byte_order
4088 (target_gdbarch));
4089 lseek (trace_fd, mlen, SEEK_CUR);
4090 pos += (8 + 2 + mlen);
4091 break;
4092 case 'V':
4093 lseek (trace_fd, cur_offset + pos + 4 + 8, SEEK_SET);
4094 pos += (4 + 8);
4095 break;
4096 default:
c2f0d045 4097 error (_("Unknown block type '%c' (0x%x) in trace frame"),
9f41c731
PA
4098 block_type, block_type);
4099 break;
4100 }
4101 }
4102
4103 return -1;
4104}
4105
4106/* Convenience wrapper around traceframe_walk_blocks. Looks for the
4107 position offset of a block of type TYPE_WANTED in the current trace
4108 frame, starting at POS. Returns -1 if no such block was found. */
4109
4110static int
4111traceframe_find_block_type (char type_wanted, int pos)
4112{
4113 return traceframe_walk_blocks (match_blocktype, pos, &type_wanted);
4114}
4115
00bf0b85
SS
4116/* Look for a block of saved registers in the traceframe, and get the
4117 requested register from it. */
4118
4119static void
4120tfile_fetch_registers (struct target_ops *ops,
4121 struct regcache *regcache, int regno)
4122{
4123 struct gdbarch *gdbarch = get_regcache_arch (regcache);
4124 char block_type;
9f41c731 4125 int pos, offset, regn, regsize, pc_regno;
00bf0b85
SS
4126 unsigned short mlen;
4127 char *regs;
4128
4129 /* An uninitialized reg size says we're not going to be
4130 successful at getting register blocks. */
4131 if (!trace_regblock_size)
4132 return;
4133
e6e4e701
PA
4134 set_tfile_traceframe ();
4135
00bf0b85
SS
4136 regs = alloca (trace_regblock_size);
4137
9f41c731 4138 if (traceframe_find_block_type ('R', 0) >= 0)
00bf0b85 4139 {
9f41c731 4140 tfile_read (regs, trace_regblock_size);
98e03262 4141
9f41c731
PA
4142 /* Assume the block is laid out in GDB register number order,
4143 each register with the size that it has in GDB. */
4144 offset = 0;
4145 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
00bf0b85 4146 {
9f41c731
PA
4147 regsize = register_size (gdbarch, regn);
4148 /* Make sure we stay within block bounds. */
4149 if (offset + regsize >= trace_regblock_size)
4150 break;
4151 if (regcache_register_status (regcache, regn) == REG_UNKNOWN)
00bf0b85 4152 {
9f41c731 4153 if (regno == regn)
00bf0b85 4154 {
9f41c731
PA
4155 regcache_raw_supply (regcache, regno, regs + offset);
4156 break;
4157 }
4158 else if (regno == -1)
4159 {
4160 regcache_raw_supply (regcache, regn, regs + offset);
00bf0b85 4161 }
00bf0b85 4162 }
9f41c731 4163 offset += regsize;
00bf0b85 4164 }
9f41c731 4165 return;
00bf0b85 4166 }
af54718e 4167
9f41c731
PA
4168 /* We get here if no register data has been found. Mark registers
4169 as unavailable. */
af54718e
SS
4170 for (regn = 0; regn < gdbarch_num_regs (gdbarch); regn++)
4171 regcache_raw_supply (regcache, regn, NULL);
4172
4173 /* We can often usefully guess that the PC is going to be the same
4174 as the address of the tracepoint. */
4175 pc_regno = gdbarch_pc_regnum (gdbarch);
4176 if (pc_regno >= 0 && (regno == -1 || regno == pc_regno))
4177 {
d9b3f62e 4178 struct tracepoint *tp = get_tracepoint (tracepoint_number);
af54718e 4179
d9b3f62e 4180 if (tp && tp->base.loc)
af54718e
SS
4181 {
4182 /* But don't try to guess if tracepoint is multi-location... */
d9b3f62e 4183 if (tp->base.loc->next)
af54718e 4184 {
a73c6dcd
MS
4185 warning (_("Tracepoint %d has multiple "
4186 "locations, cannot infer $pc"),
d9b3f62e 4187 tp->base.number);
af54718e
SS
4188 return;
4189 }
4190 /* ... or does while-stepping. */
4191 if (tp->step_count > 0)
4192 {
a73c6dcd
MS
4193 warning (_("Tracepoint %d does while-stepping, "
4194 "cannot infer $pc"),
d9b3f62e 4195 tp->base.number);
af54718e
SS
4196 return;
4197 }
4198
4199 store_unsigned_integer (regs, register_size (gdbarch, pc_regno),
4200 gdbarch_byte_order (gdbarch),
d9b3f62e 4201 tp->base.loc->address);
af54718e
SS
4202 regcache_raw_supply (regcache, pc_regno, regs);
4203 }
4204 }
00bf0b85
SS
4205}
4206
4207static LONGEST
4208tfile_xfer_partial (struct target_ops *ops, enum target_object object,
4209 const char *annex, gdb_byte *readbuf,
4210 const gdb_byte *writebuf, ULONGEST offset, LONGEST len)
4211{
00bf0b85
SS
4212 /* We're only doing regular memory for now. */
4213 if (object != TARGET_OBJECT_MEMORY)
4214 return -1;
4215
4216 if (readbuf == NULL)
a73c6dcd 4217 error (_("tfile_xfer_partial: trace file is read-only"));
00bf0b85 4218
e6e4e701
PA
4219 set_tfile_traceframe ();
4220
4221 if (traceframe_number != -1)
00bf0b85 4222 {
ffd5ec24 4223 int pos = 0;
9f41c731 4224
ffd5ec24
PA
4225 /* Iterate through the traceframe's blocks, looking for
4226 memory. */
4227 while ((pos = traceframe_find_block_type ('M', pos)) >= 0)
00bf0b85 4228 {
ffd5ec24
PA
4229 ULONGEST maddr, amt;
4230 unsigned short mlen;
4231 enum bfd_endian byte_order = gdbarch_byte_order (target_gdbarch);
fce3c1f0 4232
ffd5ec24
PA
4233 tfile_read ((gdb_byte *) &maddr, 8);
4234 maddr = extract_unsigned_integer ((gdb_byte *) &maddr, 8,
4235 byte_order);
4236 tfile_read ((gdb_byte *) &mlen, 2);
4237 mlen = (unsigned short)
4238 extract_unsigned_integer ((gdb_byte *) &mlen, 2, byte_order);
4239
4240 /* If the block includes the first part of the desired
4241 range, return as much it has; GDB will re-request the
4242 remainder, which might be in a different block of this
4243 trace frame. */
4244 if (maddr <= offset && offset < (maddr + mlen))
4245 {
4246 amt = (maddr + mlen) - offset;
4247 if (amt > len)
4248 amt = len;
4249
4250 tfile_read (readbuf, amt);
4251 return amt;
4252 }
9f41c731 4253
ffd5ec24
PA
4254 /* Skip over this block. */
4255 pos += (8 + 2 + mlen);
4256 }
00bf0b85 4257 }
fce3c1f0
SS
4258
4259 /* It's unduly pedantic to refuse to look at the executable for
4260 read-only pieces; so do the equivalent of readonly regions aka
4261 QTro packet. */
c378eb4e 4262 /* FIXME account for relocation at some point. */
fce3c1f0
SS
4263 if (exec_bfd)
4264 {
4265 asection *s;
4266 bfd_size_type size;
2209c807 4267 bfd_vma vma;
fce3c1f0
SS
4268
4269 for (s = exec_bfd->sections; s; s = s->next)
4270 {
9f41c731
PA
4271 if ((s->flags & SEC_LOAD) == 0
4272 || (s->flags & SEC_READONLY) == 0)
fce3c1f0
SS
4273 continue;
4274
2209c807 4275 vma = s->vma;
fce3c1f0 4276 size = bfd_get_section_size (s);
2209c807 4277 if (vma <= offset && offset < (vma + size))
fce3c1f0 4278 {
9f41c731
PA
4279 ULONGEST amt;
4280
2209c807 4281 amt = (vma + size) - offset;
fce3c1f0
SS
4282 if (amt > len)
4283 amt = len;
4284
4285 amt = bfd_get_section_contents (exec_bfd, s,
2209c807 4286 readbuf, offset - vma, amt);
fce3c1f0
SS
4287 return amt;
4288 }
4289 }
4290 }
4291
00bf0b85
SS
4292 /* Indicate failure to find the requested memory block. */
4293 return -1;
4294}
4295
4296/* Iterate through the blocks of a trace frame, looking for a 'V'
4297 block with a matching tsv number. */
4298
4299static int
4300tfile_get_trace_state_variable_value (int tsvnum, LONGEST *val)
4301{
9f41c731 4302 int pos;
00bf0b85 4303
e6e4e701
PA
4304 set_tfile_traceframe ();
4305
00bf0b85 4306 pos = 0;
9f41c731 4307 while ((pos = traceframe_find_block_type ('V', pos)) >= 0)
00bf0b85 4308 {
9f41c731
PA
4309 int vnum;
4310
4311 tfile_read ((gdb_byte *) &vnum, 4);
4312 vnum = (int) extract_signed_integer ((gdb_byte *) &vnum, 4,
8991e9fa 4313 gdbarch_byte_order
9f41c731
PA
4314 (target_gdbarch));
4315 if (tsvnum == vnum)
4316 {
4317 tfile_read ((gdb_byte *) val, 8);
4318 *val = extract_signed_integer ((gdb_byte *) val, 8,
4319 gdbarch_byte_order
4320 (target_gdbarch));
4321 return 1;
00bf0b85 4322 }
9f41c731 4323 pos += (4 + 8);
00bf0b85 4324 }
9f41c731 4325
00bf0b85
SS
4326 /* Didn't find anything. */
4327 return 0;
4328}
4329
fce3c1f0
SS
4330static int
4331tfile_has_all_memory (struct target_ops *ops)
4332{
4333 return 1;
4334}
4335
00bf0b85
SS
4336static int
4337tfile_has_memory (struct target_ops *ops)
4338{
4339 return 1;
4340}
4341
4342static int
4343tfile_has_stack (struct target_ops *ops)
4344{
ffd5ec24 4345 return traceframe_number != -1;
00bf0b85
SS
4346}
4347
4348static int
4349tfile_has_registers (struct target_ops *ops)
4350{
ffd5ec24 4351 return traceframe_number != -1;
00bf0b85
SS
4352}
4353
e93a69ed
PA
4354static int
4355tfile_thread_alive (struct target_ops *ops, ptid_t ptid)
4356{
4357 return 1;
4358}
4359
b3b9301e
PA
4360/* Callback for traceframe_walk_blocks. Builds a traceframe_info
4361 object for the tfile target's current traceframe. */
4362
4363static int
4364build_traceframe_info (char blocktype, void *data)
4365{
4366 struct traceframe_info *info = data;
4367
4368 switch (blocktype)
4369 {
4370 case 'M':
4371 {
4372 struct mem_range *r;
4373 ULONGEST maddr;
4374 unsigned short mlen;
4375
4376 tfile_read ((gdb_byte *) &maddr, 8);
4377 tfile_read ((gdb_byte *) &mlen, 2);
4378
4379 r = VEC_safe_push (mem_range_s, info->memory, NULL);
4380
4381 r->start = maddr;
4382 r->length = mlen;
4383 break;
4384 }
4385 case 'V':
4386 case 'R':
4387 case 'S':
4388 {
4389 break;
4390 }
4391 default:
4392 warning (_("Unhandled trace block type (%d) '%c ' "
4393 "while building trace frame info."),
4394 blocktype, blocktype);
4395 break;
4396 }
4397
4398 return 0;
4399}
4400
4401static struct traceframe_info *
4402tfile_traceframe_info (void)
4403{
4404 struct traceframe_info *info = XCNEW (struct traceframe_info);
4405
4406 traceframe_walk_blocks (build_traceframe_info, 0, info);
4407 return info;
4408}
4409
00bf0b85
SS
4410static void
4411init_tfile_ops (void)
4412{
4413 tfile_ops.to_shortname = "tfile";
4414 tfile_ops.to_longname = "Local trace dump file";
3e43a32a
MS
4415 tfile_ops.to_doc
4416 = "Use a trace file as a target. Specify the filename of the trace file.";
00bf0b85
SS
4417 tfile_ops.to_open = tfile_open;
4418 tfile_ops.to_close = tfile_close;
4419 tfile_ops.to_fetch_registers = tfile_fetch_registers;
4420 tfile_ops.to_xfer_partial = tfile_xfer_partial;
4421 tfile_ops.to_files_info = tfile_files_info;
4422 tfile_ops.to_get_trace_status = tfile_get_trace_status;
4423 tfile_ops.to_trace_find = tfile_trace_find;
3e43a32a
MS
4424 tfile_ops.to_get_trace_state_variable_value
4425 = tfile_get_trace_state_variable_value;
00bf0b85 4426 tfile_ops.to_stratum = process_stratum;
fce3c1f0 4427 tfile_ops.to_has_all_memory = tfile_has_all_memory;
00bf0b85
SS
4428 tfile_ops.to_has_memory = tfile_has_memory;
4429 tfile_ops.to_has_stack = tfile_has_stack;
4430 tfile_ops.to_has_registers = tfile_has_registers;
b3b9301e 4431 tfile_ops.to_traceframe_info = tfile_traceframe_info;
e93a69ed 4432 tfile_ops.to_thread_alive = tfile_thread_alive;
00bf0b85
SS
4433 tfile_ops.to_magic = OPS_MAGIC;
4434}
4435
0fb4aa4b
PA
4436/* Given a line of text defining a static tracepoint marker, parse it
4437 into a "static tracepoint marker" object. Throws an error is
4438 parsing fails. If PP is non-null, it points to one past the end of
4439 the parsed marker definition. */
4440
4441void
4442parse_static_tracepoint_marker_definition (char *line, char **pp,
4443 struct static_tracepoint_marker *marker)
4444{
4445 char *p, *endp;
4446 ULONGEST addr;
4447 int end;
4448
4449 p = line;
4450 p = unpack_varlen_hex (p, &addr);
4451 p++; /* skip a colon */
4452
4453 marker->gdbarch = target_gdbarch;
4454 marker->address = (CORE_ADDR) addr;
4455
4456 endp = strchr (p, ':');
4457 if (endp == NULL)
74232302 4458 error (_("bad marker definition: %s"), line);
0fb4aa4b
PA
4459
4460 marker->str_id = xmalloc (endp - p + 1);
4461 end = hex2bin (p, (gdb_byte *) marker->str_id, (endp - p + 1) / 2);
4462 marker->str_id[end] = '\0';
4463
4464 p += 2 * end;
4465 p++; /* skip a colon */
4466
4467 marker->extra = xmalloc (strlen (p) + 1);
4468 end = hex2bin (p, (gdb_byte *) marker->extra, strlen (p) / 2);
4469 marker->extra[end] = '\0';
4470
4471 if (pp)
4472 *pp = p;
4473}
4474
4475/* Release a static tracepoint marker's contents. Note that the
4476 object itself isn't released here. There objects are usually on
4477 the stack. */
4478
4479void
4480release_static_tracepoint_marker (struct static_tracepoint_marker *marker)
4481{
4482 xfree (marker->str_id);
4483 marker->str_id = NULL;
4484}
4485
4486/* Print MARKER to gdb_stdout. */
4487
4488static void
4489print_one_static_tracepoint_marker (int count,
4490 struct static_tracepoint_marker *marker)
4491{
4492 struct command_line *l;
4493 struct symbol *sym;
4494
4495 char wrap_indent[80];
4496 char extra_field_indent[80];
79a45e25 4497 struct ui_out *uiout = current_uiout;
0fb4aa4b
PA
4498 struct ui_stream *stb = ui_out_stream_new (uiout);
4499 struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
4500 struct cleanup *bkpt_chain;
4501 VEC(breakpoint_p) *tracepoints;
4502
4503 struct symtab_and_line sal;
4504
4505 init_sal (&sal);
4506
4507 sal.pc = marker->address;
4508
4509 tracepoints = static_tracepoints_here (marker->address);
4510
4511 bkpt_chain = make_cleanup_ui_out_tuple_begin_end (uiout, "marker");
4512
4513 /* A counter field to help readability. This is not a stable
4514 identifier! */
4515 ui_out_field_int (uiout, "count", count);
4516
4517 ui_out_field_string (uiout, "marker-id", marker->str_id);
4518
4519 ui_out_field_fmt (uiout, "enabled", "%c",
4520 !VEC_empty (breakpoint_p, tracepoints) ? 'y' : 'n');
4521 ui_out_spaces (uiout, 2);
4522
4523 strcpy (wrap_indent, " ");
4524
4525 if (gdbarch_addr_bit (marker->gdbarch) <= 32)
4526 strcat (wrap_indent, " ");
4527 else
4528 strcat (wrap_indent, " ");
4529
4530 strcpy (extra_field_indent, " ");
4531
4532 ui_out_field_core_addr (uiout, "addr", marker->gdbarch, marker->address);
4533
4534 sal = find_pc_line (marker->address, 0);
4535 sym = find_pc_sect_function (marker->address, NULL);
4536 if (sym)
4537 {
4538 ui_out_text (uiout, "in ");
4539 ui_out_field_string (uiout, "func",
4540 SYMBOL_PRINT_NAME (sym));
4541 ui_out_wrap_hint (uiout, wrap_indent);
4542 ui_out_text (uiout, " at ");
4543 }
4544 else
4545 ui_out_field_skip (uiout, "func");
4546
4547 if (sal.symtab != NULL)
4548 {
4549 ui_out_field_string (uiout, "file", sal.symtab->filename);
4550 ui_out_text (uiout, ":");
4551
4552 if (ui_out_is_mi_like_p (uiout))
4553 {
4554 char *fullname = symtab_to_fullname (sal.symtab);
4555
4556 if (fullname)
4557 ui_out_field_string (uiout, "fullname", fullname);
4558 }
4559 else
4560 ui_out_field_skip (uiout, "fullname");
4561
4562 ui_out_field_int (uiout, "line", sal.line);
4563 }
4564 else
4565 {
4566 ui_out_field_skip (uiout, "fullname");
4567 ui_out_field_skip (uiout, "line");
4568 }
4569
4570 ui_out_text (uiout, "\n");
4571 ui_out_text (uiout, extra_field_indent);
4572 ui_out_text (uiout, _("Data: \""));
4573 ui_out_field_string (uiout, "extra-data", marker->extra);
4574 ui_out_text (uiout, "\"\n");
4575
4576 if (!VEC_empty (breakpoint_p, tracepoints))
4577 {
4578 struct cleanup *cleanup_chain;
4579 int ix;
4580 struct breakpoint *b;
4581
4582 cleanup_chain = make_cleanup_ui_out_tuple_begin_end (uiout,
4583 "tracepoints-at");
4584
4585 ui_out_text (uiout, extra_field_indent);
4586 ui_out_text (uiout, _("Probed by static tracepoints: "));
4587 for (ix = 0; VEC_iterate(breakpoint_p, tracepoints, ix, b); ix++)
4588 {
4589 if (ix > 0)
4590 ui_out_text (uiout, ", ");
4591 ui_out_text (uiout, "#");
4592 ui_out_field_int (uiout, "tracepoint-id", b->number);
4593 }
4594
4595 do_cleanups (cleanup_chain);
4596
4597 if (ui_out_is_mi_like_p (uiout))
4598 ui_out_field_int (uiout, "number-of-tracepoints",
4599 VEC_length(breakpoint_p, tracepoints));
4600 else
4601 ui_out_text (uiout, "\n");
4602 }
4603 VEC_free (breakpoint_p, tracepoints);
4604
4605 do_cleanups (bkpt_chain);
4606 do_cleanups (old_chain);
4607}
4608
4609static void
4610info_static_tracepoint_markers_command (char *arg, int from_tty)
4611{
4612 VEC(static_tracepoint_marker_p) *markers;
4613 struct cleanup *old_chain;
4614 struct static_tracepoint_marker *marker;
79a45e25 4615 struct ui_out *uiout = current_uiout;
0fb4aa4b
PA
4616 int i;
4617
4618 old_chain
4619 = make_cleanup_ui_out_table_begin_end (uiout, 5, -1,
4620 "StaticTracepointMarkersTable");
4621
4622 ui_out_table_header (uiout, 7, ui_left, "counter", "Cnt");
4623
4624 ui_out_table_header (uiout, 40, ui_left, "marker-id", "ID");
4625
4626 ui_out_table_header (uiout, 3, ui_left, "enabled", "Enb");
4627 if (gdbarch_addr_bit (target_gdbarch) <= 32)
4628 ui_out_table_header (uiout, 10, ui_left, "addr", "Address");
4629 else
4630 ui_out_table_header (uiout, 18, ui_left, "addr", "Address");
4631 ui_out_table_header (uiout, 40, ui_noalign, "what", "What");
4632
4633 ui_out_table_body (uiout);
4634
4635 markers = target_static_tracepoint_markers_by_strid (NULL);
4636 make_cleanup (VEC_cleanup (static_tracepoint_marker_p), &markers);
4637
4638 for (i = 0;
4639 VEC_iterate (static_tracepoint_marker_p,
4640 markers, i, marker);
4641 i++)
4642 {
4643 print_one_static_tracepoint_marker (i + 1, marker);
4644 release_static_tracepoint_marker (marker);
4645 }
4646
4647 do_cleanups (old_chain);
4648}
4649
4650/* The $_sdata convenience variable is a bit special. We don't know
4651 for sure type of the value until we actually have a chance to fetch
4652 the data --- the size of the object depends on what has been
4653 collected. We solve this by making $_sdata be an internalvar that
4654 creates a new value on access. */
4655
4656/* Return a new value with the correct type for the sdata object of
4657 the current trace frame. Return a void value if there's no object
4658 available. */
4659
4660static struct value *
4661sdata_make_value (struct gdbarch *gdbarch, struct internalvar *var)
4662{
4663 LONGEST size;
4664 gdb_byte *buf;
4665
4666 /* We need to read the whole object before we know its size. */
4667 size = target_read_alloc (&current_target,
4668 TARGET_OBJECT_STATIC_TRACE_DATA,
4669 NULL, &buf);
4670 if (size >= 0)
4671 {
4672 struct value *v;
4673 struct type *type;
4674
4675 type = init_vector_type (builtin_type (gdbarch)->builtin_true_char,
4676 size);
4677 v = allocate_value (type);
4678 memcpy (value_contents_raw (v), buf, size);
4679 xfree (buf);
4680 return v;
4681 }
4682 else
4683 return allocate_value (builtin_type (gdbarch)->builtin_void);
4684}
4685
b3b9301e
PA
4686#if !defined(HAVE_LIBEXPAT)
4687
4688struct traceframe_info *
4689parse_traceframe_info (const char *tframe_info)
4690{
4691 static int have_warned;
4692
4693 if (!have_warned)
4694 {
4695 have_warned = 1;
4696 warning (_("Can not parse XML trace frame info; XML support "
4697 "was disabled at compile time"));
4698 }
4699
4700 return NULL;
4701}
4702
4703#else /* HAVE_LIBEXPAT */
4704
4705#include "xml-support.h"
4706
4707/* Handle the start of a <memory> element. */
4708
4709static void
4710traceframe_info_start_memory (struct gdb_xml_parser *parser,
4711 const struct gdb_xml_element *element,
4712 void *user_data, VEC(gdb_xml_value_s) *attributes)
4713{
4714 struct traceframe_info *info = user_data;
4715 struct mem_range *r = VEC_safe_push (mem_range_s, info->memory, NULL);
4716 ULONGEST *start_p, *length_p;
4717
4718 start_p = xml_find_attribute (attributes, "start")->value;
4719 length_p = xml_find_attribute (attributes, "length")->value;
4720
4721 r->start = *start_p;
4722 r->length = *length_p;
4723}
4724
4725/* Discard the constructed trace frame info (if an error occurs). */
4726
4727static void
4728free_result (void *p)
4729{
4730 struct traceframe_info *result = p;
4731
4732 free_traceframe_info (result);
4733}
4734
4735/* The allowed elements and attributes for an XML memory map. */
4736
4737static const struct gdb_xml_attribute memory_attributes[] = {
4738 { "start", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4739 { "length", GDB_XML_AF_NONE, gdb_xml_parse_attr_ulongest, NULL },
4740 { NULL, GDB_XML_AF_NONE, NULL, NULL }
4741};
4742
4743static const struct gdb_xml_element traceframe_info_children[] = {
4744 { "memory", memory_attributes, NULL,
4745 GDB_XML_EF_REPEATABLE | GDB_XML_EF_OPTIONAL,
4746 traceframe_info_start_memory, NULL },
4747 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4748};
4749
4750static const struct gdb_xml_element traceframe_info_elements[] = {
4751 { "traceframe-info", NULL, traceframe_info_children, GDB_XML_EF_NONE,
4752 NULL, NULL },
4753 { NULL, NULL, NULL, GDB_XML_EF_NONE, NULL, NULL }
4754};
4755
4756/* Parse a traceframe-info XML document. */
4757
4758struct traceframe_info *
4759parse_traceframe_info (const char *tframe_info)
4760{
4761 struct traceframe_info *result;
4762 struct cleanup *back_to;
4763
4764 result = XCNEW (struct traceframe_info);
4765 back_to = make_cleanup (free_result, result);
4766
4767 if (gdb_xml_parse_quick (_("trace frame info"),
4768 "traceframe-info.dtd", traceframe_info_elements,
4769 tframe_info, result) == 0)
4770 {
4771 /* Parsed successfully, keep the result. */
4772 discard_cleanups (back_to);
4773
4774 return result;
4775 }
4776
4777 do_cleanups (back_to);
4778 return NULL;
4779}
4780
4781#endif /* HAVE_LIBEXPAT */
4782
4783/* Returns the traceframe_info object for the current traceframe.
4784 This is where we avoid re-fetching the object from the target if we
4785 already have it cached. */
4786
4787struct traceframe_info *
4788get_traceframe_info (void)
4789{
4790 if (traceframe_info == NULL)
4791 traceframe_info = target_traceframe_info ();
4792
4793 return traceframe_info;
4794}
4795
c0f61f9c
PA
4796/* If the target supports the query, return in RESULT the set of
4797 collected memory in the current traceframe, found within the LEN
4798 bytes range starting at MEMADDR. Returns true if the target
4799 supports the query, otherwise returns false, and RESULT is left
4800 undefined. */
2a7498d8
PA
4801
4802int
4803traceframe_available_memory (VEC(mem_range_s) **result,
4804 CORE_ADDR memaddr, ULONGEST len)
4805{
4806 struct traceframe_info *info = get_traceframe_info ();
4807
4808 if (info != NULL)
4809 {
4810 struct mem_range *r;
4811 int i;
4812
4813 *result = NULL;
4814
4815 for (i = 0; VEC_iterate (mem_range_s, info->memory, i, r); i++)
4816 if (mem_ranges_overlap (r->start, r->length, memaddr, len))
4817 {
4818 ULONGEST lo1, hi1, lo2, hi2;
4819 struct mem_range *nr;
4820
4821 lo1 = memaddr;
4822 hi1 = memaddr + len;
4823
4824 lo2 = r->start;
4825 hi2 = r->start + r->length;
4826
4827 nr = VEC_safe_push (mem_range_s, *result, NULL);
4828
4829 nr->start = max (lo1, lo2);
4830 nr->length = min (hi1, hi2) - nr->start;
4831 }
4832
4833 normalize_mem_ranges (*result);
4834 return 1;
4835 }
4836
4837 return 0;
4838}
4839
c906108c
SS
4840/* module initialization */
4841void
fba45db2 4842_initialize_tracepoint (void)
c906108c 4843{
fa58ee11
EZ
4844 struct cmd_list_element *c;
4845
0fb4aa4b
PA
4846 /* Explicitly create without lookup, since that tries to create a
4847 value with a void typed value, and when we get here, gdbarch
4848 isn't initialized yet. At this point, we're quite sure there
4849 isn't another convenience variable of the same name. */
4850 create_internalvar_type_lazy ("_sdata", sdata_make_value);
4851
c906108c
SS
4852 traceframe_number = -1;
4853 tracepoint_number = -1;
4854
c906108c
SS
4855 if (tracepoint_list.list == NULL)
4856 {
4857 tracepoint_list.listsize = 128;
c5aa993b 4858 tracepoint_list.list = xmalloc
c906108c
SS
4859 (tracepoint_list.listsize * sizeof (struct memrange));
4860 }
4861 if (tracepoint_list.aexpr_list == NULL)
4862 {
4863 tracepoint_list.aexpr_listsize = 128;
4864 tracepoint_list.aexpr_list = xmalloc
4865 (tracepoint_list.aexpr_listsize * sizeof (struct agent_expr *));
4866 }
4867
4868 if (stepping_list.list == NULL)
4869 {
4870 stepping_list.listsize = 128;
c5aa993b 4871 stepping_list.list = xmalloc
c906108c
SS
4872 (stepping_list.listsize * sizeof (struct memrange));
4873 }
4874
4875 if (stepping_list.aexpr_list == NULL)
4876 {
4877 stepping_list.aexpr_listsize = 128;
4878 stepping_list.aexpr_list = xmalloc
4879 (stepping_list.aexpr_listsize * sizeof (struct agent_expr *));
4880 }
4881
c5aa993b 4882 add_info ("scope", scope_info,
1bedd215 4883 _("List the variables local to a scope"));
c906108c 4884
e00d1dc8 4885 add_cmd ("tracepoints", class_trace, NULL,
1a966eab 4886 _("Tracing of program execution without stopping the program."),
c906108c
SS
4887 &cmdlist);
4888
c5aa993b 4889 add_com ("tdump", class_trace, trace_dump_command,
1bedd215 4890 _("Print everything collected at the current tracepoint."));
c906108c 4891
00bf0b85
SS
4892 add_com ("tsave", class_trace, trace_save_command, _("\
4893Save the trace data to a file.\n\
4894Use the '-r' option to direct the target to save directly to the file,\n\
4895using its own filesystem."));
4896
f61e138d
SS
4897 c = add_com ("tvariable", class_trace, trace_variable_command,_("\
4898Define a trace state variable.\n\
4899Argument is a $-prefixed name, optionally followed\n\
4900by '=' and an expression that sets the initial value\n\
4901at the start of tracing."));
4902 set_cmd_completer (c, expression_completer);
4903
4904 add_cmd ("tvariable", class_trace, delete_trace_variable_command, _("\
4905Delete one or more trace state variables.\n\
4906Arguments are the names of the variables to delete.\n\
4907If no arguments are supplied, delete all variables."), &deletelist);
c378eb4e 4908 /* FIXME add a trace variable completer. */
f61e138d
SS
4909
4910 add_info ("tvariables", tvariables_info, _("\
4911Status of trace state variables and their values.\n\
0fb4aa4b
PA
4912"));
4913
4914 add_info ("static-tracepoint-markers",
4915 info_static_tracepoint_markers_command, _("\
4916List target static tracepoints markers.\n\
f61e138d
SS
4917"));
4918
1bedd215
AC
4919 add_prefix_cmd ("tfind", class_trace, trace_find_command, _("\
4920Select a trace frame;\n\
4921No argument means forward by one frame; '-' means backward by one frame."),
c906108c
SS
4922 &tfindlist, "tfind ", 1, &cmdlist);
4923
1a966eab 4924 add_cmd ("outside", class_trace, trace_find_outside_command, _("\
081dfbf7 4925Select a trace frame whose PC is outside the given range (exclusive).\n\
1a966eab 4926Usage: tfind outside addr1, addr2"),
c906108c
SS
4927 &tfindlist);
4928
1a966eab 4929 add_cmd ("range", class_trace, trace_find_range_command, _("\
081dfbf7 4930Select a trace frame whose PC is in the given range (inclusive).\n\
1a966eab 4931Usage: tfind range addr1,addr2"),
c906108c
SS
4932 &tfindlist);
4933
1a966eab
AC
4934 add_cmd ("line", class_trace, trace_find_line_command, _("\
4935Select a trace frame by source line.\n\
cce7e648 4936Argument can be a line number (with optional source file),\n\
c906108c 4937a function name, or '*' followed by an address.\n\
1a966eab 4938Default argument is 'the next source line that was traced'."),
c906108c
SS
4939 &tfindlist);
4940
1a966eab
AC
4941 add_cmd ("tracepoint", class_trace, trace_find_tracepoint_command, _("\
4942Select a trace frame by tracepoint number.\n\
4943Default is the tracepoint for the current trace frame."),
c906108c
SS
4944 &tfindlist);
4945
1a966eab
AC
4946 add_cmd ("pc", class_trace, trace_find_pc_command, _("\
4947Select a trace frame by PC.\n\
4948Default is the current PC, or the PC of the current trace frame."),
c906108c
SS
4949 &tfindlist);
4950
1a966eab
AC
4951 add_cmd ("end", class_trace, trace_find_end_command, _("\
4952Synonym for 'none'.\n\
4953De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4954 &tfindlist);
4955
4956 add_cmd ("none", class_trace, trace_find_none_command,
1a966eab 4957 _("De-select any trace frame and resume 'live' debugging."),
c906108c
SS
4958 &tfindlist);
4959
4960 add_cmd ("start", class_trace, trace_find_start_command,
1a966eab 4961 _("Select the first trace frame in the trace buffer."),
c906108c
SS
4962 &tfindlist);
4963
c5aa993b 4964 add_com ("tstatus", class_trace, trace_status_command,
1bedd215 4965 _("Display the status of the current trace data collection."));
c906108c 4966
c5aa993b 4967 add_com ("tstop", class_trace, trace_stop_command,
1bedd215 4968 _("Stop trace data collection."));
c906108c
SS
4969
4970 add_com ("tstart", class_trace, trace_start_command,
1bedd215 4971 _("Start trace data collection."));
c906108c 4972
1bedd215
AC
4973 add_com ("end", class_trace, end_actions_pseudocommand, _("\
4974Ends a list of commands or actions.\n\
c906108c
SS
4975Several GDB commands allow you to enter a list of commands or actions.\n\
4976Entering \"end\" on a line by itself is the normal way to terminate\n\
4977such a list.\n\n\
1bedd215 4978Note: the \"end\" command cannot be used at the gdb prompt."));
c906108c 4979
1bedd215
AC
4980 add_com ("while-stepping", class_trace, while_stepping_pseudocommand, _("\
4981Specify single-stepping behavior at a tracepoint.\n\
c906108c
SS
4982Argument is number of instructions to trace in single-step mode\n\
4983following the tracepoint. This command is normally followed by\n\
4984one or more \"collect\" commands, to specify what to collect\n\
4985while single-stepping.\n\n\
1bedd215 4986Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 4987
c5aa993b
JM
4988 add_com_alias ("ws", "while-stepping", class_alias, 0);
4989 add_com_alias ("stepping", "while-stepping", class_alias, 0);
c906108c 4990
1bedd215
AC
4991 add_com ("collect", class_trace, collect_pseudocommand, _("\
4992Specify one or more data items to be collected at a tracepoint.\n\
c906108c
SS
4993Accepts a comma-separated list of (one or more) expressions. GDB will\n\
4994collect all data (variables, registers) referenced by that expression.\n\
4995Also accepts the following special arguments:\n\
4996 $regs -- all registers.\n\
4997 $args -- all function arguments.\n\
4998 $locals -- all variables local to the block/function scope.\n\
0fb4aa4b 4999 $_sdata -- static tracepoint data (ignored for non-static tracepoints).\n\
1bedd215 5000Note: this command can only be used in a tracepoint \"actions\" list."));
c906108c 5001
6da95a67
SS
5002 add_com ("teval", class_trace, teval_pseudocommand, _("\
5003Specify one or more expressions to be evaluated at a tracepoint.\n\
5004Accepts a comma-separated list of (one or more) expressions.\n\
5005The result of each evaluation will be discarded.\n\
5006Note: this command can only be used in a tracepoint \"actions\" list."));
5007
1bedd215
AC
5008 add_com ("actions", class_trace, trace_actions_command, _("\
5009Specify the actions to be taken at a tracepoint.\n\
cce7e648
PA
5010Tracepoint actions may include collecting of specified data,\n\
5011single-stepping, or enabling/disabling other tracepoints,\n\
1bedd215 5012depending on target's capabilities."));
c906108c 5013
236f1d4d
SS
5014 default_collect = xstrdup ("");
5015 add_setshow_string_cmd ("default-collect", class_trace,
5016 &default_collect, _("\
5017Set the list of expressions to collect by default"), _("\
5018Show the list of expressions to collect by default"), NULL,
5019 NULL, NULL,
5020 &setlist, &showlist);
5021
d5551862
SS
5022 add_setshow_boolean_cmd ("disconnected-tracing", no_class,
5023 &disconnected_tracing, _("\
5024Set whether tracing continues after GDB disconnects."), _("\
5025Show whether tracing continues after GDB disconnects."), _("\
5026Use this to continue a tracing run even if GDB disconnects\n\
5027or detaches from the target. You can reconnect later and look at\n\
5028trace data collected in the meantime."),
5029 set_disconnected_tracing,
5030 NULL,
5031 &setlist,
5032 &showlist);
00bf0b85 5033
4daf5ac0
SS
5034 add_setshow_boolean_cmd ("circular-trace-buffer", no_class,
5035 &circular_trace_buffer, _("\
5036Set target's use of circular trace buffer."), _("\
5037Show target's use of circular trace buffer."), _("\
5038Use this to make the trace buffer into a circular buffer,\n\
5039which will discard traceframes (oldest first) instead of filling\n\
5040up and stopping the trace run."),
5041 set_circular_trace_buffer,
5042 NULL,
5043 &setlist,
5044 &showlist);
5045
00bf0b85
SS
5046 init_tfile_ops ();
5047
5048 add_target (&tfile_ops);
c906108c 5049}
This page took 1.812011 seconds and 4 git commands to generate.