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