+2018-03-01 Markus Metzger <markus.t.metzger@intel.com>
+
+ * 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 <sergiodj@redhat.com>
* server.c (captured_main): Change order of error message printed
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)
{
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)
{
struct thread_info *thread;
int result;
- if (the_target->read_btrace_conf == NULL || writebuf != NULL)
+ if (writebuf != NULL)
return -2;
if (annex[0] != '\0')
{
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)
{
(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."));
+
+ return (*the_target->enable_btrace) (ptid, conf);
+}
+
+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_disable_btrace(tinfo) \
- (*the_target->disable_btrace) (tinfo)
+ return (*the_target->disable_btrace) (tinfo);
+}
-#define target_read_btrace(tinfo, buffer, type) \
- (*the_target->read_btrace) (tinfo, buffer, type)
+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."));
-#define target_read_btrace_conf(tinfo, buffer) \
- (*the_target->read_btrace_conf) (tinfo, buffer)
+ return (*the_target->read_btrace_conf) (tinfo, buffer);
+}
#define target_supports_range_stepping() \
(the_target->supports_range_stepping ? \