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