gdb: rename displaced_step_closure to displaced_step_copy_insn_closure
[deliverable/binutils-gdb.git] / gdb / infrun.h
CommitLineData
b811d2c2 1/* Copyright (C) 1986-2020 Free Software Foundation, Inc.
45741a9c
PA
2
3 This file is part of GDB.
4
5 This program is free software; you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or
8 (at your option) any later version.
9
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY; without even the implied warranty of
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 GNU General Public License for more details.
14
15 You should have received a copy of the GNU General Public License
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */
17
18#ifndef INFRUN_H
19#define INFRUN_H 1
20
45741a9c 21#include "symtab.h"
268a13a5 22#include "gdbsupport/byte-vector.h"
45741a9c
PA
23
24struct target_waitstatus;
25struct frame_info;
26struct address_space;
243a9253 27struct return_value_info;
5b6d1e4f 28struct process_stratum_target;
29734269 29struct thread_info;
45741a9c
PA
30
31/* True if we are debugging run control. */
32extern unsigned int debug_infrun;
33
17417fb0 34/* Print an "infrun" debug statement. */
1eb8556f
SM
35
36#define infrun_debug_printf(fmt, ...) \
4f0469cd
AB
37 do \
38 { \
39 if (debug_infrun) \
40 debug_prefixed_printf ("infrun", __func__, fmt, ##__VA_ARGS__); \
41 } \
42 while (0)
1eb8556f 43
45741a9c 44/* True if we are debugging displaced stepping. */
491144b5 45extern bool debug_displaced;
45741a9c 46
17417fb0 47/* Print a "displaced" debug statement. */
136821d9
SM
48
49#define displaced_debug_printf(fmt, ...) \
4f0469cd
AB
50 do \
51 { \
52 if (debug_displaced) \
53 debug_prefixed_printf ("displaced", __func__, fmt, ##__VA_ARGS__); \
54 } \
55 while (0)
136821d9 56
45741a9c
PA
57/* Nonzero if we want to give control to the user when we're notified
58 of shared library events by the dynamic linker. */
59extern int stop_on_solib_events;
60
45741a9c
PA
61/* True if execution commands resume all threads of all processes by
62 default; otherwise, resume only threads of the current inferior
63 process. */
491144b5 64extern bool sched_multi;
45741a9c
PA
65
66/* When set, stop the 'step' command if we enter a function which has
67 no line number information. The normal behavior is that we step
68 over such function. */
491144b5 69extern bool step_stop_if_no_debug;
45741a9c
PA
70
71/* If set, the inferior should be controlled in non-stop mode. In
72 this mode, each thread is controlled independently. Execution
73 commands apply only to the selected thread by default, and stop
74 events stop only the thread that had the event -- the other threads
75 are kept running freely. */
491144b5 76extern bool non_stop;
45741a9c
PA
77
78/* When set (default), the target should attempt to disable the
79 operating system's address space randomization feature when
80 starting an inferior. */
491144b5 81extern bool disable_randomization;
45741a9c 82
4c2f2a79
PA
83/* Returns a unique identifier for the current stop. This can be used
84 to tell whether a command has proceeded the inferior past the
85 current location. */
86extern ULONGEST get_stop_id (void);
87
45741a9c
PA
88/* Reverse execution. */
89enum exec_direction_kind
90 {
91 EXEC_FORWARD,
92 EXEC_REVERSE
93 };
94
170742de
PA
95/* The current execution direction. */
96extern enum exec_direction_kind execution_direction;
45741a9c 97
45741a9c
PA
98extern void start_remote (int from_tty);
99
70509625
PA
100/* Clear out all variables saying what to do when inferior is
101 continued or stepped. First do this, then set the ones you want,
102 then call `proceed'. STEP indicates whether we're preparing for a
103 step/stepi command. */
104extern void clear_proceed_status (int step);
45741a9c 105
64ce06e4 106extern void proceed (CORE_ADDR, enum gdb_signal);
45741a9c 107
70509625 108/* Return a ptid representing the set of threads that we will proceed,
f3263aa4
PA
109 in the perspective of the user/frontend. We may actually resume
110 fewer threads at first, e.g., if a thread is stopped at a
111 breakpoint that needs stepping-off, but that should not be visible
112 to the user/frontend, and neither should the frontend/user be
113 allowed to proceed any of the threads that happen to be stopped for
114 internal run control handling, if a previous command wanted them
115 resumed. */
45741a9c
PA
116extern ptid_t user_visible_resume_ptid (int step);
117
5b6d1e4f
PA
118/* Return the process_stratum target that we will proceed, in the
119 perspective of the user/frontend. If RESUME_PTID is
120 MINUS_ONE_PTID, then we'll resume all threads of all targets, so
121 the function returns NULL. Otherwise, we'll be resuming a process
122 or thread of the current process, so we return the current
123 inferior's process stratum target. */
124extern process_stratum_target *user_visible_resume_target (ptid_t resume_ptid);
45741a9c 125
4c2f2a79
PA
126/* Return control to GDB when the inferior stops for real. Print
127 appropriate messages, remove breakpoints, give terminal our modes,
128 and run the stop hook. Returns true if the stop hook proceeded the
129 target, false otherwise. */
130extern int normal_stop (void);
45741a9c 131
5b6d1e4f 132/* Return the cached copy of the last target/ptid/waitstatus returned
ab1ddbcf
PA
133 by target_wait()/deprecated_target_wait_hook(). The data is
134 actually cached by handle_inferior_event(), which gets called
135 immediately after target_wait()/deprecated_target_wait_hook(). */
5b6d1e4f
PA
136extern void get_last_target_status (process_stratum_target **target,
137 ptid_t *ptid,
45741a9c
PA
138 struct target_waitstatus *status);
139
5b6d1e4f
PA
140/* Set the cached copy of the last target/ptid/waitstatus. */
141extern void set_last_target_status (process_stratum_target *target, ptid_t ptid,
6efcd9a8
PA
142 struct target_waitstatus status);
143
ab1ddbcf
PA
144/* Clear the cached copy of the last ptid/waitstatus returned by
145 target_wait(). */
146extern void nullify_last_target_wait_ptid ();
147
6efcd9a8
PA
148/* Stop all threads. Only returns after everything is halted. */
149extern void stop_all_threads (void);
150
45741a9c
PA
151extern void prepare_for_detach (void);
152
b1a35af2 153extern void fetch_inferior_event ();
45741a9c
PA
154
155extern void init_wait_for_inferior (void);
156
157extern void insert_step_resume_breakpoint_at_sal (struct gdbarch *,
158 struct symtab_and_line ,
159 struct frame_id);
160
45741a9c
PA
161/* Returns true if we're trying to step past the instruction at
162 ADDRESS in ASPACE. */
163extern int stepping_past_instruction_at (struct address_space *aspace,
164 CORE_ADDR address);
165
21edc42f
YQ
166/* Returns true if thread whose thread number is THREAD is stepping
167 over a breakpoint. */
168extern int thread_is_stepping_over_breakpoint (int thread);
169
963f9c80
PA
170/* Returns true if we're trying to step past an instruction that
171 triggers a non-steppable watchpoint. */
172extern int stepping_past_nonsteppable_watchpoint (void);
173
29734269
SM
174/* Record in TP the frame and location we're currently stepping through. */
175extern void set_step_info (thread_info *tp,
176 struct frame_info *frame,
45741a9c
PA
177 struct symtab_and_line sal);
178
fd664c91
PA
179/* Several print_*_reason helper functions to print why the inferior
180 has stopped to the passed in UIOUT. */
181
182/* Signal received, print why the inferior has stopped. */
183extern void print_signal_received_reason (struct ui_out *uiout,
184 enum gdb_signal siggnal);
185
186/* Print why the inferior has stopped. We are done with a
187 step/next/si/ni command, print why the inferior has stopped. */
188extern void print_end_stepping_range_reason (struct ui_out *uiout);
189
190/* The inferior was terminated by a signal, print why it stopped. */
191extern void print_signal_exited_reason (struct ui_out *uiout,
192 enum gdb_signal siggnal);
193
194/* The inferior program is finished, print why it stopped. */
195extern void print_exited_reason (struct ui_out *uiout, int exitstatus);
196
197/* Reverse execution: target ran out of history info, print why the
198 inferior has stopped. */
199extern void print_no_history_reason (struct ui_out *uiout);
200
243a9253
PA
201/* Print the result of a function at the end of a 'finish' command.
202 RV points at an object representing the captured return value/type
203 and its position in the value history. */
204
205extern void print_return_value (struct ui_out *uiout,
206 struct return_value_info *rv);
207
208/* Print current location without a level number, if we have changed
209 functions or hit a breakpoint. Print source line if we have one.
4c7d57e7
TT
210 If the execution command captured a return value, print it. If
211 DISPLAYS is false, do not call 'do_displays'. */
243a9253 212
4c7d57e7 213extern void print_stop_event (struct ui_out *uiout, bool displays = true);
45741a9c 214
221e1a37
PA
215/* Pretty print the results of target_wait, for debugging purposes. */
216
217extern void print_target_wait_results (ptid_t waiton_ptid, ptid_t result_ptid,
218 const struct target_waitstatus *ws);
219
45741a9c
PA
220extern int signal_stop_state (int);
221
222extern int signal_print_state (int);
223
224extern int signal_pass_state (int);
225
226extern int signal_stop_update (int, int);
227
228extern int signal_print_update (int, int);
229
230extern int signal_pass_update (int, int);
231
232extern void update_signals_program_target (void);
233
234/* Clear the convenience variables associated with the exit of the
235 inferior. Currently, those variables are $_exitcode and
236 $_exitsignal. */
237extern void clear_exit_convenience_vars (void);
238
136821d9
SM
239/* Dump LEN bytes at BUF in hex to a string and return it. */
240extern std::string displaced_step_dump_bytes (const gdb_byte *buf, size_t len);
45741a9c 241
1152d984
SM
242extern struct displaced_step_copy_insn_closure *
243 get_displaced_step_copy_insn_closure_by_addr (CORE_ADDR addr);
45741a9c
PA
244
245extern void update_observer_mode (void);
246
247extern void signal_catch_update (const unsigned int *);
248
249/* In some circumstances we allow a command to specify a numeric
250 signal. The idea is to keep these circumstances limited so that
251 users (and scripts) develop portable habits. For comparison,
252 POSIX.2 `kill' requires that 1,2,3,6,9,14, and 15 work (and using a
253 numeric signal at all is obsolescent. We are slightly more lenient
254 and allow 1-15 which should match host signal numbers on most
255 systems. Use of symbolic signal names is strongly encouraged. */
256enum gdb_signal gdb_signal_from_command (int num);
257
372316f1
PA
258/* Enables/disables infrun's async event source in the event loop. */
259extern void infrun_async (int enable);
260
0b333c5e
PA
261/* Call infrun's event handler the next time through the event
262 loop. */
263extern void mark_infrun_async_event_handler (void);
264
28d5518b 265/* The global chain of threads that need to do a step-over operation
c2829269 266 to get past e.g., a breakpoint. */
28d5518b 267extern struct thread_info *global_thread_step_over_chain_head;
c2829269 268
388a7084
PA
269/* Remove breakpoints if possible (usually that means, if everything
270 is stopped). On failure, print a message. */
271extern void maybe_remove_breakpoints (void);
272
3b12939d
PA
273/* If a UI was in sync execution mode, and now isn't, restore its
274 prompt (a synchronous execution command has finished, and we're
275 ready for input). */
276extern void all_uis_check_sync_execution_done (void);
277
a8836c93
PA
278/* If a UI was in sync execution mode, and hasn't displayed the prompt
279 yet, re-disable its prompt (a synchronous execution command was
280 started or re-started). */
281extern void all_uis_on_sync_execution_starting (void);
282
cfba9872
SM
283/* Base class for displaced stepping closures (the arch-specific data). */
284
1152d984 285struct displaced_step_copy_insn_closure
cfba9872 286{
1152d984 287 virtual ~displaced_step_copy_insn_closure () = 0;
cfba9872
SM
288};
289
1152d984
SM
290using displaced_step_copy_insn_closure_up
291 = std::unique_ptr<displaced_step_copy_insn_closure>;
fdb61c6c 292
cfba9872
SM
293/* A simple displaced step closure that contains only a byte buffer. */
294
1152d984 295struct buf_displaced_step_copy_insn_closure : displaced_step_copy_insn_closure
cfba9872 296{
1152d984 297 buf_displaced_step_copy_insn_closure (int buf_size)
cfba9872
SM
298 : buf (buf_size)
299 {}
300
301 gdb::byte_vector buf;
302};
303
d20172fc
SM
304/* Per-inferior displaced stepping state. */
305struct displaced_step_inferior_state
306{
307 displaced_step_inferior_state ()
308 {
309 reset ();
310 }
311
312 /* Put this object back in its original state. */
313 void reset ()
314 {
315 failed_before = 0;
316 step_thread = nullptr;
317 step_gdbarch = nullptr;
d8d83535 318 step_closure.reset ();
d20172fc
SM
319 step_original = 0;
320 step_copy = 0;
321 step_saved_copy.clear ();
322 }
323
324 /* True if preparing a displaced step ever failed. If so, we won't
325 try displaced stepping for this inferior again. */
326 int failed_before;
327
328 /* If this is not nullptr, this is the thread carrying out a
329 displaced single-step in process PID. This thread's state will
330 require fixing up once it has completed its step. */
331 thread_info *step_thread;
332
333 /* The architecture the thread had when we stepped it. */
334 gdbarch *step_gdbarch;
335
336 /* The closure provided gdbarch_displaced_step_copy_insn, to be used
337 for post-step cleanup. */
1152d984 338 displaced_step_copy_insn_closure_up step_closure;
d20172fc
SM
339
340 /* The address of the original instruction, and the copy we
341 made. */
342 CORE_ADDR step_original, step_copy;
343
344 /* Saved contents of copy area. */
345 gdb::byte_vector step_saved_copy;
346};
347
45741a9c 348#endif /* INFRUN_H */
This page took 0.580152 seconds and 4 git commands to generate.