aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2019-01-02 08:03:13 -0700
committerTom Tromey <tom@tromey.com>2019-01-02 16:40:11 -0700
commitc55d06ec95961fadd9deeffae519ff0f20f237d3 (patch)
treed29af475537221052acb1202b40769ddf1491a9a /gdb
parent3a6ae42d4e4ecfd2441cf9b978b2a54ad6767cb7 (diff)
downloadbinutils-c55d06ec95961fadd9deeffae519ff0f20f237d3.zip
binutils-c55d06ec95961fadd9deeffae519ff0f20f237d3.tar.gz
binutils-c55d06ec95961fadd9deeffae519ff0f20f237d3.tar.bz2
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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog12
-rw-r--r--gdb/target-descriptions.c12
-rw-r--r--gdb/target-descriptions.h13
-rw-r--r--gdb/xml-tdesc.c13
4 files changed, 31 insertions, 19 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 04030ec..92ba43d 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,5 +1,17 @@
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
constructor, destructor.
(linespec_parser): Remove typedef.
diff --git a/gdb/target-descriptions.c b/gdb/target-descriptions.c
index efea97e..f04b8fc 100644
--- a/gdb/target-descriptions.c
+++ b/gdb/target-descriptions.c
@@ -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)
diff --git a/gdb/target-descriptions.h b/gdb/target-descriptions.h
index 402bef5..fe07d42 100644
--- a/gdb/target-descriptions.h
+++ b/gdb/target-descriptions.h
@@ -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);
diff --git a/gdb/xml-tdesc.c b/gdb/xml-tdesc.c
index 601ffe6..7588cb0 100644
--- a/gdb/xml-tdesc.c
+++ b/gdb/xml-tdesc.c
@@ -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;
}
}