From patchwork Sat Feb 6 15:39:14 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: 10744 Received: (qmail 16091 invoked by alias); 6 Feb 2016 15:39:26 -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 15939 invoked by uid 89); 6 Feb 2016 15:39:24 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-0.4 required=5.0 tests=AWL, BAYES_00, RP_MATCHES_RCVD, SPF_PASS, UNSUBSCRIBE_BODY autolearn=no version=3.3.2 spammy=Wire, 28, 6, Nothing, XML 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 55CA240C81 for ; Sat, 6 Feb 2016 16:40:09 +0100 (CET) Received: by hogfather.0x04.net (Postfix, from userid 1000) id B9BC35800FF; 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 1/4] gdb.trace: Save XML target description in tfile. Date: Sat, 6 Feb 2016 16:39:14 +0100 Message-Id: <1454773157-31569-2-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 X-IsSubscribed: yes gdb/ChangeLog: * ctf.c (ctf_write_tdesc): New function. (ctf_write_ops): Wire in ctf_write_tdesc. * tracefile-tfile.c (tfile_write_tdesc): New function. (tfile_write_ops): Wire in tfile_write_tdesc. * tracefile.c (trace_save): Call write_tdesc method. * tracefile.h (struct trace_file_write_ops): Add write_tdesc method. * xml-tdesc.c (target_fetch_description_xml): New function. * xml-tdesc.h: Add target_fetch_description_xml prototype. --- gdb/ChangeLog | 11 +++++++++++ gdb/ctf.c | 10 ++++++++++ gdb/tracefile-tfile.c | 38 ++++++++++++++++++++++++++++++++++++++ gdb/tracefile.c | 3 +++ gdb/tracefile.h | 3 +++ gdb/xml-tdesc.c | 26 ++++++++++++++++++++++++++ gdb/xml-tdesc.h | 6 ++++++ 7 files changed, 97 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index a2b0d39..29e1291 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +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. + (tfile_write_ops): Wire in tfile_write_tdesc. + * tracefile.c (trace_save): Call write_tdesc method. + * tracefile.h (struct trace_file_write_ops): Add write_tdesc method. + * xml-tdesc.c (target_fetch_description_xml): New function. + * xml-tdesc.h: Add target_fetch_description_xml prototype. + 2016-02-04 Yao Qi * remote.c (remote_wait_as): Set rs->waiting_for_stop_reply to diff --git a/gdb/ctf.c b/gdb/ctf.c index 9d496e3..25a4c79 100644 --- a/gdb/ctf.c +++ b/gdb/ctf.c @@ -617,6 +617,15 @@ ctf_write_uploaded_tp (struct trace_file_writer *self, } /* This is the implementation of trace_file_write_ops method + write_tdesc. */ + +static void +ctf_write_tdesc (struct trace_file_writer *self) +{ + /* Nothing so far. */ +} + +/* This is the implementation of trace_file_write_ops method write_definition_end. */ static void @@ -799,6 +808,7 @@ static const struct trace_file_write_ops ctf_write_ops = ctf_write_status, ctf_write_uploaded_tsv, ctf_write_uploaded_tp, + ctf_write_tdesc, ctf_write_definition_end, NULL, &ctf_write_frame_ops, diff --git a/gdb/tracefile-tfile.c b/gdb/tracefile-tfile.c index b761894..f148758 100644 --- a/gdb/tracefile-tfile.c +++ b/gdb/tracefile-tfile.c @@ -28,6 +28,7 @@ #include "exec.h" /* exec_bfd */ #include "completer.h" #include "filenames.h" +#include "xml-tdesc.h" #ifndef O_LARGEFILE #define O_LARGEFILE 0 @@ -263,6 +264,42 @@ tfile_write_uploaded_tp (struct trace_file_writer *self, } /* This is the implementation of trace_file_write_ops method + write_tdesc. */ + +static void +tfile_write_tdesc (struct trace_file_writer *self) +{ + struct tfile_trace_file_writer *writer + = (struct tfile_trace_file_writer *) self; + char *tdesc = target_fetch_description_xml (¤t_target); + char *ptr = tdesc; + char *next; + + if (!tdesc) + return; + + /* Write tdesc line by line, prefixing each line with "tdesc ". */ + while (ptr) + { + next = strchr (ptr, '\n'); + if (next) + { + fprintf (writer->fp, "tdesc %.*s\n", (int) (next-ptr), ptr); + /* Skip the \n. */ + next++; + } + else if (*ptr) + { + /* Last line, doesn't have a newline. */ + fprintf (writer->fp, "tdesc %s\n", ptr); + } + ptr = next; + } + + xfree (tdesc); +} + +/* This is the implementation of trace_file_write_ops method write_definition_end. */ static void @@ -315,6 +352,7 @@ static const struct trace_file_write_ops tfile_write_ops = tfile_write_status, tfile_write_uploaded_tsv, tfile_write_uploaded_tp, + tfile_write_tdesc, tfile_write_definition_end, tfile_write_raw_data, NULL, diff --git a/gdb/tracefile.c b/gdb/tracefile.c index fef4ed9..de42165 100644 --- a/gdb/tracefile.c +++ b/gdb/tracefile.c @@ -90,6 +90,9 @@ trace_save (const char *filename, struct trace_file_writer *writer, /* Write out the size of a register block. */ writer->ops->write_regblock_type (writer, trace_regblock_size); + /* Write out the target description info. */ + writer->ops->write_tdesc (writer); + /* Write out status of the tracing run (aka "tstatus" info). */ writer->ops->write_status (writer, ts); diff --git a/gdb/tracefile.h b/gdb/tracefile.h index 8b711a1..e6d4460 100644 --- a/gdb/tracefile.h +++ b/gdb/tracefile.h @@ -84,6 +84,9 @@ struct trace_file_write_ops void (*write_uploaded_tp) (struct trace_file_writer *self, struct uploaded_tp *tp); + /* Write target description. */ + void (*write_tdesc) (struct trace_file_writer *self); + /* Write to mark the end of the definition part. */ void (*write_definition_end) (struct trace_file_writer *self); diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c index 5eeda86..202de86 100644 --- a/gdb/xml-tdesc.c +++ b/gdb/xml-tdesc.c @@ -630,3 +630,29 @@ target_read_description_xml (struct target_ops *ops) return tdesc; } + +char * +target_fetch_description_xml (struct target_ops *ops) +{ + struct target_desc *tdesc; + char *tdesc_str; + char *expanded_text; + struct cleanup *back_to; + + tdesc_str = fetch_available_features_from_target ("target.xml", ops); + if (tdesc_str == NULL) + return NULL; + + back_to = make_cleanup (xfree, tdesc_str); + expanded_text = xml_process_xincludes (_("target description"), + tdesc_str, + fetch_available_features_from_target, ops, 0); + if (expanded_text == NULL) + { + warning (_("Could not load XML target description; ignoring")); + return NULL; + } + do_cleanups (back_to); + + return expanded_text; +} diff --git a/gdb/xml-tdesc.h b/gdb/xml-tdesc.h index a0c38d7..38bb99e 100644 --- a/gdb/xml-tdesc.h +++ b/gdb/xml-tdesc.h @@ -31,3 +31,9 @@ const struct target_desc *file_read_description_xml (const char *filename); parsed description. */ const struct target_desc *target_read_description_xml (struct target_ops *); + +/* Fetches an XML target description using OPS, processing + includes, but not parsing it. Used to dump whole tdesc + as a single XML file. */ + +char * target_fetch_description_xml (struct target_ops *ops);