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