diff options
Diffstat (limited to 'gdb/gdbserver')
-rw-r--r-- | gdb/gdbserver/ChangeLog | 20 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 11 | ||||
-rw-r--r-- | gdb/gdbserver/lynx-low.c | 5 | ||||
-rw-r--r-- | gdb/gdbserver/nto-low.c | 5 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 12 | ||||
-rw-r--r-- | gdb/gdbserver/spu-low.c | 2 | ||||
-rw-r--r-- | gdb/gdbserver/target.c | 8 | ||||
-rw-r--r-- | gdb/gdbserver/target.h | 13 | ||||
-rw-r--r-- | gdb/gdbserver/win32-low.c | 5 |
9 files changed, 51 insertions, 30 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 25c01ff..7831b85 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,25 @@ 2015-09-15 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. + +2015-09-15 Yao Qi <yao.qi@linaro.org> + * linux-aarch64-low.c (aarch64_linux_siginfo_fixup): New function. (struct linux_target_ops the_low_target): Install diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index aa4c868..f5b64ab 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 b722930..0582399 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 19f492f..fa216a9 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 9aa8a3f..1481c47 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 878ed82..074417a 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 7540f2f..17ff7a6 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 aea3d15..a2842b4 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 85cc040..550a8e9 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 */ |