This is the mail archive of the
gdb-patches@sources.redhat.com
mailing list for the GDB project.
Re: STEP_SKIPS_DELAY question, sort of
- From: Orjan Friberg <orjan dot friberg at axis dot com>
- To: Andrew Cagney <cagney at gnu dot org>
- Cc: gdb-patches at sources dot redhat dot com
- Date: Mon, 07 Jun 2004 15:09:45 +0200
- Subject: Re: STEP_SKIPS_DELAY question, sort of
- Organization: Axis Communications
- References: <40AE38D0.7010204@axis.com> <40AE659A.90207@gnu.org> <40B1BD1B.4090300@axis.com> <40B23BB2.6070001@gnu.org> <40B33399.3090803@axis.com> <40B3B742.50007@gnu.org> <40B465E7.7050702@axis.com> <40C45B95.9050309@axis.com> <40C46290.9000402@axis.com>
Orjan Friberg wrote:
Gah. Please ignore the previous patch (and sorry); what I posted only
works when doing a continue when stopped at the branch instruction.
Doing a step (which leaves us in the delay slot) followed by another
step (or continue for that matter) prematurely inserts the breakpoint.
Ok, second try (still concept patch though): the change in proceed is needed for
when we resume from the delay slot - in that case we need to single-step again
before re-inserting the breakpoint (similar to the MIPS case). The change in
handle_inferior_event (and I'll happily agree it's far more questionable) is
needed for when we resume at the branch instruction itself. Comments?
Index: infrun.c
===================================================================
RCS file: /cvs/src/src/gdb/infrun.c,v
retrieving revision 1.156
diff -u -p -r1.156 infrun.c
--- infrun.c 11 May 2004 23:30:31 -0000 1.156
+++ infrun.c 7 Jun 2004 12:59:10 -0000
@@ -748,6 +748,14 @@ proceed (CORE_ADDR addr, enum target_sig
&& breakpoint_here_p (read_pc () + 4)
&& STEP_SKIPS_DELAY (read_pc ()))
oneproc = 1;
+
+ /* If we stepped into a delay slot, and the preceding instruction
+ will be re-executed when resuming, step again before re-inserting
+ the breakpoint. */
+ if (STEP_SKIPS_IN_DELAY_P
+ && breakpoint_here_p (read_pc () - 2)
+ && STEP_SKIPS_IN_DELAY (read_pc ()))
+ oneproc = 1;
}
else
{
@@ -1975,7 +1983,17 @@ handle_inferior_event (struct execution_
/* Don't even think about breakpoints if just proceeded over a
breakpoint. */
if (stop_signal == TARGET_SIGNAL_TRAP && trap_expected)
- bpstat_clear (&stop_bpstat);
+ {
+ bpstat_clear (&stop_bpstat);
+
+ /* If we stepped into a delay slot, and the preceding instruction
+ will be re-executed when resuming, step again before re-inserting
+ the breakpoint. */
+ if (STEP_SKIPS_IN_DELAY_P
+ && breakpoint_here_p (read_pc () - 2)
+ && STEP_SKIPS_IN_DELAY (read_pc ()))
+ ecs->another_trap = 1;
+ }
else
{
/* See if there is a breakpoint at the current PC. */
--
Orjan Friberg
Axis Communications