Re: [PATCH 1/4] gdb.trace: Save XML target description in tfile.

Pedro Alves
2016-02-10T13:02:47Z

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 (&current_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