aboutsummaryrefslogtreecommitdiff
path: root/gdb/displaced-stepping.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/displaced-stepping.c')
-rw-r--r--gdb/displaced-stepping.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/gdb/displaced-stepping.c b/gdb/displaced-stepping.c
index 9f98ea8..3fefdf3 100644
--- a/gdb/displaced-stepping.c
+++ b/gdb/displaced-stepping.c
@@ -192,12 +192,18 @@ write_memory_ptid (ptid_t ptid, CORE_ADDR memaddr,
}
static bool
-displaced_step_instruction_executed_successfully (gdbarch *arch,
- gdb_signal signal)
+displaced_step_instruction_executed_successfully
+ (gdbarch *arch, const target_waitstatus &status)
{
- if (signal != GDB_SIGNAL_TRAP)
+ if (status.kind () == TARGET_WAITKIND_STOPPED
+ && status.sig () != GDB_SIGNAL_TRAP)
return false;
+ /* All other (thread event) waitkinds can only happen if the
+ instruction fully executed. For example, a fork, or a syscall
+ entry can only happen if the syscall instruction actually
+ executed. */
+
if (target_stopped_by_watchpoint ())
{
if (gdbarch_have_nonsteppable_watchpoint (arch)
@@ -210,7 +216,7 @@ displaced_step_instruction_executed_successfully (gdbarch *arch,
displaced_step_finish_status
displaced_step_buffers::finish (gdbarch *arch, thread_info *thread,
- gdb_signal sig)
+ const target_waitstatus &status)
{
gdb_assert (thread->displaced_step_state.in_progress ());
@@ -256,7 +262,7 @@ displaced_step_buffers::finish (gdbarch *arch, thread_info *thread,
regcache *rc = get_thread_regcache (thread);
bool instruction_executed_successfully
- = displaced_step_instruction_executed_successfully (arch, sig);
+ = displaced_step_instruction_executed_successfully (arch, status);
if (instruction_executed_successfully)
{