gdb.trace: Save XML target description in tfile.

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.
This commit is contained in:
Marcin Kościelnicki 2016-02-05 21:32:52 +01:00
parent 9f6a71b4bf
commit 18d3cec54e
7 changed files with 101 additions and 0 deletions

View file

@ -1,3 +1,14 @@
2016-02-10 Marcin Kościelnicki <koriakin@0x04.net>
* 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-10 Simon Marchi <simon.marchi@ericsson.com> 2016-02-10 Simon Marchi <simon.marchi@ericsson.com>
* arm-tdep.c (arm_copy_extra_ld_st): Fix "unpriveleged" typo. * arm-tdep.c (arm_copy_extra_ld_st): Fix "unpriveleged" typo.

View file

@ -616,6 +616,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 /* This is the implementation of trace_file_write_ops method
write_definition_end. */ write_definition_end. */
@ -799,6 +808,7 @@ static const struct trace_file_write_ops ctf_write_ops =
ctf_write_status, ctf_write_status,
ctf_write_uploaded_tsv, ctf_write_uploaded_tsv,
ctf_write_uploaded_tp, ctf_write_uploaded_tp,
ctf_write_tdesc,
ctf_write_definition_end, ctf_write_definition_end,
NULL, NULL,
&ctf_write_frame_ops, &ctf_write_frame_ops,

View file

@ -29,6 +29,7 @@
#include "completer.h" #include "completer.h"
#include "filenames.h" #include "filenames.h"
#include "remote.h" #include "remote.h"
#include "xml-tdesc.h"
#ifndef O_LARGEFILE #ifndef O_LARGEFILE
#define O_LARGEFILE 0 #define O_LARGEFILE 0
@ -263,6 +264,42 @@ tfile_write_uploaded_tp (struct trace_file_writer *self,
sizeof (utp->traceframe_usage))); sizeof (utp->traceframe_usage)));
} }
/* 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 == NULL)
return;
/* Write tdesc line by line, prefixing each line with "tdesc ". */
while (ptr != NULL)
{
next = strchr (ptr, '\n');
if (next != NULL)
{
fprintf (writer->fp, "tdesc %.*s\n", (int) (next - ptr), ptr);
/* Skip the \n. */
next++;
}
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 /* This is the implementation of trace_file_write_ops method
write_definition_end. */ write_definition_end. */
@ -316,6 +353,7 @@ static const struct trace_file_write_ops tfile_write_ops =
tfile_write_status, tfile_write_status,
tfile_write_uploaded_tsv, tfile_write_uploaded_tsv,
tfile_write_uploaded_tp, tfile_write_uploaded_tp,
tfile_write_tdesc,
tfile_write_definition_end, tfile_write_definition_end,
tfile_write_raw_data, tfile_write_raw_data,
NULL, NULL,

View file

@ -90,6 +90,9 @@ trace_save (const char *filename, struct trace_file_writer *writer,
/* Write out the size of a register block. */ /* Write out the size of a register block. */
writer->ops->write_regblock_type (writer, trace_regblock_size); 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). */ /* Write out status of the tracing run (aka "tstatus" info). */
writer->ops->write_status (writer, ts); writer->ops->write_status (writer, ts);

View file

@ -84,6 +84,9 @@ struct trace_file_write_ops
void (*write_uploaded_tp) (struct trace_file_writer *self, void (*write_uploaded_tp) (struct trace_file_writer *self,
struct uploaded_tp *tp); struct uploaded_tp *tp);
/* Write target description. */
void (*write_tdesc) (struct trace_file_writer *self);
/* Write to mark the end of the definition part. */ /* Write to mark the end of the definition part. */
void (*write_definition_end) (struct trace_file_writer *self); void (*write_definition_end) (struct trace_file_writer *self);

View file

@ -630,3 +630,33 @@ target_read_description_xml (struct target_ops *ops)
return tdesc; return tdesc;
} }
/* 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)
{
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);
do_cleanups (back_to);
if (expanded_text == NULL)
{
warning (_("Could not load XML target description; ignoring"));
return NULL;
}
return expanded_text;
}

View file

@ -31,3 +31,9 @@ const struct target_desc *file_read_description_xml (const char *filename);
parsed description. */ parsed description. */
const struct target_desc *target_read_description_xml (struct target_ops *); 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);