From 5ac87a997fca849c654fffdf1c3e1991ea3f81d1 Mon Sep 17 00:00:00 2001 From: =?utf8?q?Marcin=20Ko=C5=9Bcielnicki?= Date: Sat, 6 Feb 2016 01:49:14 +0100 Subject: [PATCH] gdb.trace: Read XML target description from tfile. gdb/ChangeLog: * tracefile-tfile.c (trace_tdesc): New static variable. (tfile_open): Clear trace_tdesc, call target_find_description. (tfile_interp_line): Recognize tdesc lines. (tfile_close): Clear trace_tdesc. (tfile_xfer_partial_features): New function. (tfile_xfer_partial): Call tfile_xfer_partial_features. (tfile_append_tdesc_line): New function. --- gdb/ChangeLog | 10 ++++++++ gdb/tracefile-tfile.c | 58 ++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 67 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 77412ca333..0ed35faf0e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,13 @@ +2016-02-10 Marcin Kościelnicki + + * tracefile-tfile.c (trace_tdesc): New static variable. + (tfile_open): Clear trace_tdesc, call target_find_description. + (tfile_interp_line): Recognize tdesc lines. + (tfile_close): Clear trace_tdesc. + (tfile_xfer_partial_features): New function. + (tfile_xfer_partial): Call tfile_xfer_partial_features. + (tfile_append_tdesc_line): New function. + 2016-02-10 Marcin Kościelnicki * ctf.c (ctf_write_tdesc): New function. diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index c87f61d266..9c561b9e65 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -30,6 +30,8 @@ #include "filenames.h" #include "remote.h" #include "xml-tdesc.h" +#include "target-descriptions.h" +#include "buffer.h" #ifndef O_LARGEFILE #define O_LARGEFILE 0 @@ -391,7 +393,9 @@ static off_t trace_frames_offset; static off_t cur_offset; static int cur_data_size; int trace_regblock_size; +static struct buffer trace_tdesc; +static void tfile_append_tdesc_line (const char *line); static void tfile_interp_line (char *line, struct uploaded_tp **utpp, struct uploaded_tsv **utsvp); @@ -458,6 +462,9 @@ tfile_open (const char *arg, int from_tty) trace_filename = xstrdup (filename); trace_fd = scratch_chan; + /* Make sure this is clear. */ + buffer_free (&trace_tdesc); + bytes = 0; /* Read the file header and test for validity. */ tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE); @@ -506,6 +513,9 @@ tfile_open (const char *arg, int from_tty) error (_("Excessively long lines in trace file")); } + /* By now, tdesc lines have been read from tfile - let's parse them. */ + target_find_description (); + /* Record the starting offset of the binary trace data. */ trace_frames_offset = bytes; @@ -569,6 +579,11 @@ tfile_interp_line (char *line, struct uploaded_tp **utpp, p += strlen ("tsv "); parse_tsv_definition (p, utsvp); } + else if (startswith (p, "tdesc ")) + { + p += strlen ("tdesc "); + tfile_append_tdesc_line (p); + } else warning (_("Ignoring trace file definition \"%s\""), line); } @@ -591,6 +606,7 @@ tfile_close (struct target_ops *self) trace_fd = -1; xfree (trace_filename); trace_filename = NULL; + buffer_free (&trace_tdesc); trace_reset_local_state (); } @@ -876,13 +892,43 @@ tfile_fetch_registers (struct target_ops *ops, tracefile_fetch_registers (regcache, regno); } +static enum target_xfer_status +tfile_xfer_partial_features (struct target_ops *ops, const char *annex, + gdb_byte *readbuf, const gdb_byte *writebuf, + ULONGEST offset, ULONGEST len, + ULONGEST *xfered_len) +{ + if (strcmp (annex, "target.xml")) + return TARGET_XFER_E_IO; + + if (readbuf == NULL) + error (_("tfile_xfer_partial: tdesc is read-only")); + + if (trace_tdesc.used_size == 0) + return TARGET_XFER_E_IO; + + if (offset >= trace_tdesc.used_size) + return TARGET_XFER_EOF; + + if (len > trace_tdesc.used_size - offset) + len = trace_tdesc.used_size - offset; + + memcpy (readbuf, trace_tdesc.buffer + offset, len); + *xfered_len = len; + + return TARGET_XFER_OK; +} + static enum target_xfer_status tfile_xfer_partial (struct target_ops *ops, enum target_object object, const char *annex, gdb_byte *readbuf, const gdb_byte *writebuf, ULONGEST offset, ULONGEST len, ULONGEST *xfered_len) { - /* We're only doing regular memory for now. */ + /* We're only doing regular memory and tdesc for now. */ + if (object == TARGET_OBJECT_AVAILABLE_FEATURES) + return tfile_xfer_partial_features (ops, annex, readbuf, writebuf, + offset, len, xfered_len); if (object != TARGET_OBJECT_MEMORY) return TARGET_XFER_E_IO; @@ -1062,6 +1108,16 @@ tfile_traceframe_info (struct target_ops *self) return info; } +/* Handles tdesc lines from tfile by appending the payload to + a global trace_tdesc variable. */ + +static void +tfile_append_tdesc_line (const char *line) +{ + buffer_grow_str (&trace_tdesc, line); + buffer_grow_str (&trace_tdesc, "\n"); +} + static void init_tfile_ops (void) { -- 2.34.1