[1/3] gdb.trace: Save XML target description in tfile.

Message ID 1455135521-21767-1-git-send-email-koriakin@0x04.net
State New, archived
Headers

Commit Message

Marcin Kościelnicki Feb. 10, 2016, 8:18 p.m. UTC
  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.
---
Fixes applied.

 gdb/ChangeLog         | 11 +++++++++++
 gdb/ctf.c             | 10 ++++++++++
 gdb/tracefile-tfile.c | 38 ++++++++++++++++++++++++++++++++++++++
 gdb/tracefile.c       |  3 +++
 gdb/tracefile.h       |  3 +++
 gdb/xml-tdesc.c       | 30 ++++++++++++++++++++++++++++++
 gdb/xml-tdesc.h       |  6 ++++++
 7 files changed, 101 insertions(+)
  

Comments

Pedro Alves Feb. 10, 2016, 10:20 p.m. UTC | #1
On 02/10/2016 08:18 PM, Marcin Kościelnicki wrote:
> 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.

OK.

Thanks,
Pedro Alves
  
Marcin Kościelnicki Feb. 10, 2016, 10:35 p.m. UTC | #2
On 10/02/16 23:20, Pedro Alves wrote:
> On 02/10/2016 08:18 PM, Marcin Kościelnicki wrote:
>> 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.
>
> OK.
>
> Thanks,
> Pedro Alves
>

Thanks, pushed.
  
Simon Marchi Feb. 11, 2016, 7:02 p.m. UTC | #3
On 16-02-10 05:35 PM, Marcin Kościelnicki wrote:
> On 10/02/16 23:20, Pedro Alves wrote:
>> On 02/10/2016 08:18 PM, Marcin Kościelnicki wrote:
>>> 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.
>>
>> OK.
>>
>> Thanks,
>> Pedro Alves
>>
> 
> Thanks, pushed.
> 

Hi Marcin,

Did you get an email from Builbot about this patch?

An unrelated patch did fail because of this one:
http://gdb-build.sergiodj.net/builders/Fedora-i686/builds/3021/steps/compile%20gdb/logs/stdio

It happens when you build without expat.  Maybe this particular slave doesn't have expat-devel
installed, but others do.  You can reproduce it locally by configuring with --with-expat=no or
--without-expat.

@Sergio: To ensure that we always test in the same conditions, perhaps we could add --with-expat,
--with-python, and maybe others?  Can it be done on a per-builder basis?

This way, if the slave for a builder is mis-configured (doesn't have development packages for
those), configure will fail right away.  In an ideal world, to catch problems like the current
one though, we should test gdb (at least see if it builds) with various combinations of
with/without python, expat, etc.
  
Sergio Durigan Junior Feb. 11, 2016, 9:28 p.m. UTC | #4
On Thursday, February 11 2016, Simon Marchi wrote:

> On 16-02-10 05:35 PM, Marcin Kościelnicki wrote:
>> On 10/02/16 23:20, Pedro Alves wrote:
>>> On 02/10/2016 08:18 PM, Marcin Kościelnicki wrote:
>>>> 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.
>>>
>>> OK.
>>>
>>> Thanks,
>>> Pedro Alves
>>>
>> 
>> Thanks, pushed.
>> 
>
> Hi Marcin,
>
> Did you get an email from Builbot about this patch?
>
> An unrelated patch did fail because of this one:
> http://gdb-build.sergiodj.net/builders/Fedora-i686/builds/3021/steps/compile%20gdb/logs/stdio
>
> It happens when you build without expat.  Maybe this particular slave doesn't have expat-devel
> installed, but others do.  You can reproduce it locally by configuring with --with-expat=no or
> --without-expat.

This was my fault.  I run two Fedora buildslaves for x86, and one of
them did not have the i686 packages installed.  Everything should be
fine now.

BTW, I am really interested in knowing if Marcin received an e-mail from
BuildBot.  Simon, did you receive an e-mail as well?

> @Sergio: To ensure that we always test in the same conditions, perhaps we could add --with-expat,
> --with-python, and maybe others?  Can it be done on a per-builder basis?

This could be a good idea.  One of the problems I have is ensure that
all the buildslaves have a minimum set of packages installed for
testing.  I tried listing all the packages I could in the wiki:

  <https://sourceware.org/gdb/wiki/BuildBot#Buildslave_configuration>

But it's not easy to guarantee that all of them are following this.
Enforcing compliance through the use of some flags (--with-*) could help
us to bring everybody up to speed.  The only problem is that we'll see
some failures happening when a buildslave is not configured properly,
and that may seem like a failure introduced by a patch.  But I'm
guessing they'll be quick to fix.

> This way, if the slave for a builder is mis-configured (doesn't have development packages for
> those), configure will fail right away.  In an ideal world, to catch problems like the current
> one though, we should test gdb (at least see if it builds) with various combinations of
> with/without python, expat, etc.

The problem is that we don't have enough buildslaves now to handle
several combinations of flags.  For now, I think it's enough to test the
"normal" configuration.

Thanks,
  
Marcin Kościelnicki Feb. 11, 2016, 10:31 p.m. UTC | #5
On 11/02/16 20:02, Simon Marchi wrote:
> On 16-02-10 05:35 PM, Marcin Kościelnicki wrote:
>> On 10/02/16 23:20, Pedro Alves wrote:
>>> On 02/10/2016 08:18 PM, Marcin Kościelnicki wrote:
>>>> 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.
>>>
>>> OK.
>>>
>>> Thanks,
>>> Pedro Alves
>>>
>>
>> Thanks, pushed.
>>
>
> Hi Marcin,
>
> Did you get an email from Builbot about this patch?
>
> An unrelated patch did fail because of this one:
> http://gdb-build.sergiodj.net/builders/Fedora-i686/builds/3021/steps/compile%20gdb/logs/stdio
>
> It happens when you build without expat.  Maybe this particular slave doesn't have expat-devel
> installed, but others do.  You can reproduce it locally by configuring with --with-expat=no or
> --without-expat.
>
> @Sergio: To ensure that we always test in the same conditions, perhaps we could add --with-expat,
> --with-python, and maybe others?  Can it be done on a per-builder basis?
>
> This way, if the slave for a builder is mis-configured (doesn't have development packages for
> those), configure will fail right away.  In an ideal world, to catch problems like the current
> one though, we should test gdb (at least see if it builds) with various combinations of
> with/without python, expat, etc.
>

I didn't get any email about the breakage before this one.

Thanks for noticing that.  Sorry for the problem, I'll submit a patch soon.
  

Patch

diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 07411d8..77412ca 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -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>
 
 	* arm-tdep.c (arm_copy_extra_ld_st): Fix "unpriveleged" typo.
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 8b42aba..c87f61d 100644
--- a/gdb/tracefile-tfile.c
+++ b/gdb/tracefile-tfile.c
@@ -29,6 +29,7 @@ 
 #include "completer.h"
 #include "filenames.h"
 #include "remote.h"
+#include "xml-tdesc.h"
 
 #ifndef O_LARGEFILE
 #define O_LARGEFILE 0
@@ -264,6 +265,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 == 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
    write_definition_end.  */
 
 static void
@@ -316,6 +353,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..4625b60 100644
--- a/gdb/xml-tdesc.c
+++ b/gdb/xml-tdesc.c
@@ -630,3 +630,33 @@  target_read_description_xml (struct target_ops *ops)
 
   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;
+}
diff --git a/gdb/xml-tdesc.h b/gdb/xml-tdesc.h
index a0c38d7..70a1ebb 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);