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