+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
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)
{
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) \
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 */
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 */
}
/* 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 ())
NULL, /* supports_stopped_by_sw_breakpoint */
NULL, /* stopped_by_hw_breakpoint */
NULL, /* supports_stopped_by_hw_breakpoint */
+ NULL, /* supports_conditional_breakpoints */
NULL,
NULL,
NULL,
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);
(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)
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 */