mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-27 03:51:15 +08:00
Remove a cleanup from target-descriptions.c
This removes a cleanup from target-descriptions.c, by changing it to use a unique_ptr instead. Note that a deletion adapter is used, even though target_desc is allocated with new, to avoid moving target_desc to target-descriptions.h. gdb/ChangeLog 2019-01-02 Tom Tromey <tom@tromey.com> * xml-tdesc.c (xml_cache): Hold a target_desc_up. (tdesc_parse_xml): Remove cleanups. * target-descriptions.h (make_cleanup_free_target_description): Don't declare. (target_desc_deleter): New struct. (target_desc_up): New typedef. * target-descriptions.c (target_desc_deleter::operator()): Rename from free_target_description. (make_cleanup_free_target_description): Remove.
This commit is contained in:
parent
3a6ae42d4e
commit
c55d06ec95
@ -1,3 +1,15 @@
|
||||
2019-01-02 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* xml-tdesc.c (xml_cache): Hold a target_desc_up.
|
||||
(tdesc_parse_xml): Remove cleanups.
|
||||
* target-descriptions.h (make_cleanup_free_target_description):
|
||||
Don't declare.
|
||||
(target_desc_deleter): New struct.
|
||||
(target_desc_up): New typedef.
|
||||
* target-descriptions.c (target_desc_deleter::operator()): Rename
|
||||
from free_target_description.
|
||||
(make_cleanup_free_target_description): Remove.
|
||||
|
||||
2019-01-02 Tom Tromey <tom@tromey.com>
|
||||
|
||||
* linespec.c (struct linespec_parser): Rename from ls_parser. Add
|
||||
|
@ -1138,20 +1138,12 @@ allocate_target_description (void)
|
||||
return new target_desc ();
|
||||
}
|
||||
|
||||
static void
|
||||
free_target_description (void *arg)
|
||||
void
|
||||
target_desc_deleter::operator() (struct target_desc *target_desc) const
|
||||
{
|
||||
struct target_desc *target_desc = (struct target_desc *) arg;
|
||||
|
||||
delete target_desc;
|
||||
}
|
||||
|
||||
struct cleanup *
|
||||
make_cleanup_free_target_description (struct target_desc *target_desc)
|
||||
{
|
||||
return make_cleanup (free_target_description, target_desc);
|
||||
}
|
||||
|
||||
void
|
||||
tdesc_add_compatible (struct target_desc *target_desc,
|
||||
const struct bfd_arch_info *compatible)
|
||||
|
@ -199,9 +199,20 @@ struct type *tdesc_find_type (struct gdbarch *gdbarch, const char *id);
|
||||
int tdesc_register_in_reggroup_p (struct gdbarch *gdbarch, int regno,
|
||||
struct reggroup *reggroup);
|
||||
|
||||
|
||||
/* A deleter adapter for a target desc. */
|
||||
|
||||
struct target_desc_deleter
|
||||
{
|
||||
void operator() (struct target_desc *desc) const;
|
||||
};
|
||||
|
||||
/* A unique pointer specialization that holds a target_desc. */
|
||||
|
||||
typedef std::unique_ptr<target_desc, target_desc_deleter> target_desc_up;
|
||||
|
||||
/* Methods for constructing a target description. */
|
||||
|
||||
struct cleanup *make_cleanup_free_target_description (struct target_desc *);
|
||||
void set_tdesc_architecture (struct target_desc *,
|
||||
const struct bfd_arch_info *);
|
||||
void set_tdesc_osabi (struct target_desc *, enum gdb_osabi osabi);
|
||||
|
@ -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<std::string, target_desc *> xml_cache;
|
||||
static std::unordered_map<std::string, target_desc_up> 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;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user