[PATCH 09/11] [gdbserver] Rename supports_conditional_breakpoints to supports_hardware_single_step

Yao Qi
2015-07-01T13:59:00Z

In my patch https://sourceware.org/ml/gdb-patches/2015-04/msg01110.html
a new target_ops hook supports_conditional_breakpoints was added to
disable conditional breakpoints if target doesn't have hardware single
step. This patch is to generalize this hook from
supports_conditional_breakpoints to supports_hardware_single_step,
so that the following patch can use it.

gdb/gdbserver:

2015-06-30 Yao Qi <yao.qi@linaro.org>

* linux-low.c (linux_supports_conditional_breakpoints): Rename
it to ...
(linux_supports_hardware_single_step): ... New function.
(linux_target_ops): Update.
* lynx-low.c (lynx_target_ops): Set field
supports_hardware_single_step to target_can_do_hardware_single_step.
* nto-low.c (nto_target_ops): Likewise.
* spu-low.c (spu_target_ops): Likewise.
* win32-low.c (win32_target_ops): Likewise.
* target.c (target_can_do_hardware_single_step): New function.
* target.h (struct target_ops) <supports_conditional_breakpoints>:
Remove. <supports_hardware_single_step>: New field.
(target_supports_conditional_breakpoints): Remove.
(target_supports_hardware_single_step): New macro.
(target_can_do_hardware_single_step): Declare.
* server.c (handle_query): Use target_supports_hardware_single_step
instead of target_supports_conditional_breakpoints.
---
gdb/gdbserver/linux-low.c | 11 +++--------
gdb/gdbserver/lynx-low.c | 5 +----
gdb/gdbserver/nto-low.c | 5 +----
gdb/gdbserver/server.c | 10 ++++++++--
gdb/gdbserver/spu-low.c | 2 +-
gdb/gdbserver/target.c | 8 ++++++++
gdb/gdbserver/target.h | 13 +++++++------
gdb/gdbserver/win32-low.c | 5 +----
8 files changed, 30 insertions(+), 29 deletions(-)

diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c
index 3774d17..6467ca8 100644
--- a/gdb/gdbserver/linux-low.c
+++ b/gdb/gdbserver/linux-low.c
@@ -5313,16 +5313,11 @@ linux_supports_stopped_by_hw_breakpoint (void)
return USE_SIGTRAP_SIGINFO;
}

-/* Implement the supports_conditional_breakpoints target_ops
- method. */
+/* Implement the supports_hardware_single_step target_ops method. */

static int
-linux_supports_conditional_breakpoints (void)
+linux_supports_hardware_single_step (void)
{
- /* GDBserver needs to step over the breakpoint if the condition is
- false. GDBserver software single step is too simple, so disable
- conditional breakpoints if the target doesn't have hardware single
- step. */
return can_hardware_single_step ();
}

@@ -6582,7 +6577,7 @@ static struct target_ops linux_target_ops = {
linux_supports_stopped_by_sw_breakpoint,
linux_stopped_by_hw_breakpoint,
linux_supports_stopped_by_hw_breakpoint,
- linux_supports_conditional_breakpoints,
+ linux_supports_hardware_single_step,
linux_stopped_by_watchpoint,
linux_stopped_data_address,
#if defined(__UCLIBC__) && defined(HAS_NOMMU) \
diff --git a/gdb/gdbserver/lynx-low.c b/gdb/gdbserver/lynx-low.c
index ee7b28a..f636377 100644
--- a/gdb/gdbserver/lynx-low.c
+++ b/gdb/gdbserver/lynx-low.c
@@ -746,10 +746,7 @@ static struct target_ops lynx_target_ops = {
NULL, /* supports_stopped_by_sw_breakpoint */
NULL, /* stopped_by_hw_breakpoint */
NULL, /* supports_stopped_by_hw_breakpoint */
- /* Although lynx has hardware single step, still disable this
- feature for lynx, because it is implemented in linux-low.c instead
- of in generic code. */
- NULL, /* supports_conditional_breakpoints */
+ target_can_do_hardware_single_step,
NULL, /* stopped_by_watchpoint */
NULL, /* stopped_data_address */
NULL, /* read_offsets */
diff --git a/gdb/gdbserver/nto-low.c b/gdb/gdbserver/nto-low.c
index 9276736..6c50e95 100644
--- a/gdb/gdbserver/nto-low.c
+++ b/gdb/gdbserver/nto-low.c
@@ -949,10 +949,7 @@ static struct target_ops nto_target_ops = {
NULL, /* supports_stopped_by_sw_breakpoint */
NULL, /* stopped_by_hw_breakpoint */
NULL, /* supports_stopped_by_hw_breakpoint */
- /* Although nto has hardware single step, still disable this
- feature for not, because it is implemented in linux-low.c instead
- of in generic code. */
- NULL, /* supports_conditional_breakpoints */
+ target_can_do_hardware_single_step,
nto_stopped_by_watchpoint,
nto_stopped_data_address,
NULL, /* nto_read_offsets */
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index c9effc2..858fbe5 100644
--- a/gdb/gdbserver/server.c
+++ b/gdb/gdbserver/server.c
@@ -2142,8 +2142,14 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p)
}

/* Support target-side breakpoint conditions and commands. */
- if (target_supports_conditional_breakpoints ())
- strcat (own_buf, ";ConditionalBreakpoints+");
+ if (target_supports_hardware_single_step ())
+ {
+ /* GDBserver needs to step over the breakpoint if the condition
+ is false. GDBserver software single step is too simple, so
+ disable conditional breakpoints if the target doesn't have
+ hardware single step. */
+ strcat (own_buf, ";ConditionalBreakpoints+");
+ }
strcat (own_buf, ";BreakpointCommands+");

if (target_supports_agent ())
diff --git a/gdb/gdbserver/spu-low.c b/gdb/gdbserver/spu-low.c
index a56a889..b5501c4 100644
--- a/gdb/gdbserver/spu-low.c
+++ b/gdb/gdbserver/spu-low.c
@@ -662,7 +662,7 @@ static struct target_ops spu_target_ops = {
NULL, /* supports_stopped_by_sw_breakpoint */
NULL, /* stopped_by_hw_breakpoint */
NULL, /* supports_stopped_by_hw_breakpoint */
- NULL, /* supports_conditional_breakpoints */
+ NULL, /* supports_hardware_single_step */
NULL,
NULL,
NULL,
diff --git a/gdb/gdbserver/target.c b/gdb/gdbserver/target.c
index 14999e6..dd04642 100644
--- a/gdb/gdbserver/target.c
+++ b/gdb/gdbserver/target.c
@@ -218,3 +218,11 @@ kill_inferior (int pid)

return (*the_target->kill) (pid);
}
+
+/* Target can do hardware single step. */
+
+int
+target_can_do_hardware_single_step (void)
+{
+ return 1;
+}
diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h
index 9a40867..c16f55b 100644
--- a/gdb/gdbserver/target.h
+++ b/gdb/gdbserver/target.h
@@ -222,9 +222,8 @@ struct target_ops
HW breakpoint triggering. */
int (*supports_stopped_by_hw_breakpoint) (void);

- /* Returns true if the target can evaluate conditions of
- breakpoints. */
- int (*supports_conditional_breakpoints) (void);
+ /* Returns true if the target can do hardware single step. */
+ int (*supports_hardware_single_step) (void);

/* Returns 1 if target was stopped due to a watchpoint hit, 0 otherwise. */

@@ -599,9 +598,9 @@ int kill_inferior (int);
(the_target->supports_stopped_by_hw_breakpoint ? \
(*the_target->supports_stopped_by_hw_breakpoint) () : 0)

-#define target_supports_conditional_breakpoints() \
- (the_target->supports_conditional_breakpoints ? \
- (*the_target->supports_conditional_breakpoints) () : 0)
+#define target_supports_hardware_single_step() \
+ (the_target->supports_hardware_single_step ? \
+ (*the_target->supports_hardware_single_step) () : 0)

#define target_stopped_by_hw_breakpoint() \
(the_target->stopped_by_hw_breakpoint ? \
@@ -639,4 +638,6 @@ void set_desired_thread (int id);

const char *target_pid_to_str (ptid_t);

+int target_can_do_hardware_single_step (void);
+
#endif /* TARGET_H */
diff --git a/gdb/gdbserver/win32-low.c b/gdb/gdbserver/win32-low.c
index 64caf24..ff3feff 100644
--- a/gdb/gdbserver/win32-low.c
+++ b/gdb/gdbserver/win32-low.c
@@ -1809,10 +1809,7 @@ static struct target_ops win32_target_ops = {
NULL, /* supports_stopped_by_sw_breakpoint */
NULL, /* stopped_by_hw_breakpoint */
NULL, /* supports_stopped_by_hw_breakpoint */
- /* Although win32-i386 has hardware single step, still disable this
- feature for win32, because it is implemented in linux-low.c instead
- of in generic code. */
- NULL, /* supports_conditional_breakpoints */
+ target_can_do_hardware_single_step,
win32_stopped_by_watchpoint,
win32_stopped_data_address,
NULL, /* read_offsets */
--
1.9.1