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