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