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