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