@@ -1,3 +1,19 @@ +2015-05-08 Yao Qi <yao.qi@linaro.org> + + * linux-low.c (linux_supports_conditional_breakpoints): New + function. + (linux_target_ops): Install new target method. + * lynx-low.c (lynx_target_ops): Install NULL hook for + supports_conditional_breakpoints. + * nto-low.c (nto_target_ops): Likewise. + * spu-low.c (spu_target_ops): Likewise. + * win32-low.c (win32_target_ops): Likewise. + * server.c (handle_query): Check + target_supports_conditional_breakpoints. + * target.h (struct target_ops) <supports_conditional_breakpoints>: + New field. + (target_supports_conditional_breakpoints): New macro. + 2015-05-06 Pedro Alves <palves@redhat.com> PR server/18081 @@ -5177,6 +5177,19 @@ linux_supports_stopped_by_hw_breakpoint (void) return USE_SIGTRAP_SIGINFO; } +/* Implement the supports_conditional_breakpoints target_ops + method. */ + +static int +linux_supports_conditional_breakpoints (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 (); +} + static int linux_stopped_by_watchpoint (void) { @@ -6375,6 +6388,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_stopped_by_watchpoint, linux_stopped_data_address, #if defined(__UCLIBC__) && defined(HAS_NOMMU) \ @@ -746,6 +746,10 @@ 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 */ NULL, /* stopped_by_watchpoint */ NULL, /* stopped_data_address */ NULL, /* read_offsets */ @@ -949,6 +949,10 @@ 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 */ nto_stopped_by_watchpoint, nto_stopped_data_address, NULL, /* nto_read_offsets */ @@ -2107,7 +2107,8 @@ handle_query (char *own_buf, int packet_len, int *new_packet_len_p) } /* Support target-side breakpoint conditions and commands. */ - strcat (own_buf, ";ConditionalBreakpoints+"); + if (target_supports_conditional_breakpoints ()) + strcat (own_buf, ";ConditionalBreakpoints+"); strcat (own_buf, ";BreakpointCommands+"); if (target_supports_agent ()) @@ -662,6 +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, NULL, NULL, @@ -222,6 +222,10 @@ 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 1 if target was stopped due to a watchpoint hit, 0 otherwise. */ int (*stopped_by_watchpoint) (void); @@ -550,6 +554,10 @@ 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_stopped_by_hw_breakpoint() \ (the_target->stopped_by_hw_breakpoint ? \ (*the_target->stopped_by_hw_breakpoint) () : 0) @@ -1811,6 +1811,10 @@ 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 */ win32_stopped_by_watchpoint, win32_stopped_data_address, NULL, /* read_offsets */ |