diff options
-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 | 7 | ||||
-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 | 7 | ||||
-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, 41 insertions, 87 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 a31283f..1c7f146 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 f13d391..b78ea4f 100644 --- a/gdb/extension.c +++ b/gdb/extension.c @@ -563,7 +563,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 793a66f..fc6020a 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; @@ -307,7 +307,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 1a04488..0928e24 100644 --- a/gdb/gdbtypes.c +++ b/gdb/gdbtypes.c @@ -5407,46 +5407,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 * @@ -5478,27 +5438,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 7fdb377..4cdc48b 100644 --- a/gdb/gdbtypes.h +++ b/gdb/gdbtypes.h @@ -44,14 +44,13 @@ 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> #include "gdbsupport/enum-flags.h" #include "dwarf2.h" #include "gdbsupport/gdb_obstack.h" #include "gmp-utils.h" +#include "gdbsupport/unordered_map.h" /* Forward declarations for prototypes. */ struct field; @@ -2785,10 +2784,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 9b9bb21..fbf6898 100644 --- a/gdb/guile/guile-internal.h +++ b/gdb/guile/guile-internal.h @@ -603,7 +603,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 284960a..11a96d5 100644 --- a/gdb/python/py-type.c +++ b/gdb/python/py-type.c @@ -1174,15 +1174,14 @@ 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 ()); + copied_types.clear (); + 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 eef3841..1e8e58a 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 d723c4d..a3a7294 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 |