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