From 70b90b91bf77e72a36abdef039234359195b1942 Mon Sep 17 00:00:00 2001 From: Yao Qi Date: Tue, 15 Sep 2015 14:09:18 +0100 Subject: [PATCH] [gdbserver] Rename supports_conditional_breakpoints to supports_hardware_single_step 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-09-15 Yao Qi * 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) : Remove. : 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/ChangeLog | 20 ++++++++++++++++++++ gdb/gdbserver/linux-low.c | 11 +++-------- gdb/gdbserver/lynx-low.c | 5 +---- gdb/gdbserver/nto-low.c | 5 +---- gdb/gdbserver/server.c | 12 +++++++++--- gdb/gdbserver/spu-low.c | 2 +- gdb/gdbserver/target.c | 8 ++++++++ gdb/gdbserver/target.h | 13 +++++++------ gdb/gdbserver/win32-low.c | 5 +---- 9 files changed, 51 insertions(+), 30 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 25c01ff98e..7831b858f9 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,23 @@ +2015-09-15 Yao Qi + + * 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) : + Remove. : 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. + 2015-09-15 Yao Qi * linux-aarch64-low.c (aarch64_linux_siginfo_fixup): New diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index aa4c868843..f5b64ab254 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -5614,16 +5614,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 (); } @@ -6964,7 +6959,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 b722930bfc..0582399bdc 100644 --- a/gdb/gdbserver/lynx-low.c +++ b/gdb/gdbserver/lynx-low.c @@ -747,10 +747,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 19f492ff77..fa216a995b 100644 --- a/gdb/gdbserver/nto-low.c +++ b/gdb/gdbserver/nto-low.c @@ -950,10 +950,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 9aa8a3f799..1481c47dc4 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -2202,9 +2202,15 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) strcat (own_buf, ";tracenz+"); } - /* Support target-side breakpoint conditions and commands. */ - if (target_supports_conditional_breakpoints ()) - strcat (own_buf, ";ConditionalBreakpoints+"); + if (target_supports_hardware_single_step ()) + { + /* Support target-side breakpoint conditions and commands. + 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 878ed82cf0..074417aa58 100644 --- a/gdb/gdbserver/spu-low.c +++ b/gdb/gdbserver/spu-low.c @@ -666,7 +666,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 7540f2f5c9..17ff7a67ca 100644 --- a/gdb/gdbserver/target.c +++ b/gdb/gdbserver/target.c @@ -216,3 +216,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 aea3d15499..a2842b41cc 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -225,9 +225,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. */ @@ -616,9 +615,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 ? \ @@ -656,4 +655,6 @@ int 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 85cc040584..550a8e91ae 100644 --- a/gdb/gdbserver/win32-low.c +++ b/gdb/gdbserver/win32-low.c @@ -1810,10 +1810,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 */ -- 2.34.1