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