gdb: add target_ops::supports_displaced_step
[deliverable/binutils-gdb.git] / gdb / tracepoint.h
CommitLineData
c906108c 1/* Data structures associated with tracepoints in GDB.
b811d2c2 2 Copyright (C) 1997-2020 Free Software Foundation, Inc.
c906108c 3
c5aa993b 4 This file is part of GDB.
c906108c 5
c5aa993b
JM
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
a9762ec7 8 the Free Software Foundation; either version 3 of the License, or
c5aa993b 9 (at your option) any later version.
c906108c 10
c5aa993b
JM
11 This program is distributed in the hope that it will be useful,
12 but WITHOUT ANY WARRANTY; without even the implied warranty of
13 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 GNU General Public License for more details.
c906108c 15
c5aa993b 16 You should have received a copy of the GNU General Public License
a9762ec7 17 along with this program. If not, see <http://www.gnu.org/licenses/>. */
c906108c
SS
18
19#if !defined (TRACEPOINT_H)
20#define TRACEPOINT_H 1
21
f197e0f1 22#include "breakpoint.h"
2a7498d8 23#include "memrange.h"
268a13a5 24#include "gdbsupport/gdb_vecs.h"
f197e0f1 25
1f45808e
PA
26#include <vector>
27#include <string>
28
393fd4c3
YQ
29/* An object describing the contents of a traceframe. */
30
31struct traceframe_info
32{
33 /* Collected memory. */
4cdd21a8 34 std::vector<mem_range> memory;
28a93511
YQ
35
36 /* Collected trace state variables. */
d0d292a2 37 std::vector<int> tvars;
393fd4c3
YQ
38};
39
2098b393
SM
40typedef std::unique_ptr<traceframe_info> traceframe_info_up;
41
f61e138d 42/* A trace state variable is a value managed by a target being
c378eb4e 43 traced. A trace state variable (or tsv for short) can be accessed
f61e138d
SS
44 and assigned to by tracepoint actions and conditionals, but is not
45 part of the program being traced, and it doesn't have to be
c378eb4e 46 collected. Effectively the variables are scratch space for
f61e138d
SS
47 tracepoints. */
48
49struct trace_state_variable
c252925c
SM
50{
51 trace_state_variable (std::string &&name_, int number_)
52 : name (name_), number (number_)
53 {}
54
55 /* The variable's name. The user has to prefix with a dollar sign,
56 but we don't store that internally. */
57 std::string name;
f61e138d 58
c252925c
SM
59 /* An id number assigned by GDB, and transmitted to targets. */
60 int number = 0;
f61e138d 61
c252925c
SM
62 /* The initial value of a variable is a 64-bit signed integer. */
63 LONGEST initial_value = 0;
f61e138d 64
c252925c
SM
65 /* 1 if the value is known, else 0. The value is known during a
66 trace run, or in tfind mode if the variable was collected into
67 the current trace frame. */
68 int value_known = 0;
f61e138d 69
c252925c
SM
70 /* The value of a variable is a 64-bit signed integer. */
71 LONGEST value = 0;
00bf0b85 72
c252925c
SM
73 /* This is true for variables that are predefined and built into
74 the target. */
75 int builtin = 0;
76 };
00bf0b85
SS
77
78/* The trace status encompasses various info about the general state
79 of the tracing run. */
80
81enum trace_stop_reason
82 {
83 trace_stop_reason_unknown,
84 trace_never_run,
e5a873b7 85 trace_stop_command,
00bf0b85
SS
86 trace_buffer_full,
87 trace_disconnected,
6c28cbf2
SS
88 tracepoint_passcount,
89 tracepoint_error
f61e138d
SS
90 };
91
00bf0b85
SS
92struct trace_status
93{
f5911ea1
HAQ
94 /* If the status is coming from a file rather than a live target,
95 this points at the file's filename. Otherwise, this is NULL. */
96 const char *filename;
00bf0b85
SS
97
98 /* This is true if the value of the running field is known. */
99 int running_known;
100
f196051f 101 /* This is true when the trace experiment is actually running. */
00bf0b85
SS
102 int running;
103
104 enum trace_stop_reason stop_reason;
105
6c28cbf2
SS
106 /* If stop_reason is tracepoint_passcount or tracepoint_error, this
107 is the (on-target) number of the tracepoint which caused the
108 stop. */
00bf0b85
SS
109 int stopping_tracepoint;
110
f196051f
SS
111 /* If stop_reason is tstop_command or tracepoint_error, this is an
112 arbitrary string that may describe the reason for the stop in
113 more detail. */
114
115 char *stop_desc;
6c28cbf2 116
4daf5ac0
SS
117 /* Number of traceframes currently in the buffer. */
118
00bf0b85
SS
119 int traceframe_count;
120
4daf5ac0
SS
121 /* Number of traceframes created since start of run. */
122
123 int traceframes_created;
124
125 /* Total size of the target's trace buffer. */
126
127 int buffer_size;
128
129 /* Unused bytes left in the target's trace buffer. */
00bf0b85 130
4daf5ac0 131 int buffer_free;
33da3f1c
SS
132
133 /* 1 if the target will continue tracing after disconnection, else
134 0. If the target does not report a value, assume 0. */
135
136 int disconnected_tracing;
137
138 /* 1 if the target is using a circular trace buffer, else 0. If the
139 target does not report a value, assume 0. */
140
141 int circular_buffer;
f196051f
SS
142
143 /* The "name" of the person running the trace. This is an
144 arbitrary string. */
145
146 char *user_name;
147
148 /* "Notes" about the trace. This is an arbitrary string not
149 interpreted by GDBserver in any special way. */
150
151 char *notes;
152
153 /* The calendar times at which the trace run started and stopped,
154 both expressed in microseconds of Unix time. */
155
156 LONGEST start_time;
157 LONGEST stop_time;
00bf0b85
SS
158};
159
160struct trace_status *current_trace_status (void);
c906108c 161
35b1e5cc
SS
162extern char *default_collect;
163
393fd4c3
YQ
164extern int trace_regblock_size;
165
7951c4eb
YQ
166extern const char *stop_reason_names[];
167
00bf0b85
SS
168/* Struct to collect random info about tracepoints on the target. */
169
409873ef
SS
170struct uploaded_tp
171{
a18ba4e4
SM
172 int number = 0;
173 enum bptype type = bp_none;
174 ULONGEST addr = 0;
175 int enabled = 0;
176 int step = 0;
177 int pass = 0;
178 int orig_size = 0;
3149d8c1
SS
179
180 /* String that is the encoded form of the tracepoint's condition. */
67aa1f3c 181 gdb::unique_xmalloc_ptr<char[]> cond;
3149d8c1 182
3e43a32a
MS
183 /* Vectors of strings that are the encoded forms of a tracepoint's
184 actions. */
67aa1f3c
PA
185 std::vector<gdb::unique_xmalloc_ptr<char[]>> actions;
186 std::vector<gdb::unique_xmalloc_ptr<char[]>> step_actions;
409873ef
SS
187
188 /* The original string defining the location of the tracepoint. */
67aa1f3c 189 gdb::unique_xmalloc_ptr<char[]> at_string;
409873ef
SS
190
191 /* The original string defining the tracepoint's condition. */
67aa1f3c 192 gdb::unique_xmalloc_ptr<char[]> cond_string;
409873ef
SS
193
194 /* List of original strings defining the tracepoint's actions. */
67aa1f3c 195 std::vector<gdb::unique_xmalloc_ptr<char[]>> cmd_strings;
409873ef 196
f196051f 197 /* The tracepoint's current hit count. */
a18ba4e4 198 int hit_count = 0;
f196051f
SS
199
200 /* The tracepoint's current traceframe usage. */
a18ba4e4 201 ULONGEST traceframe_usage = 0;
f196051f 202
a18ba4e4 203 struct uploaded_tp *next = nullptr;
00bf0b85
SS
204};
205
206/* Struct recording info about trace state variables on the target. */
207
409873ef
SS
208struct uploaded_tsv
209{
00bf0b85
SS
210 const char *name;
211 int number;
212 LONGEST initial_value;
213 int builtin;
214 struct uploaded_tsv *next;
215};
216
0fb4aa4b
PA
217/* Struct recording info about a target static tracepoint marker. */
218
219struct static_tracepoint_marker
220{
5d9310c4
SM
221 DISABLE_COPY_AND_ASSIGN (static_tracepoint_marker);
222
223 static_tracepoint_marker () = default;
224 static_tracepoint_marker (static_tracepoint_marker &&) = default;
225 static_tracepoint_marker &operator= (static_tracepoint_marker &&) = default;
226
227 struct gdbarch *gdbarch = NULL;
228 CORE_ADDR address = 0;
0fb4aa4b
PA
229
230 /* The string ID of the marker. */
5d9310c4 231 std::string str_id;
0fb4aa4b
PA
232
233 /* Extra target reported info associated with the marker. */
5d9310c4 234 std::string extra;
0fb4aa4b
PA
235};
236
dc673c81
YQ
237struct memrange
238{
1f45808e
PA
239 memrange (int type_, bfd_signed_vma start_, bfd_signed_vma end_)
240 : type (type_), start (start_), end (end_)
241 {}
242
243 memrange ()
244 {}
245
dc673c81
YQ
246 /* memrange_absolute for absolute memory range, else basereg
247 number. */
248 int type;
249 bfd_signed_vma start;
250 bfd_signed_vma end;
251};
252
1f45808e 253class collection_list
dc673c81 254{
1f45808e
PA
255public:
256 collection_list ();
1f45808e
PA
257
258 void add_wholly_collected (const char *print_name);
259
260 void append_exp (struct expression *exp);
261
833177a4
PA
262 /* Add AEXPR to the list, taking ownership. */
263 void add_aexpr (agent_expr_up aexpr);
264
4277c4b8
PFC
265 void add_remote_register (unsigned int regno);
266 void add_ax_registers (struct agent_expr *aexpr);
267 void add_local_register (struct gdbarch *gdbarch,
268 unsigned int regno,
269 CORE_ADDR scope);
19f1935d
PA
270 void add_memrange (struct gdbarch *gdbarch,
271 int type, bfd_signed_vma base,
4277c4b8 272 unsigned long len, CORE_ADDR scope);
1f45808e
PA
273 void collect_symbol (struct symbol *sym,
274 struct gdbarch *gdbarch,
275 long frame_regno, long frame_offset,
276 CORE_ADDR scope,
277 int trace_string);
278
279 void add_local_symbols (struct gdbarch *gdbarch, CORE_ADDR pc,
280 long frame_regno, long frame_offset, int type,
281 int trace_string);
282 void add_static_trace_data ();
283
284 void finish ();
285
b44ec619 286 std::vector<std::string> stringify ();
1f45808e
PA
287
288 const std::vector<std::string> &wholly_collected ()
289 { return m_wholly_collected; }
290
291 const std::vector<std::string> &computed ()
292 { return m_computed; }
293
294private:
a04b9d62
PFC
295 /* We need the allocator zero-initialize the mask, so we don't use
296 gdb::byte_vector. */
297 std::vector<unsigned char> m_regs_mask;
1f45808e
PA
298
299 std::vector<memrange> m_memranges;
dc673c81 300
6c73cd95 301 std::vector<agent_expr_up> m_aexprs;
dc673c81
YQ
302
303 /* True is the user requested a collection of "$_sdata", "static
304 tracepoint data". */
1f45808e 305 bool m_strace_data;
dc673c81
YQ
306
307 /* A set of names of wholly collected objects. */
1f45808e 308 std::vector<std::string> m_wholly_collected;
dc673c81 309 /* A set of computed expressions. */
1f45808e 310 std::vector<std::string> m_computed;
dc673c81
YQ
311};
312
5d9310c4
SM
313extern void
314 parse_static_tracepoint_marker_definition (const char *line, const char **pp,
315 static_tracepoint_marker *marker);
0fb4aa4b 316
d183932d 317/* A hook used to notify the UI of tracepoint operations. */
c906108c 318
98c5b216
TT
319extern void (*deprecated_trace_find_hook) (char *arg, int from_tty);
320extern void (*deprecated_trace_start_stop_hook) (int start, int from_tty);
c906108c 321
e6e4e701
PA
322/* Returns the current traceframe number. */
323extern int get_traceframe_number (void);
324
393fd4c3
YQ
325/* Returns the tracepoint number for current traceframe. */
326extern int get_tracepoint_number (void);
327
e6e4e701
PA
328/* Make the traceframe NUM be the current trace frame, all the way to
329 the target, and flushes all global state (register/frame caches,
330 etc.). */
331extern void set_current_traceframe (int num);
332
6f14adc5
SM
333struct scoped_restore_current_traceframe
334{
335 scoped_restore_current_traceframe ();
336
337 ~scoped_restore_current_traceframe ()
338 {
339 set_current_traceframe (m_traceframe_number);
340 }
341
342 DISABLE_COPY_AND_ASSIGN (scoped_restore_current_traceframe);
343
344private:
345
346 /* The traceframe we were inspecting. */
347 int m_traceframe_number;
348};
06cd862c 349
1042e4c0 350void free_actions (struct breakpoint *);
3065dfb6 351
92bc6a20 352extern const char *decode_agent_options (const char *exp, int *trace_string);
3065dfb6 353
1f45808e
PA
354extern void encode_actions (struct bp_location *tloc,
355 struct collection_list *tracepoint_list,
356 struct collection_list *stepping_list);
dc673c81
YQ
357
358extern void encode_actions_rsp (struct bp_location *tloc,
b44ec619
SM
359 std::vector<std::string> *tdp_actions,
360 std::vector<std::string> *stepping_actions);
5fbce5df 361
6f937416 362extern void validate_actionline (const char *, struct breakpoint *);
1773c82c 363extern void validate_trace_state_variable_name (const char *name);
c906108c 364
f61e138d 365extern struct trace_state_variable *find_trace_state_variable (const char *name);
dc673c81
YQ
366extern struct trace_state_variable *
367 find_trace_state_variable_by_number (int number);
368
40e1c229 369extern struct trace_state_variable *create_trace_state_variable (const char *name);
f61e138d 370
409873ef 371extern int encode_source_string (int num, ULONGEST addr,
a121b7c1 372 const char *srctype, const char *src,
409873ef
SS
373 char *buf, int buf_size);
374
256642e8 375extern void parse_trace_status (const char *line, struct trace_status *ts);
00bf0b85 376
256642e8 377extern void parse_tracepoint_status (const char *p, struct breakpoint *tp,
f196051f
SS
378 struct uploaded_tp *utp);
379
256642e8 380extern void parse_tracepoint_definition (const char *line,
3e43a32a 381 struct uploaded_tp **utpp);
256642e8 382extern void parse_tsv_definition (const char *line, struct uploaded_tsv **utsvp);
00bf0b85
SS
383
384extern struct uploaded_tp *get_uploaded_tp (int num, ULONGEST addr,
385 struct uploaded_tp **utpp);
7951c4eb
YQ
386extern void free_uploaded_tps (struct uploaded_tp **utpp);
387
393fd4c3
YQ
388extern struct uploaded_tsv *get_uploaded_tsv (int num,
389 struct uploaded_tsv **utsvp);
7951c4eb 390extern void free_uploaded_tsvs (struct uploaded_tsv **utsvp);
d9b3f62e 391extern struct tracepoint *create_tracepoint_from_upload (struct uploaded_tp *utp);
00bf0b85
SS
392extern void merge_uploaded_tracepoints (struct uploaded_tp **utpp);
393extern void merge_uploaded_trace_state_variables (struct uploaded_tsv **utsvp);
394
2f9d54cf
PA
395extern void query_if_trace_running (int from_tty);
396extern void disconnect_tracing (void);
aef525cb 397extern void trace_reset_local_state (void);
573cda03 398
cc3da688
YQ
399extern void check_trace_running (struct trace_status *);
400
0b39b52e
TT
401extern void start_tracing (const char *notes);
402extern void stop_tracing (const char *notes);
f224b49d
VP
403
404extern void trace_status_mi (int on_stop);
405
40e1c229 406extern void tvariables_info_1 (void);
8bf6485c 407extern void save_trace_state_variables (struct ui_file *fp);
40e1c229 408
2098b393
SM
409/* Enumeration of the kinds of traceframe searches that a target may
410 be able to perform. */
411
412enum trace_find_type
413{
414 tfind_number,
415 tfind_pc,
416 tfind_tp,
417 tfind_range,
418 tfind_outside,
419};
420
f197e0f1 421extern void tfind_1 (enum trace_find_type type, int num,
cc5925ad 422 CORE_ADDR addr1, CORE_ADDR addr2,
f197e0f1
VP
423 int from_tty);
424
3f43bc09
YQ
425extern void trace_save_tfile (const char *filename,
426 int target_does_save);
d0353e76
YQ
427extern void trace_save_ctf (const char *dirname,
428 int target_does_save);
011aacb0 429
2098b393 430extern traceframe_info_up parse_traceframe_info (const char *tframe_info);
b3b9301e 431
a79b1bc6 432extern int traceframe_available_memory (std::vector<mem_range> *result,
2a7498d8
PA
433 CORE_ADDR memaddr, ULONGEST len);
434
dc673c81
YQ
435extern struct traceframe_info *get_traceframe_info (void);
436
437extern struct bp_location *get_traceframe_location (int *stepping_frame_p);
438
8588b356
SM
439/* Command element for the 'while-stepping' command. */
440extern cmd_list_element *while_stepping_cmd_element;
441
d183932d 442#endif /* TRACEPOINT_H */
This page took 2.222122 seconds and 4 git commands to generate.