diff options
author | Simon Marchi <simon.marchi@efficios.com> | 2024-08-19 15:03:51 +0000 |
---|---|---|
committer | Simon Marchi <simon.marchi@efficios.com> | 2024-08-23 14:37:54 -0400 |
commit | 4c81a25468742588d59723b9182fb357d2bd0a7c (patch) | |
tree | 478c0b777a10b65dbb80ada2fa4330dc8170ae5e | |
parent | d30767bbdcae6cc27916c8ef3cec996bee95f87c (diff) | |
download | gdb-4c81a25468742588d59723b9182fb357d2bd0a7c.zip gdb-4c81a25468742588d59723b9182fb357d2bd0a7c.tar.gz gdb-4c81a25468742588d59723b9182fb357d2bd0a7c.tar.bz2 |
Convert type copying to new hash table
This converts the type copying code to use the new hash map.
Change-Id: I35f0a4946dcc5c5eb84820126cf716b600f3302f
Co-Authored-By: Tom Tromey <tom@tromey.com>
-rw-r--r-- | gdb/compile/compile-object-run.c | 6 | ||||
-rw-r--r-- | gdb/extension-priv.h | 3 | ||||
-rw-r--r-- | gdb/extension.c | 3 | ||||
-rw-r--r-- | gdb/extension.h | 5 | ||||
-rw-r--r-- | gdb/gdbtypes.c | 59 | ||||
-rw-r--r-- | gdb/gdbtypes.h | 6 | ||||
-rw-r--r-- | gdb/guile/guile-internal.h | 2 | ||||
-rw-r--r-- | gdb/guile/scm-type.c | 7 | ||||
-rw-r--r-- | gdb/guile/scm-value.c | 3 | ||||
-rw-r--r-- | gdb/python/py-type.c | 6 | ||||
-rw-r--r-- | gdb/python/py-value.c | 3 | ||||
-rw-r--r-- | gdb/python/python-internal.h | 2 | ||||
-rw-r--r-- | gdb/value.c | 17 | ||||
-rw-r--r-- | gdb/value.h | 4 |
14 files changed, 40 insertions, 86 deletions
diff --git a/gdb/compile/compile-object-run.c b/gdb/compile/compile-object-run.c index 5a810d5..8316377 100644 --- a/gdb/compile/compile-object-run.c +++ b/gdb/compile/compile-object-run.c @@ -105,9 +105,9 @@ do_module_cleanup (void *arg, int registers_valid) static type * create_copied_type_recursive (objfile *objfile, type *func_type) { - htab_up copied_types = create_copied_types_hash (); - func_type = copy_type_recursive (func_type, copied_types.get ()); - return func_type; + copied_types_hash_t copied_types; + + return copy_type_recursive (func_type, copied_types); } /* Perform inferior call of MODULE. This function may throw an error. diff --git a/gdb/extension-priv.h b/gdb/extension-priv.h index 653fd51..c14143e 100644 --- a/gdb/extension-priv.h +++ b/gdb/extension-priv.h @@ -201,7 +201,8 @@ struct extension_language_ops COPIED_TYPES is used to prevent cycles / duplicates and is passed to preserve_one_value. */ void (*preserve_values) (const struct extension_language_defn *, - struct objfile *objfile, htab_t copied_types); + struct objfile *objfile, + copied_types_hash_t &copied_types); /* Return non-zero if there is a stop condition for the breakpoint. This is used to implement the restriction that a breakpoint may have diff --git a/gdb/extension.c b/gdb/extension.c index c488fc7..223a706 100644 --- a/gdb/extension.c +++ b/gdb/extension.c @@ -584,7 +584,8 @@ apply_ext_lang_ptwrite_filter (btrace_thread_info *btinfo) preserve_one_value. */ void -preserve_ext_lang_values (struct objfile *objfile, htab_t copied_types) +preserve_ext_lang_values (struct objfile *objfile, + copied_types_hash_t &copied_types) { for (const struct extension_language_defn *extlang : extension_languages) { diff --git a/gdb/extension.h b/gdb/extension.h index 5b0830b..8a70e72 100644 --- a/gdb/extension.h +++ b/gdb/extension.h @@ -22,8 +22,8 @@ #include "mi/mi-cmds.h" #include "gdbsupport/array-view.h" -#include "hashtab.h" #include <optional> +#include "gdbtypes.h" struct breakpoint; struct command_line; @@ -306,7 +306,8 @@ extern enum ext_lang_bt_status apply_ext_lang_frame_filter extern void apply_ext_lang_ptwrite_filter (struct btrace_thread_info *btinfo); -extern void preserve_ext_lang_values (struct objfile *, htab_t copied_types); +extern void preserve_ext_lang_values (struct objfile *, + copied_types_hash_t &copied_types); extern const struct extension_language_defn *get_breakpoint_cond_ext_lang (struct breakpoint *b, enum extension_language skip_lang); diff --git a/gdb/gdbtypes.c b/gdb/gdbtypes.c index f39fe3d..30950d2 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -5372,46 +5372,6 @@ recursive_dump_type (struct type *type, int spaces) obstack_free (&dont_print_type_obstack, NULL); } -/* Trivial helpers for the libiberty hash table, for mapping one - type to another. */ - -struct type_pair -{ - type_pair (struct type *old_, struct type *newobj_) - : old (old_), newobj (newobj_) - {} - - struct type * const old, * const newobj; -}; - -static hashval_t -type_pair_hash (const void *item) -{ - const struct type_pair *pair = (const struct type_pair *) item; - - return htab_hash_pointer (pair->old); -} - -static int -type_pair_eq (const void *item_lhs, const void *item_rhs) -{ - const struct type_pair *lhs = (const struct type_pair *) item_lhs; - const struct type_pair *rhs = (const struct type_pair *) item_rhs; - - return lhs->old == rhs->old; -} - -/* Allocate the hash table used by copy_type_recursive to walk - types without duplicates. */ - -htab_up -create_copied_types_hash () -{ - return htab_up (htab_create_alloc (1, type_pair_hash, type_pair_eq, - htab_delete_entry<type_pair>, - xcalloc, xfree)); -} - /* Recursively copy (deep copy) a dynamic attribute list of a type. */ static struct dynamic_prop_list * @@ -5443,27 +5403,20 @@ copy_dynamic_prop_list (struct obstack *storage, it is not associated with OBJFILE. */ struct type * -copy_type_recursive (struct type *type, htab_t copied_types) +copy_type_recursive (struct type *type, copied_types_hash_t &copied_types) { - void **slot; - struct type *new_type; - if (!type->is_objfile_owned ()) return type; - struct type_pair pair (type, nullptr); + if (auto iter = copied_types.find (type); + iter != copied_types.end ()) + return iter->second; - slot = htab_find_slot (copied_types, &pair, INSERT); - if (*slot != NULL) - return ((struct type_pair *) *slot)->newobj; - - new_type = type_allocator (type->arch ()).new_type (); + struct type *new_type = type_allocator (type->arch ()).new_type (); /* We must add the new type to the hash table immediately, in case we encounter this type again during a recursive call below. */ - struct type_pair *stored = new type_pair (type, new_type); - - *slot = stored; + copied_types.emplace (type, new_type); /* Copy the common fields of types. For the main type, we simply copy the entire thing and then update specific fields as needed. */ diff --git a/gdb/gdbtypes.h b/gdb/gdbtypes.h index f80bd7e..2d7507e 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -44,7 +44,6 @@ written such that they can be used as both rvalues and lvalues. */ -#include "hashtab.h" #include "gdbsupport/array-view.h" #include "gdbsupport/gdb-hashtab.h" #include <optional> @@ -56,6 +55,7 @@ #include "dwarf2.h" #include "gdbsupport/gdb_obstack.h" #include "gmp-utils.h" +#include "gdbsupport/unordered_map.h" /* Forward declarations for prototypes. */ struct field; @@ -2789,10 +2789,10 @@ extern int class_or_union_p (const struct type *); extern void maintenance_print_type (const char *, int); -extern htab_up create_copied_types_hash (); +using copied_types_hash_t = gdb::unordered_map<type *, type *>; extern struct type *copy_type_recursive (struct type *type, - htab_t copied_types); + copied_types_hash_t &copied_types); extern struct type *copy_type (const struct type *type); diff --git a/gdb/guile/guile-internal.h b/gdb/guile/guile-internal.h index dea7884..e87e5db 100644 --- a/gdb/guile/guile-internal.h +++ b/gdb/guile/guile-internal.h @@ -596,7 +596,7 @@ extern bool gdbscm_auto_load_enabled (const struct extension_language_defn *); extern void gdbscm_preserve_values (const struct extension_language_defn *, - struct objfile *, htab_t copied_types); + struct objfile *, copied_types_hash_t &copied_types); extern enum ext_lang_rc gdbscm_apply_val_pretty_printer (const struct extension_language_defn *, diff --git a/gdb/guile/scm-type.c b/gdb/guile/scm-type.c index 19324a6..f228762 100644 --- a/gdb/guile/scm-type.c +++ b/gdb/guile/scm-type.c @@ -94,8 +94,8 @@ struct tyscm_deleter return; gdb_assert (htab != nullptr); - htab_up copied_types = create_copied_types_hash (); - htab_traverse_noresize (htab, tyscm_copy_type_recursive, copied_types.get ()); + copied_types_hash_t copied_types; + htab_traverse_noresize (htab, tyscm_copy_type_recursive, &copied_types); htab_delete (htab); } }; @@ -375,12 +375,11 @@ static int tyscm_copy_type_recursive (void **slot, void *info) { type_smob *t_smob = (type_smob *) *slot; - htab_t copied_types = (htab_t) info; + copied_types_hash_t &copied_types = *static_cast<copied_types_hash_t *> (info); htab_t htab; eqable_gdb_smob **new_slot; type_smob t_smob_for_lookup; - htab_empty (copied_types); t_smob->type = copy_type_recursive (t_smob->type, copied_types); /* The eq?-hashtab that the type lived in is going away. diff --git a/gdb/guile/scm-value.c b/gdb/guile/scm-value.c index a7b2170..0f4a6a4 100644 --- a/gdb/guile/scm-value.c +++ b/gdb/guile/scm-value.c @@ -86,7 +86,8 @@ static SCM substitute_symbol; void gdbscm_preserve_values (const struct extension_language_defn *extlang, - struct objfile *objfile, htab_t copied_types) + struct objfile *objfile, + copied_types_hash_t &copied_types) { value_smob *iter; diff --git a/gdb/python/py-type.c b/gdb/python/py-type.c index c13b861..3343000 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -1174,15 +1174,13 @@ struct typy_deleter operating on. */ gdbpy_enter enter_py; - htab_up copied_types = create_copied_types_hash (); + copied_types_hash_t copied_types; while (obj) { type_object *next = obj->next; - htab_empty (copied_types.get ()); - - obj->type = copy_type_recursive (obj->type, copied_types.get ()); + obj->type = copy_type_recursive (obj->type, copied_types); obj->next = NULL; obj->prev = NULL; diff --git a/gdb/python/py-value.c b/gdb/python/py-value.c index 4980076..06b7038 100644 --- a/gdb/python/py-value.c +++ b/gdb/python/py-value.c @@ -233,7 +233,8 @@ valpy_init (PyObject *self, PyObject *args, PyObject *kwds) each. */ void gdbpy_preserve_values (const struct extension_language_defn *extlang, - struct objfile *objfile, htab_t copied_types) + struct objfile *objfile, + copied_types_hash_t &copied_types) { value_object *iter; diff --git a/gdb/python/python-internal.h b/gdb/python/python-internal.h index bf3ab67..4f4f088 100644 --- a/gdb/python/python-internal.h +++ b/gdb/python/python-internal.h @@ -474,7 +474,7 @@ extern enum ext_lang_bt_status gdbpy_apply_frame_filter struct ui_out *out, int frame_low, int frame_high); extern void gdbpy_preserve_values (const struct extension_language_defn *, struct objfile *objfile, - htab_t copied_types); + copied_types_hash_t &copied_types); extern enum ext_lang_bp_stop gdbpy_breakpoint_cond_says_stop (const struct extension_language_defn *, struct breakpoint *); extern int gdbpy_breakpoint_has_cond (const struct extension_language_defn *, diff --git a/gdb/value.c b/gdb/value.c index d9b3c6e..a184916 100644 --- a/gdb/value.c +++ b/gdb/value.c @@ -2468,7 +2468,7 @@ add_internal_function (gdb::unique_xmalloc_ptr<char> &&name, } void -value::preserve (struct objfile *objfile, htab_t copied_types) +value::preserve (struct objfile *objfile, copied_types_hash_t &copied_types) { if (m_type->objfile_owner () == objfile) m_type = copy_type_recursive (m_type, copied_types); @@ -2481,7 +2481,7 @@ value::preserve (struct objfile *objfile, htab_t copied_types) static void preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, - htab_t copied_types) + copied_types_hash_t &copied_types) { switch (var->kind) { @@ -2504,7 +2504,7 @@ preserve_one_internalvar (struct internalvar *var, struct objfile *objfile, static void preserve_one_varobj (struct varobj *varobj, struct objfile *objfile, - htab_t copied_types) + copied_types_hash_t &copied_types) { if (varobj->type->is_objfile_owned () && varobj->type->objfile_owner () == objfile) @@ -2528,22 +2528,21 @@ preserve_values (struct objfile *objfile) { /* Create the hash table. We allocate on the objfile's obstack, since it is soon to be deleted. */ - htab_up copied_types = create_copied_types_hash (); + copied_types_hash_t copied_types; for (const value_ref_ptr &item : value_history) - item->preserve (objfile, copied_types.get ()); + item->preserve (objfile, copied_types); for (auto &pair : internalvars) - preserve_one_internalvar (&pair.second, objfile, copied_types.get ()); + preserve_one_internalvar (&pair.second, objfile, copied_types); /* For the remaining varobj, check that none has type owned by OBJFILE. */ all_root_varobjs ([&copied_types, objfile] (struct varobj *varobj) { - preserve_one_varobj (varobj, objfile, - copied_types.get ()); + preserve_one_varobj (varobj, objfile, copied_types); }); - preserve_ext_lang_values (objfile, copied_types.get ()); + preserve_ext_lang_values (objfile, copied_types); } static void diff --git a/gdb/value.h b/gdb/value.h index 13cfb00..c8166a7 100644 --- a/gdb/value.h +++ b/gdb/value.h @@ -24,12 +24,12 @@ #include "extension.h" #include "gdbsupport/gdb_ref_ptr.h" #include "gmp-utils.h" +#include "gdbtypes.h" struct block; struct expression; struct regcache; struct symbol; -struct type; struct ui_file; struct language_defn; struct value_print_options; @@ -593,7 +593,7 @@ public: /* Update this value before discarding OBJFILE. COPIED_TYPES is used to prevent cycles / duplicates. */ - void preserve (struct objfile *objfile, htab_t copied_types); + void preserve (struct objfile *objfile, copied_types_hash_t &copied_types); /* Unpack a bitfield of BITSIZE bits found at BITPOS in the object at VALADDR + EMBEDDEDOFFSET that has the type of DEST_VAL and |