Re: [RFC] "single step" atomic instruction sequences as a whole on PPC

Ulrich Weigand
2007-05-10T22:58:35Z

Daniel Jacobowitz wrote:
> On Thu, May 10, 2007 at 11:30:53PM +0200, Ulrich Weigand wrote:
> > This looks just like a problem we fixed for the combined debugger;
> > cancel_breakpoints_callback should cancel SIGTRAP events caused by
> > software single-step breakpoints just the same as those caused by
> > other breakpoints.
>
> Maybe it would be more elegant to anticipate the day that single step
> breakpoints are completely normal: make breakpoint_inserted_here_p
> check them? This is already the only caller.

Good point. Something like the patch below? I've also added the
check to software_breakpoint_inserted_here_p; that seemed to make
more sense that not.

(I'm suspicious about adjust_pc_after_break, the only caller of
software_breakpoint_inserted_here_p anyway; I think this may no
longer be correct after the software single-step changes ...)

Bye,
Ulrich

ChangeLog:

* breakpoint.c (single_step_breakpoint_inserted_here_p): New function.
(breakpoint_inserted_here_p): Call it.
(software_breakpoint_inserted_here_p): Likewise.

diff -urNp gdb-orig/gdb/breakpoint.c gdb-head/gdb/breakpoint.c
--- gdb-orig/gdb/breakpoint.c 2007-05-11 00:15:25.160082872 +0200
+++ gdb-head/gdb/breakpoint.c 2007-05-11 00:22:39.846579732 +0200
@@ -202,6 +202,8 @@ static void tcatch_command (char *arg, i

static void ep_skip_leading_whitespace (char **s);

+static int single_step_breakpoint_inserted_here_p (CORE_ADDR pc);
+
/* Prototypes for exported functions. */

/* If FALSE, gdb will not use hardware support for watchpoints, even
@@ -1841,6 +1843,10 @@ breakpoint_inserted_here_p (CORE_ADDR pc
}
}

+ /* Also check for software single-step breakpoints. */
+ if (single_step_breakpoint_inserted_here_p (pc))
+ return 1;
+
return 0;
}

@@ -1872,6 +1878,10 @@ software_breakpoint_inserted_here_p (COR
}
}

+ /* Also check for software single-step breakpoints. */
+ if (single_step_breakpoint_inserted_here_p (pc))
+ return 1;
+
return 0;
}

@@ -7951,6 +7961,23 @@ remove_single_step_breakpoints (void)
}
}

+/* Check whether a software single-step breakpoint is inserted at PC. */
+
+static int
+single_step_breakpoint_inserted_here_p (CORE_ADDR pc)
+{
+ int i;
+
+ for (i = 0; i < 2; i++)
+ {
+ struct bp_target_info *bp_tgt = single_step_breakpoints[i];
+ if (bp_tgt && bp_tgt->placed_address == pc)
+ return 1;
+ }
+
+ return 0;
+}
+
\f
/* This help string is used for the break, hbreak, tbreak and thbreak commands.
It is defined as a macro to prevent duplication.

--
Dr. Ulrich Weigand
GNU Toolchain for Linux on System z and Cell BE
Ulrich.Weigand@de.ibm.com