From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 16181 invoked by alias); 6 Feb 2016 15:39:27 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Received: (qmail 15977 invoked by uid 89); 6 Feb 2016 15:39:25 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-1.4 required=5.0 tests=AWL,BAYES_00,RP_MATCHES_RCVD,SPF_PASS autolearn=ham version=3.3.2 spammy=Wire, 29,6, Recognize, 5056 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; Sat, 06 Feb 2016 15:39:23 +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 424E440C56 for ; Sat, 6 Feb 2016 16:40:09 +0100 (CET) Received: by hogfather.0x04.net (Postfix, from userid 1000) id A95CA58008C; Sat, 6 Feb 2016 16:39:20 +0100 (CET) From: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= To: gdb-patches@sourceware.org Cc: =?UTF-8?q?Marcin=20Ko=C5=9Bcielnicki?= Subject: [PATCH 2/4] gdb.trace: Read XML target description from tfile. Date: Sat, 06 Feb 2016 15:39:00 -0000 Message-Id: <1454773157-31569-3-git-send-email-koriakin@0x04.net> In-Reply-To: <1454773157-31569-1-git-send-email-koriakin@0x04.net> References: <1454773157-31569-1-git-send-email-koriakin@0x04.net> MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-IsSubscribed: yes X-SW-Source: 2016-02/txt/msg00164.txt.bz2 gdb/ChangeLog: * tracefile-tfile.c (trace_tdesc): New static variable. (trace_tdesc_alloc): New static variable. (trace_tdesc_len): 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 | 12 ++++++++ gdb/tracefile-tfile.c | 80 ++++++++++++++++++++++++++++++++++++++++++++++++++- 2 files changed, 91 insertions(+), 1 deletion(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 29e1291..f5cd0c7 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,5 +1,17 @@ 2016-02-06 Marcin Kościelnicki + * tracefile-tfile.c (trace_tdesc): New static variable. + (trace_tdesc_alloc): New static variable. + (trace_tdesc_len): 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-06 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 f148758..71ac437 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -29,6 +29,7 @@ #include "completer.h" #include "filenames.h" #include "xml-tdesc.h" +#include "target-descriptions.h" #ifndef O_LARGEFILE #define O_LARGEFILE 0 @@ -390,7 +391,11 @@ static off_t trace_frames_offset; static off_t cur_offset; static int cur_data_size; int trace_regblock_size; +static char *trace_tdesc; +static int trace_tdesc_alloc; +static int trace_tdesc_len; +static void tfile_append_tdesc_line (const char *line); static void tfile_interp_line (char *line, struct uploaded_tp **utpp, struct uploaded_tsv **utsvp); @@ -457,6 +462,12 @@ tfile_open (const char *arg, int from_tty) trace_filename = xstrdup (filename); trace_fd = scratch_chan; + /* Make sure this is clear. */ + xfree (trace_tdesc); + trace_tdesc = NULL; + trace_tdesc_alloc = 0; + trace_tdesc_len = 0; + bytes = 0; /* Read the file header and test for validity. */ tfile_read ((gdb_byte *) &header, TRACE_HEADER_SIZE); @@ -505,6 +516,9 @@ tfile_open (const char *arg, int from_tty) error (_("Excessively long lines in trace file")); } + /* We should have fetched tdesc by now. */ + target_find_description (); + /* Record the starting offset of the binary trace data. */ trace_frames_offset = bytes; @@ -568,6 +582,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); } @@ -590,6 +609,10 @@ tfile_close (struct target_ops *self) trace_fd = -1; xfree (trace_filename); trace_filename = NULL; + xfree (trace_tdesc); + trace_tdesc = NULL; + trace_tdesc_alloc = 0; + trace_tdesc_len = 0; trace_reset_local_state (); } @@ -876,12 +899,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) + return TARGET_XFER_E_IO; + + if (offset >= trace_tdesc_len) + return TARGET_XFER_EOF; + + if (len > trace_tdesc_len - offset) + len = trace_tdesc_len - offset; + + memcpy (readbuf, trace_tdesc + 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; @@ -1061,6 +1114,31 @@ 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); + + /* 2 chars for "\n\0". */ + while (trace_tdesc_len + llen + 2 > trace_tdesc_alloc) + { + /* Grow the buffer. */ + if (!trace_tdesc_alloc) + trace_tdesc_alloc = 4096; + else + trace_tdesc_alloc *= 2; + trace_tdesc = xrealloc(trace_tdesc, trace_tdesc_alloc); + } + + strcpy (trace_tdesc + trace_tdesc_len, line); + trace_tdesc_len += llen; + strcpy (trace_tdesc + trace_tdesc_len, "\n"); + trace_tdesc_len++; +} + static void init_tfile_ops (void) { -- 2.7.0