diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index ac88a9d778..703bdfb1ba 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,12 @@ +2018-03-01 Markus Metzger + + * target.h (target_enable_btrace, target_disable_btrace) + (target_read_btrace, target_read_btrace_conf): Turn macro into + inline function. Throw error if target method is not defined. + * server.c (handle_qxfer_btrace handle_qxfer_btrace_conf): Remove + check for btrace target method. Be prepared to handle exceptions + from btrace target methods. + 2018-02-28 Sergio Durigan Junior * server.c (captured_main): Change order of error message printed diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index f373d8a1e8..ad327be028 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -1852,7 +1852,7 @@ handle_qxfer_btrace (const char *annex, enum btrace_read_type type; int result; - if (the_target->read_btrace == NULL || writebuf != NULL) + if (writebuf != NULL) return -2; if (ptid_equal (general_thread, null_ptid) @@ -1891,12 +1891,21 @@ handle_qxfer_btrace (const char *annex, { buffer_free (&cache); - result = target_read_btrace (thread->btrace, &cache, type); - if (result != 0) + TRY { - memcpy (own_buf, cache.buffer, cache.used_size); - return -3; + result = target_read_btrace (thread->btrace, &cache, type); + if (result != 0) + memcpy (own_buf, cache.buffer, cache.used_size); } + CATCH (exception, RETURN_MASK_ERROR) + { + sprintf (own_buf, "E.%s", exception.message); + result = -1; + } + END_CATCH + + if (result != 0) + return -3; } else if (offset > cache.used_size) { @@ -1923,7 +1932,7 @@ handle_qxfer_btrace_conf (const char *annex, struct thread_info *thread; int result; - if (the_target->read_btrace_conf == NULL || writebuf != NULL) + if (writebuf != NULL) return -2; if (annex[0] != '\0') @@ -1953,12 +1962,21 @@ handle_qxfer_btrace_conf (const char *annex, { buffer_free (&cache); - result = target_read_btrace_conf (thread->btrace, &cache); - if (result != 0) + TRY { - memcpy (own_buf, cache.buffer, cache.used_size); - return -3; + result = target_read_btrace_conf (thread->btrace, &cache); + if (result != 0) + memcpy (own_buf, cache.buffer, cache.used_size); } + CATCH (exception, RETURN_MASK_ERROR) + { + sprintf (own_buf, "E.%s", exception.message); + result = -1; + } + END_CATCH + + if (result != 0) + return -3; } else if (offset > cache.used_size) { diff --git a/gdb/gdbserver/target.h b/gdb/gdbserver/target.h index dcefe1a94b..25accd2207 100644 --- a/gdb/gdbserver/target.h +++ b/gdb/gdbserver/target.h @@ -620,17 +620,44 @@ int kill_inferior (int); (the_target->supports_agent ? \ (*the_target->supports_agent) () : 0) -#define target_enable_btrace(ptid, conf) \ - (*the_target->enable_btrace) (ptid, conf) +static inline struct btrace_target_info * +target_enable_btrace (ptid_t ptid, const struct btrace_config *conf) +{ + if (the_target->enable_btrace == nullptr) + error (_("Target does not support branch tracing.")); -#define target_disable_btrace(tinfo) \ - (*the_target->disable_btrace) (tinfo) + return (*the_target->enable_btrace) (ptid, conf); +} -#define target_read_btrace(tinfo, buffer, type) \ - (*the_target->read_btrace) (tinfo, buffer, type) +static inline int +target_disable_btrace (struct btrace_target_info *tinfo) +{ + if (the_target->disable_btrace == nullptr) + error (_("Target does not support branch tracing.")); -#define target_read_btrace_conf(tinfo, buffer) \ - (*the_target->read_btrace_conf) (tinfo, buffer) + return (*the_target->disable_btrace) (tinfo); +} + +static inline int +target_read_btrace (struct btrace_target_info *tinfo, + struct buffer *buffer, + enum btrace_read_type type) +{ + if (the_target->read_btrace == nullptr) + error (_("Target does not support branch tracing.")); + + return (*the_target->read_btrace) (tinfo, buffer, type); +} + +static inline int +target_read_btrace_conf (struct btrace_target_info *tinfo, + struct buffer *buffer) +{ + if (the_target->read_btrace_conf == nullptr) + error (_("Target does not support branch tracing.")); + + return (*the_target->read_btrace_conf) (tinfo, buffer); +} #define target_supports_range_stepping() \ (the_target->supports_range_stepping ? \