X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fxml-tdesc.c;h=6f108a4e3ef620361b2f611efbfd251964662519;hb=aa1f7fb133a5a4f95af8286f58b689d6ae131488;hp=9190d5f3c64ffdc6d7987d651527f597d695c5a6;hpb=4d0fdd9b357aff1fea3ef3def55d12464a41bf5b;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c index 9190d5f3c6..6f108a4e3e 100644 --- a/gdb/xml-tdesc.c +++ b/gdb/xml-tdesc.c @@ -1,6 +1,6 @@ /* XML target description support for GDB. - Copyright (C) 2006-2018 Free Software Foundation, Inc. + Copyright (C) 2006-2020 Free Software Foundation, Inc. Contributed by CodeSourcery. @@ -66,7 +66,7 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher, then we will create unnecessary duplicate gdbarches. See gdbarch_list_lookup_by_info. */ -static std::unordered_map xml_cache; +static std::unordered_map xml_cache; /* Callback data for target description parsing. */ @@ -637,25 +637,22 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher, previously parsed. */ const auto it = xml_cache.find (expanded_text); if (it != xml_cache.end ()) - return it->second; + return it->second.get (); memset (&data, 0, sizeof (struct tdesc_parsing_data)); - data.tdesc = allocate_target_description (); - struct cleanup *result_cleanup - = make_cleanup_free_target_description (data.tdesc); + target_desc_up description (allocate_target_description ()); + data.tdesc = description.get (); if (gdb_xml_parse_quick (_("target description"), "gdb-target.dtd", tdesc_elements, expanded_text.c_str (), &data) == 0) { /* Parsed successfully. */ - xml_cache.emplace (std::move (expanded_text), data.tdesc); - discard_cleanups (result_cleanup); + xml_cache.emplace (std::move (expanded_text), std::move (description)); return data.tdesc; } else { warning (_("Could not load XML target description; ignoring")); - do_cleanups (result_cleanup); return NULL; } } @@ -668,15 +665,15 @@ tdesc_parse_xml (const char *document, xml_fetch_another fetcher, const struct target_desc * file_read_description_xml (const char *filename) { - gdb::unique_xmalloc_ptr tdesc_str + gdb::optional tdesc_str = xml_fetch_content_from_file (filename, NULL); - if (tdesc_str == NULL) + if (!tdesc_str) { warning (_("Could not open \"%s\""), filename); return NULL; } - return tdesc_parse_xml (tdesc_str.get (), xml_fetch_content_from_file, + return tdesc_parse_xml (tdesc_str->data (), xml_fetch_content_from_file, (void *) ldirname (filename).c_str ()); } @@ -687,7 +684,7 @@ file_read_description_xml (const char *filename) is "target.xml". Other calls may be performed for the DTD or for . */ -static gdb::unique_xmalloc_ptr +static gdb::optional fetch_available_features_from_target (const char *name, void *baton_) { struct target_ops *ops = (struct target_ops *) baton_; @@ -706,12 +703,12 @@ fetch_available_features_from_target (const char *name, void *baton_) const struct target_desc * target_read_description_xml (struct target_ops *ops) { - gdb::unique_xmalloc_ptr tdesc_str + gdb::optional tdesc_str = fetch_available_features_from_target ("target.xml", ops); - if (tdesc_str == NULL) + if (!tdesc_str) return NULL; - return tdesc_parse_xml (tdesc_str.get (), + return tdesc_parse_xml (tdesc_str->data (), fetch_available_features_from_target, ops); } @@ -735,15 +732,15 @@ target_fetch_description_xml (struct target_ops *ops) return {}; #else - gdb::unique_xmalloc_ptr + gdb::optional tdesc_str = fetch_available_features_from_target ("target.xml", ops); - if (tdesc_str == NULL) + if (!tdesc_str) return {}; std::string output; if (!xml_process_xincludes (output, _("target description"), - tdesc_str.get (), + tdesc_str->data (), fetch_available_features_from_target, ops, 0)) { warning (_("Could not load XML target description; ignoring")); @@ -752,3 +749,15 @@ target_fetch_description_xml (struct target_ops *ops) return output; #endif } + +/* See xml-tdesc.h. */ + +const struct target_desc * +string_read_description_xml (const char *xml) +{ + return tdesc_parse_xml (xml, [] (const char *href, void *baton) + { + error (_("xincludes are unsupported with this method")); + return gdb::optional (); + }, nullptr); +}