diff options
-rw-r--r-- | gdb/ChangeLog | 29 | ||||
-rw-r--r-- | gdb/Makefile.in | 1 | ||||
-rw-r--r-- | gdb/aarch64-tdep.h | 1 | ||||
-rw-r--r-- | gdb/displaced-stepping.c | 52 | ||||
-rw-r--r-- | gdb/displaced-stepping.h | 84 | ||||
-rw-r--r-- | gdb/gdbarch.h | 1 | ||||
-rwxr-xr-x | gdb/gdbarch.sh | 1 | ||||
-rw-r--r-- | gdb/inferior.h | 1 | ||||
-rw-r--r-- | gdb/infrun.c | 22 | ||||
-rw-r--r-- | gdb/infrun.h | 78 |
10 files changed, 170 insertions, 100 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index f1a2922..8512cb4 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,34 @@ 2020-12-04 Simon Marchi <simon.marchi@efficios.com> + * Makefile.in (COMMON_SFILES): Add displaced-stepping.c. + * aarch64-tdep.h: Include displaced-stepping.h. + * displaced-stepping.h (struct displaced_step_copy_insn_closure): + Move here. + (displaced_step_copy_insn_closure_up): Move here. + (struct buf_displaced_step_copy_insn_closure): Move here. + (struct displaced_step_inferior_state): Move here. + (debug_displaced): Move here. + (displaced_debug_printf_1): Move here. + (displaced_debug_printf): Move here. + * displaced-stepping.c: New file. + * gdbarch.sh: Include displaced-stepping.h in gdbarch.h. + * gdbarch.h: Re-generate. + * inferior.h: Include displaced-stepping.h. + * infrun.h (debug_displaced): Move to displaced-stepping.h. + (displaced_debug_printf_1): Likewise. + (displaced_debug_printf): Likewise. + (struct displaced_step_copy_insn_closure): Likewise. + (displaced_step_copy_insn_closure_up): Likewise. + (struct buf_displaced_step_copy_insn_closure): Likewise. + (struct displaced_step_inferior_state): Likewise. + * infrun.c (show_debug_displaced): Move to displaced-stepping.c. + (displaced_debug_printf_1): Likewise. + (displaced_step_copy_insn_closure::~displaced_step_copy_insn_closure): + Likewise. + (_initialize_infrun): Don't register "set/show debug displaced". + +2020-12-04 Simon Marchi <simon.marchi@efficios.com> + * linux-tdep.c (get_linux_inferior_data): Add inferior parameter. (linux_vsyscall_range): Pass current inferior. diff --git a/gdb/Makefile.in b/gdb/Makefile.in index a86e8d6..997c99c 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -1019,6 +1019,7 @@ COMMON_SFILES = \ debuginfod-support.c \ dictionary.c \ disasm.c \ + displaced-stepping.c \ dummy-frame.c \ dwarf2/abbrev.c \ dwarf2/attribute.c \ diff --git a/gdb/aarch64-tdep.h b/gdb/aarch64-tdep.h index 895aa59..76ff812 100644 --- a/gdb/aarch64-tdep.h +++ b/gdb/aarch64-tdep.h @@ -23,6 +23,7 @@ #define AARCH64_TDEP_H #include "arch/aarch64.h" +#include "displaced-stepping.h" #include "infrun.h" /* Forward declarations. */ diff --git a/gdb/displaced-stepping.c b/gdb/displaced-stepping.c new file mode 100644 index 0000000..5ae280f --- /dev/null +++ b/gdb/displaced-stepping.c @@ -0,0 +1,52 @@ +/* Displaced stepping related things. + + Copyright (C) 2020 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "defs.h" +#include "displaced-stepping.h" +#include "cli/cli-cmds.h" + +#include "command.h" + +/* Default destructor for displaced_step_copy_insn_closure. */ + +displaced_step_copy_insn_closure::~displaced_step_copy_insn_closure () + = default; + +bool debug_displaced = false; + +static void +show_debug_displaced (struct ui_file *file, int from_tty, + struct cmd_list_element *c, const char *value) +{ + fprintf_filtered (file, _("Displace stepping debugging is %s.\n"), value); +} + +void _initialize_displaced_stepping (); +void +_initialize_displaced_stepping () +{ + add_setshow_boolean_cmd ("displaced", class_maintenance, + &debug_displaced, _("\ +Set displaced stepping debugging."), _("\ +Show displaced stepping debugging."), _("\ +When non-zero, displaced stepping specific debugging is enabled."), + NULL, + show_debug_displaced, + &setdebuglist, &showdebuglist); +} diff --git a/gdb/displaced-stepping.h b/gdb/displaced-stepping.h index 44aca74..928bfc0 100644 --- a/gdb/displaced-stepping.h +++ b/gdb/displaced-stepping.h @@ -20,6 +20,24 @@ #ifndef DISPLACED_STEPPING_H #define DISPLACED_STEPPING_H +#include "gdbsupport/byte-vector.h" + +struct thread_info; + +/* True if we are debugging displaced stepping. */ + +extern bool debug_displaced; + +/* Print a "displaced" debug statement. */ + +#define displaced_debug_printf(fmt, ...) \ + do \ + { \ + if (debug_displaced) \ + debug_prefixed_printf ("displaced", __func__, fmt, ##__VA_ARGS__); \ + } \ + while (0) + enum displaced_step_prepare_status { /* A displaced stepping buffer was successfully allocated and prepared. */ @@ -44,4 +62,70 @@ enum displaced_step_finish_status DISPLACED_STEP_FINISH_STATUS_NOT_EXECUTED, }; +/* Base class for displaced stepping closures (the arch-specific data). */ + +struct displaced_step_copy_insn_closure +{ + virtual ~displaced_step_copy_insn_closure () = 0; +}; + +using displaced_step_copy_insn_closure_up + = std::unique_ptr<displaced_step_copy_insn_closure>; + +/* A simple displaced step closure that contains only a byte buffer. */ + +struct buf_displaced_step_copy_insn_closure : displaced_step_copy_insn_closure +{ + buf_displaced_step_copy_insn_closure (int buf_size) + : buf (buf_size) + {} + + gdb::byte_vector buf; +}; + +/* Per-inferior displaced stepping state. */ + +struct displaced_step_inferior_state +{ + displaced_step_inferior_state () + { + reset (); + } + + /* Put this object back in its original state. */ + void reset () + { + failed_before = 0; + step_thread = nullptr; + step_gdbarch = nullptr; + step_closure.reset (); + step_original = 0; + step_copy = 0; + step_saved_copy.clear (); + } + + /* True if preparing a displaced step ever failed. If so, we won't + try displaced stepping for this inferior again. */ + int failed_before; + + /* If this is not nullptr, this is the thread carrying out a + displaced single-step in process PID. This thread's state will + require fixing up once it has completed its step. */ + thread_info *step_thread; + + /* The architecture the thread had when we stepped it. */ + gdbarch *step_gdbarch; + + /* The closure provided gdbarch_displaced_step_copy_insn, to be used + for post-step cleanup. */ + displaced_step_copy_insn_closure_up step_closure; + + /* The address of the original instruction, and the copy we + made. */ + CORE_ADDR step_original, step_copy; + + /* Saved contents of copy area. */ + gdb::byte_vector step_saved_copy; +}; + #endif /* DISPLACED_STEPPING_H */ diff --git a/gdb/gdbarch.h b/gdb/gdbarch.h index 4f52e8c..2b6876a 100644 --- a/gdb/gdbarch.h +++ b/gdb/gdbarch.h @@ -31,6 +31,7 @@ #include "gdb_obstack.h" #include "infrun.h" #include "osabi.h" +#include "displaced-stepping.h" struct floatformat; struct ui_file; diff --git a/gdb/gdbarch.sh b/gdb/gdbarch.sh index f67ec9d..76ce2ff 100755 --- a/gdb/gdbarch.sh +++ b/gdb/gdbarch.sh @@ -1270,6 +1270,7 @@ cat <<EOF #include "gdb_obstack.h" #include "infrun.h" #include "osabi.h" +#include "displaced-stepping.h" struct floatformat; struct ui_file; diff --git a/gdb/inferior.h b/gdb/inferior.h index d016161..c5257ac 100644 --- a/gdb/inferior.h +++ b/gdb/inferior.h @@ -60,6 +60,7 @@ struct thread_info; #include "gdbthread.h" #include "process-stratum-target.h" +#include "displaced-stepping.h" struct infcall_suspend_state; struct infcall_control_state; diff --git a/gdb/infrun.c b/gdb/infrun.c index 29bbc20..9ac75ef 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -153,14 +153,6 @@ static ptid_t previous_inferior_ptid; static bool detach_fork = true; -bool debug_displaced = false; -static void -show_debug_displaced (struct ui_file *file, int from_tty, - struct cmd_list_element *c, const char *value) -{ - fprintf_filtered (file, _("Displace stepping debugging is %s.\n"), value); -} - unsigned int debug_infrun = 0; static void show_debug_infrun (struct ui_file *file, int from_tty, @@ -1460,11 +1452,6 @@ step_over_info_valid_p (void) displaced step operation on it. See displaced_step_prepare and displaced_step_finish for details. */ -/* Default destructor for displaced_step_copy_insn_closure. */ - -displaced_step_copy_insn_closure::~displaced_step_copy_insn_closure () - = default; - /* Returns true if any inferior has a thread doing a displaced step. */ @@ -9297,15 +9284,6 @@ When non-zero, inferior specific debugging is enabled."), show_debug_infrun, &setdebuglist, &showdebuglist); - add_setshow_boolean_cmd ("displaced", class_maintenance, - &debug_displaced, _("\ -Set displaced stepping debugging."), _("\ -Show displaced stepping debugging."), _("\ -When non-zero, displaced stepping specific debugging is enabled."), - NULL, - show_debug_displaced, - &setdebuglist, &showdebuglist); - add_setshow_boolean_cmd ("non-stop", no_class, &non_stop_1, _("\ Set whether gdb controls the inferior in non-stop mode."), _("\ diff --git a/gdb/infrun.h b/gdb/infrun.h index a276ddf..c83cb33 100644 --- a/gdb/infrun.h +++ b/gdb/infrun.h @@ -41,19 +41,6 @@ extern unsigned int debug_infrun; } \ while (0) -/* True if we are debugging displaced stepping. */ -extern bool debug_displaced; - -/* Print a "displaced" debug statement. */ - -#define displaced_debug_printf(fmt, ...) \ - do \ - { \ - if (debug_displaced) \ - debug_prefixed_printf ("displaced", __func__, fmt, ##__VA_ARGS__); \ - } \ - while (0) - /* Nonzero if we want to give control to the user when we're notified of shared library events by the dynamic linker. */ extern int stop_on_solib_events; @@ -280,69 +267,4 @@ extern void all_uis_check_sync_execution_done (void); started or re-started). */ extern void all_uis_on_sync_execution_starting (void); -/* Base class for displaced stepping closures (the arch-specific data). */ - -struct displaced_step_copy_insn_closure -{ - virtual ~displaced_step_copy_insn_closure () = 0; -}; - -using displaced_step_copy_insn_closure_up - = std::unique_ptr<displaced_step_copy_insn_closure>; - -/* A simple displaced step closure that contains only a byte buffer. */ - -struct buf_displaced_step_copy_insn_closure : displaced_step_copy_insn_closure -{ - buf_displaced_step_copy_insn_closure (int buf_size) - : buf (buf_size) - {} - - gdb::byte_vector buf; -}; - -/* Per-inferior displaced stepping state. */ -struct displaced_step_inferior_state -{ - displaced_step_inferior_state () - { - reset (); - } - - /* Put this object back in its original state. */ - void reset () - { - failed_before = 0; - step_thread = nullptr; - step_gdbarch = nullptr; - step_closure.reset (); - step_original = 0; - step_copy = 0; - step_saved_copy.clear (); - } - - /* True if preparing a displaced step ever failed. If so, we won't - try displaced stepping for this inferior again. */ - int failed_before; - - /* If this is not nullptr, this is the thread carrying out a - displaced single-step in process PID. This thread's state will - require fixing up once it has completed its step. */ - thread_info *step_thread; - - /* The architecture the thread had when we stepped it. */ - gdbarch *step_gdbarch; - - /* The closure provided gdbarch_displaced_step_copy_insn, to be used - for post-step cleanup. */ - displaced_step_copy_insn_closure_up step_closure; - - /* The address of the original instruction, and the copy we - made. */ - CORE_ADDR step_original, step_copy; - - /* Saved contents of copy area. */ - gdb::byte_vector step_saved_copy; -}; - #endif /* INFRUN_H */ |