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