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