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