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