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