From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 119014 invoked by alias); 10 Feb 2016 13:02:47 -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 118996 invoked by uid 89); 10 Feb 2016 13:02:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=2.6 required=5.0 tests=BAYES_50,RP_MATCHES_RCVD,SPF_HELO_PASS,UNSUBSCRIBE_BODY autolearn=no version=3.3.2 spammy=xfree, 287, 28,6, 909 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with (AES256-GCM-SHA384 encrypted) ESMTPS; Wed, 10 Feb 2016 13:02:45 +0000 Received: from int-mx14.intmail.prod.int.phx2.redhat.com (int-mx14.intmail.prod.int.phx2.redhat.com [10.5.11.27]) by mx1.redhat.com (Postfix) with ESMTPS id 50E4C7AE8E; Wed, 10 Feb 2016 13:02:44 +0000 (UTC) Received: from [127.0.0.1] (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx14.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id u1AD2gxN022289; Wed, 10 Feb 2016 08:02:43 -0500 Message-ID: <56BB34F2.5030403@redhat.com> Date: Wed, 10 Feb 2016 13:02:00 -0000 From: Pedro Alves User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:31.0) Gecko/20100101 Thunderbird/31.7.0 MIME-Version: 1.0 To: =?UTF-8?B?TWFyY2luIEtvxZtjaWVsbmlja2k=?= , gdb-patches@sourceware.org Subject: Re: [PATCH 1/4] gdb.trace: Save XML target description in tfile. References: <1454773157-31569-1-git-send-email-koriakin@0x04.net> <1454773157-31569-2-git-send-email-koriakin@0x04.net> In-Reply-To: <1454773157-31569-2-git-send-email-koriakin@0x04.net> Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-SW-Source: 2016-02/txt/msg00278.txt.bz2 On 02/06/2016 03:39 PM, Marcin Kościelnicki wrote: > 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; if (tdesc == NULL) return; > + > + /* Write tdesc line by line, prefixing each line with "tdesc ". */ > + while (ptr) + while (ptr != NULL) > + { > + next = strchr (ptr, '\n'); > + if (next) > + { > + fprintf (writer->fp, "tdesc %.*s\n", (int) (next-ptr), ptr); Spaces around the '-'. > + /* Skip the \n. */ > + next++; > + } > + else if (*ptr) else if (*ptr != '\0') > + { > + /* 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; > } /* See whatever.h. */ > + > +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; This path is missing do_cleanups. > + } > + 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); > No space after "char *" : char *target_fetch_description_xml (struct target_ops *ops); Thanks, Pedro Alves