gdb: move displaced stepping types to displaced-stepping.{h,c}
Move displaced-stepping related stuff unchanged to displaced-stepping.h and displaced-stepping.c. This helps make the following patch a bit smaller and easier to read. gdb/ChangeLog: * 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". Change-Id: I29935f5959b80425370630a45148fc06cd4227ca
This commit is contained in:
parent
94b24c74e8
commit
c7acb87bc6
10 changed files with 170 additions and 100 deletions
|
@ -1,3 +1,32 @@
|
||||||
|
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>
|
2020-12-04 Simon Marchi <simon.marchi@efficios.com>
|
||||||
|
|
||||||
* linux-tdep.c (get_linux_inferior_data): Add inferior
|
* linux-tdep.c (get_linux_inferior_data): Add inferior
|
||||||
|
|
|
@ -1019,6 +1019,7 @@ COMMON_SFILES = \
|
||||||
debuginfod-support.c \
|
debuginfod-support.c \
|
||||||
dictionary.c \
|
dictionary.c \
|
||||||
disasm.c \
|
disasm.c \
|
||||||
|
displaced-stepping.c \
|
||||||
dummy-frame.c \
|
dummy-frame.c \
|
||||||
dwarf2/abbrev.c \
|
dwarf2/abbrev.c \
|
||||||
dwarf2/attribute.c \
|
dwarf2/attribute.c \
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#define AARCH64_TDEP_H
|
#define AARCH64_TDEP_H
|
||||||
|
|
||||||
#include "arch/aarch64.h"
|
#include "arch/aarch64.h"
|
||||||
|
#include "displaced-stepping.h"
|
||||||
#include "infrun.h"
|
#include "infrun.h"
|
||||||
|
|
||||||
/* Forward declarations. */
|
/* Forward declarations. */
|
||||||
|
|
52
gdb/displaced-stepping.c
Normal file
52
gdb/displaced-stepping.c
Normal file
|
@ -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);
|
||||||
|
}
|
|
@ -20,6 +20,24 @@
|
||||||
#ifndef DISPLACED_STEPPING_H
|
#ifndef DISPLACED_STEPPING_H
|
||||||
#define 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
|
enum displaced_step_prepare_status
|
||||||
{
|
{
|
||||||
/* A displaced stepping buffer was successfully allocated and prepared. */
|
/* A displaced stepping buffer was successfully allocated and prepared. */
|
||||||
|
@ -44,4 +62,70 @@ enum displaced_step_finish_status
|
||||||
DISPLACED_STEP_FINISH_STATUS_NOT_EXECUTED,
|
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 */
|
#endif /* DISPLACED_STEPPING_H */
|
||||||
|
|
|
@ -31,6 +31,7 @@
|
||||||
#include "gdb_obstack.h"
|
#include "gdb_obstack.h"
|
||||||
#include "infrun.h"
|
#include "infrun.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
|
#include "displaced-stepping.h"
|
||||||
|
|
||||||
struct floatformat;
|
struct floatformat;
|
||||||
struct ui_file;
|
struct ui_file;
|
||||||
|
|
|
@ -1270,6 +1270,7 @@ cat <<EOF
|
||||||
#include "gdb_obstack.h"
|
#include "gdb_obstack.h"
|
||||||
#include "infrun.h"
|
#include "infrun.h"
|
||||||
#include "osabi.h"
|
#include "osabi.h"
|
||||||
|
#include "displaced-stepping.h"
|
||||||
|
|
||||||
struct floatformat;
|
struct floatformat;
|
||||||
struct ui_file;
|
struct ui_file;
|
||||||
|
|
|
@ -60,6 +60,7 @@ struct thread_info;
|
||||||
#include "gdbthread.h"
|
#include "gdbthread.h"
|
||||||
|
|
||||||
#include "process-stratum-target.h"
|
#include "process-stratum-target.h"
|
||||||
|
#include "displaced-stepping.h"
|
||||||
|
|
||||||
struct infcall_suspend_state;
|
struct infcall_suspend_state;
|
||||||
struct infcall_control_state;
|
struct infcall_control_state;
|
||||||
|
|
22
gdb/infrun.c
22
gdb/infrun.c
|
@ -153,14 +153,6 @@ static ptid_t previous_inferior_ptid;
|
||||||
|
|
||||||
static bool detach_fork = true;
|
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;
|
unsigned int debug_infrun = 0;
|
||||||
static void
|
static void
|
||||||
show_debug_infrun (struct ui_file *file, int from_tty,
|
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 operation on it. See displaced_step_prepare and
|
||||||
displaced_step_finish for details. */
|
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
|
/* Returns true if any inferior has a thread doing a displaced
|
||||||
step. */
|
step. */
|
||||||
|
|
||||||
|
@ -9297,15 +9284,6 @@ When non-zero, inferior specific debugging is enabled."),
|
||||||
show_debug_infrun,
|
show_debug_infrun,
|
||||||
&setdebuglist, &showdebuglist);
|
&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,
|
add_setshow_boolean_cmd ("non-stop", no_class,
|
||||||
&non_stop_1, _("\
|
&non_stop_1, _("\
|
||||||
Set whether gdb controls the inferior in non-stop mode."), _("\
|
Set whether gdb controls the inferior in non-stop mode."), _("\
|
||||||
|
|
78
gdb/infrun.h
78
gdb/infrun.h
|
@ -41,19 +41,6 @@ extern unsigned int debug_infrun;
|
||||||
} \
|
} \
|
||||||
while (0)
|
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
|
/* Nonzero if we want to give control to the user when we're notified
|
||||||
of shared library events by the dynamic linker. */
|
of shared library events by the dynamic linker. */
|
||||||
extern int stop_on_solib_events;
|
extern int stop_on_solib_events;
|
||||||
|
@ -280,69 +267,4 @@ extern void all_uis_check_sync_execution_done (void);
|
||||||
started or re-started). */
|
started or re-started). */
|
||||||
extern void all_uis_on_sync_execution_starting (void);
|
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 */
|
#endif /* INFRUN_H */
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue