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