diff options
author | Julian Brown <julian@codesourcery.com> | 2009-07-30 23:01:27 +0000 |
---|---|---|
committer | Julian Brown <julian@codesourcery.com> | 2009-07-30 23:01:27 +0000 |
commit | 929dfd4f59cd5f4f3a135325c48d4ad9828aaf0f (patch) | |
tree | ea2992f3ef207cc26c9926df694fb3e0e6962054 /gdb/infrun.c | |
parent | 96e946ca9ad94b297a1c35bd876f3d7b85250bc0 (diff) | |
download | gdb-929dfd4f59cd5f4f3a135325c48d4ad9828aaf0f.zip gdb-929dfd4f59cd5f4f3a135325c48d4ad9828aaf0f.tar.gz gdb-929dfd4f59cd5f4f3a135325c48d4ad9828aaf0f.tar.bz2 |
* infrun.c (displaced_step_fixup): If this is a software
single-stepping arch, don't tell the target to single-step.
(maybe_software_singlestep): Return 0 if we're using displaced
stepping.
(resume): If this is a software single-stepping arch, and
displaced-stepping is enabled, use it for all single-step
requests.
Diffstat (limited to 'gdb/infrun.c')
-rw-r--r-- | gdb/infrun.c | 33 |
1 files changed, 22 insertions, 11 deletions
diff --git a/gdb/infrun.c b/gdb/infrun.c index f817972..0bc9fb3 100644 --- a/gdb/infrun.c +++ b/gdb/infrun.c @@ -964,6 +964,7 @@ displaced_step_fixup (ptid_t event_ptid, enum target_signal signal) struct displaced_step_request *head; ptid_t ptid; struct regcache *regcache; + struct gdbarch *gdbarch; CORE_ADDR actual_pc; head = displaced_step_request_queue; @@ -985,9 +986,11 @@ displaced_step_fixup (ptid_t event_ptid, enum target_signal signal) displaced_step_prepare (ptid); + gdbarch = get_regcache_arch (regcache); + if (debug_displaced) { - struct gdbarch *gdbarch = get_regcache_arch (regcache); + CORE_ADDR actual_pc = regcache_read_pc (regcache); gdb_byte buf[4]; fprintf_unfiltered (gdb_stdlog, "displaced: run %s: ", @@ -996,7 +999,10 @@ displaced_step_fixup (ptid_t event_ptid, enum target_signal signal) displaced_step_dump_bytes (gdb_stdlog, buf, sizeof (buf)); } - target_resume (ptid, 1, TARGET_SIGNAL_0); + if (gdbarch_software_single_step_p (gdbarch)) + target_resume (ptid, 0, TARGET_SIGNAL_0); + else + target_resume (ptid, 1, TARGET_SIGNAL_0); /* Done, we're stepping a thread. */ break; @@ -1105,15 +1111,19 @@ maybe_software_singlestep (struct gdbarch *gdbarch, CORE_ADDR pc) { int hw_step = 1; - if (gdbarch_software_single_step_p (gdbarch) - && gdbarch_software_single_step (gdbarch, get_current_frame ())) + if (gdbarch_software_single_step_p (gdbarch)) { - hw_step = 0; - /* Do not pull these breakpoints until after a `wait' in - `wait_for_inferior' */ - singlestep_breakpoints_inserted_p = 1; - singlestep_ptid = inferior_ptid; - singlestep_pc = pc; + if (use_displaced_stepping (gdbarch)) + hw_step = 0; + else if (gdbarch_software_single_step (gdbarch, get_current_frame ())) + { + hw_step = 0; + /* Do not pull these breakpoints until after a `wait' in + `wait_for_inferior' */ + singlestep_breakpoints_inserted_p = 1; + singlestep_ptid = inferior_ptid; + singlestep_pc = pc; + } } return hw_step; } @@ -1179,7 +1189,8 @@ a command like `return' or `jump' to continue execution.")); comments in the handle_inferior event for dealing with 'random signals' explain what we do instead. */ if (use_displaced_stepping (gdbarch) - && tp->trap_expected + && (tp->trap_expected + || (step && gdbarch_software_single_step_p (gdbarch))) && sig == TARGET_SIGNAL_0) { if (!displaced_step_prepare (inferior_ptid)) |