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