aboutsummaryrefslogtreecommitdiff
path: root/gdb/infrun.c
diff options
context:
space:
mode:
authorJulian Brown <julian@codesourcery.com>2009-07-30 23:01:27 +0000
committerJulian Brown <julian@codesourcery.com>2009-07-30 23:01:27 +0000
commit929dfd4f59cd5f4f3a135325c48d4ad9828aaf0f (patch)
treeea2992f3ef207cc26c9926df694fb3e0e6962054 /gdb/infrun.c
parent96e946ca9ad94b297a1c35bd876f3d7b85250bc0 (diff)
downloadgdb-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.c33
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))