aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog29
-rw-r--r--gdb/Makefile.in1
-rw-r--r--gdb/aarch64-tdep.h1
-rw-r--r--gdb/displaced-stepping.c52
-rw-r--r--gdb/displaced-stepping.h84
-rw-r--r--gdb/gdbarch.h1
-rwxr-xr-xgdb/gdbarch.sh1
-rw-r--r--gdb/inferior.h1
-rw-r--r--gdb/infrun.c22
-rw-r--r--gdb/infrun.h78
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 */