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