summaryrefslogtreecommitdiff
path: root/gdb/linux-nat.c
diff options
context:
space:
mode:
Diffstat (limited to 'gdb/linux-nat.c')
-rw-r--r--gdb/linux-nat.c23
1 files changed, 22 insertions, 1 deletions
diff --git a/gdb/linux-nat.c b/gdb/linux-nat.c
index b63f863e563..2f4c62153cb 100644
--- a/gdb/linux-nat.c
+++ b/gdb/linux-nat.c
@@ -514,7 +514,9 @@ my_waitpid_record (int pid, int *status, int flags)
struct bp_location *bl;
struct breakpoint *b;
CORE_ADDR pc;
+ CORE_ADDR decr_pc_after_break;
struct lwp_info *lp;
+ int is_breakpoint = 1;
wait_begin:
ret = my_waitpid (pid, status, flags);
@@ -530,7 +532,7 @@ wait_begin:
if (WIFSTOPPED (*status) && WSTOPSIG (*status) == SIGTRAP)
{
- /* Check if there is a breakpoint */
+ /* Check if there is a breakpoint. */
pc = 0;
registers_changed ();
for (bl = bp_location_chain; bl; bl = bl->global_next)
@@ -602,7 +604,26 @@ wait_begin:
goto wait_begin;
}
+ is_breakpoint = 0;
+
out:
+ /* Add gdbarch_decr_pc_after_break to pc because pc will be break at address
+ add gdbarch_decr_pc_after_break when inferior non-step execute. */
+ if (is_breakpoint)
+ {
+ decr_pc_after_break = gdbarch_decr_pc_after_break
+ (get_regcache_arch (get_thread_regcache (pid_to_ptid (ret))));
+ if (decr_pc_after_break)
+ {
+ if (!pc)
+ {
+ pc = regcache_read_pc (get_thread_regcache (pid_to_ptid (ret)));
+ }
+ regcache_write_pc (get_thread_regcache (pid_to_ptid (ret)),
+ pc + decr_pc_after_break);
+ }
+ }
+
return ret;
}