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