Delete test target descriptions when exiting
authorSimon Marchi <simon.marchi@ericsson.com>
Tue, 31 Jul 2018 14:06:00 +0000 (10:06 -0400)
committerSimon Marchi <simon.marchi@ericsson.com>
Tue, 31 Jul 2018 14:06:00 +0000 (10:06 -0400)
Looking at the address sanitizer output, this was a quite low hanging
fruit.  We create target_desc objects for testing that we never free.
Saving them in unique_ptrs takes care of it.

I created a small struct to hold these because I thought it would help
readability.

gdb/ChangeLog:

* target-descriptions.c (struct xml_test_tdesc): New.
(xml_tdesc): Change type to std::vector<xml_test_tdesc>.
(record_xml_tdesc): Update.
(maintenance_check_xml_descriptions): Update.
* target-descriptions.h (record_xml_tdesc): Update comment.

gdb/ChangeLog
gdb/target-descriptions.c
gdb/target-descriptions.h

index 6d5b24c1e11fbba04514e462d5f3295a32a9c86b..1fbe025be8cebdb7cc7df01c5a74557eea9e5981 100644 (file)
@@ -1,3 +1,11 @@
+2018-07-31  Simon Marchi  <simon.marchi@ericsson.com>
+
+       * target-descriptions.c (struct xml_test_tdesc): New.
+       (xml_tdesc): Change type to std::vector<xml_test_tdesc>.
+       (record_xml_tdesc): Update.
+       (maintenance_check_xml_descriptions): Update.
+       * target-descriptions.h (record_xml_tdesc): Update comment.
+
 2018-07-30  Andrew Burgess  <andrew.burgess@embecosm.com>
 
        * eval.c (evaluate_subexp_for_sizeof): Check for array type before
index a96416cd3cc94faf213cf576e9eac31524baa3ab..087de141f7f9fad75bcc27e046c5cfc8d2961081 100644 (file)
@@ -1734,7 +1734,19 @@ maint_print_c_tdesc_cmd (const char *args, int from_tty)
 
 namespace selftests {
 
-static std::vector<std::pair<const char*, const target_desc *>> xml_tdesc;
+/* A reference target description, used for testing (see record_xml_tdesc).  */
+
+struct xml_test_tdesc
+{
+  xml_test_tdesc (const char *name, std::unique_ptr<const target_desc> &&tdesc)
+    : name (name), tdesc (std::move (tdesc))
+  {}
+
+  const char *name;
+  std::unique_ptr<const target_desc> tdesc;
+};
+
+static std::vector<xml_test_tdesc> xml_tdesc;
 
 #if GDB_SELF_TEST
 
@@ -1743,7 +1755,7 @@ static std::vector<std::pair<const char*, const target_desc *>> xml_tdesc;
 void
 record_xml_tdesc (const char *xml_file, const struct target_desc *tdesc)
 {
-  xml_tdesc.emplace_back (xml_file, tdesc);
+  xml_tdesc.emplace_back (xml_file, std::unique_ptr<const target_desc> (tdesc));
 }
 #endif
 
@@ -1798,17 +1810,17 @@ maintenance_check_xml_descriptions (const char *dir, int from_tty)
 
   for (auto const &e : selftests::xml_tdesc)
     {
-      std::string tdesc_xml = (feature_dir + SLASH_STRING + e.first);
+      std::string tdesc_xml = (feature_dir + SLASH_STRING + e.name);
       const target_desc *tdesc
        = file_read_description_xml (tdesc_xml.data ());
 
-      if (tdesc == NULL || *tdesc != *e.second)
+      if (tdesc == NULL || *tdesc != *e.tdesc)
        {
-         printf_filtered ( _("Descriptions for %s do not match.\n"), e.first);
+         printf_filtered ( _("Descriptions for %s do not match.\n"), e.name);
          failed++;
        }
-      else if (!maintenance_check_tdesc_xml_convert (tdesc, e.first)
-              || !maintenance_check_tdesc_xml_convert (e.second, e.first))
+      else if (!maintenance_check_tdesc_xml_convert (tdesc, e.name)
+              || !maintenance_check_tdesc_xml_convert (e.tdesc.get (), e.name))
        failed++;
     }
   printf_filtered (_("Tested %lu XML files, %d failed\n"),
index 87403acc0d4d3dc7da4f2ca12c4778d5b9a5d353..96290b7d97ea27776b675224cb397b4dc680c4e0 100644 (file)
@@ -215,7 +215,7 @@ namespace selftests {
 
 /* Record that XML_FILE should generate a target description that equals
    TDESC, to be verified by the "maintenance check xml-descriptions"
-   command.  */
+   command.  This function takes ownership of TDESC.  */
 
 void record_xml_tdesc (const char *xml_file,
                       const struct target_desc *tdesc);