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