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