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