aboutsummaryrefslogtreecommitdiff
path: root/gdb/target-descriptions.c
diff options
context:
space:
mode:
authorSimon Marchi <simon.marchi@ericsson.com>2018-07-31 10:06:00 -0400
committerSimon Marchi <simon.marchi@ericsson.com>2018-07-31 10:06:00 -0400
commit1c28969efcca7c214e41c496f599bc4de2c56dbe (patch)
tree9c9e936f78bd753835d67b3bd1b4ded178665754 /gdb/target-descriptions.c
parent1424ad867742286be44932bf29720539add19ae0 (diff)
downloadgdb-1c28969efcca7c214e41c496f599bc4de2c56dbe.zip
gdb-1c28969efcca7c214e41c496f599bc4de2c56dbe.tar.gz
gdb-1c28969efcca7c214e41c496f599bc4de2c56dbe.tar.bz2
Delete test target descriptions when exiting
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.
Diffstat (limited to 'gdb/target-descriptions.c')
-rw-r--r--gdb/target-descriptions.c26
1 files changed, 19 insertions, 7 deletions
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index a96416c..087de14 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -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"),