From patchwork Wed Feb 10 20:19:09 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Marcin_Ko=C5=9Bcielnicki?= X-Patchwork-Id: 10805 Received: (qmail 18923 invoked by alias); 10 Feb 2016 20:19:15 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 17743 invoked by uid 89); 10 Feb 2016 20:19:14 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.5 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS autolearn=ham version=3.3.2 spammy=3917, 87712, 877, 12, sk:tfile_t X-HELO: xyzzy.0x04.net Received: from xyzzy.0x04.net (HELO xyzzy.0x04.net) (109.74.193.254) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Wed, 10 Feb 2016 20:19:13 +0000 Received: from hogfather.0x04.net (89-65-66-135.dynamic.chello.pl [89.65.66.135]) by xyzzy.0x04.net (Postfix) with ESMTPS id E379C3FEBC; Wed, 10 Feb 2016 21:20:00 +0100 (CET) Received: by hogfather.0x04.net (Postfix, from userid 1000) id ECE22580092; Wed, 10 Feb 2016 21:19:10 +0100 (CET) From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= To: palves@redhat.com Cc: gdb-patches@sourceware.org, =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= Subject: [PATCH 2/3] gdb.trace: Read XML target description from tfile. Date: Wed, 10 Feb 2016 21:19:09 +0100 Message-Id: <1455135549-21872-1-git-send-email-koriakin@0x04.net> In-Reply-To: <56BB34FE.8040108@redhat.com> References: <56BB34FE.8040108@redhat.com> MIME-Version: 1.0 X-IsSubscribed: yes 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. --- Fixes applied, buffer used. gdb/ChangeLog | 10 +++++++++ gdb/tracefile-tfile.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 69 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 77412ca..0ed35fa 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,15 @@ 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. (ctf_write_ops): Wire in ctf_write_tdesc. * tracefile-tfile.c (tfile_write_tdesc): New function. diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index c87f61d..d5d5ed1 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 (); } @@ -877,12 +893,42 @@ tfile_fetch_registers (struct target_ops *ops, } 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,18 @@ 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) +{ + int llen = strlen (line); + + buffer_grow_str (&trace_tdesc, line); + buffer_grow_str (&trace_tdesc, "\n"); +} + static void init_tfile_ops (void) {