aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/gdbserver/ChangeLog9
-rw-r--r--gdb/gdbserver/server.c38
-rw-r--r--gdb/gdbserver/target.h43
3 files changed, 72 insertions, 18 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index ac88a9d..703bdfb 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,3 +1,12 @@
+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
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c
index f373d8a..ad327be 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 dcefe1a..25accd2 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."));
+
+ 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 ? \