diff options
Diffstat (limited to 'gcc/optabs.c')
-rw-r--r-- | gcc/optabs.c | 70 |
1 files changed, 32 insertions, 38 deletions
diff --git a/gcc/optabs.c b/gcc/optabs.c index 605615d..d55a6bb 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -29,6 +29,7 @@ along with GCC; see the file COPYING3. If not see #include "insn-config.h" #include "rtl.h" #include "tree.h" +#include "tree-hasher.h" #include "stor-layout.h" #include "stringpool.h" #include "varasm.h" @@ -73,20 +74,17 @@ void debug_optab_libfuncs (void); /* Used for libfunc_hash. */ -static hashval_t -hash_libfunc (const void *p) +hashval_t +libfunc_hasher::hash (libfunc_entry *e) { - const struct libfunc_entry *const e = (const struct libfunc_entry *) p; return ((e->mode1 + e->mode2 * NUM_MACHINE_MODES) ^ e->op); } /* Used for libfunc_hash. */ -static int -eq_libfunc (const void *p, const void *q) +bool +libfunc_hasher::equal (libfunc_entry *e1, libfunc_entry *e2) { - const struct libfunc_entry *const e1 = (const struct libfunc_entry *) p; - const struct libfunc_entry *const e2 = (const struct libfunc_entry *) q; return e1->op == e2->op && e1->mode1 == e2->mode1 && e1->mode2 == e2->mode2; } @@ -109,8 +107,7 @@ convert_optab_libfunc (convert_optab optab, enum machine_mode mode1, e.op = optab; e.mode1 = mode1; e.mode2 = mode2; - slot = (struct libfunc_entry **) - htab_find_slot (libfunc_hash, &e, NO_INSERT); + slot = libfunc_hash->find_slot (&e, NO_INSERT); if (!slot) { const struct convert_optab_libcall_d *d @@ -120,8 +117,7 @@ convert_optab_libfunc (convert_optab optab, enum machine_mode mode1, return NULL; d->libcall_gen (optab, d->libcall_basename, mode1, mode2); - slot = (struct libfunc_entry **) - htab_find_slot (libfunc_hash, &e, NO_INSERT); + slot = libfunc_hash->find_slot (&e, NO_INSERT); if (!slot) return NULL; } @@ -146,8 +142,7 @@ optab_libfunc (optab optab, enum machine_mode mode) e.op = optab; e.mode1 = mode; e.mode2 = VOIDmode; - slot = (struct libfunc_entry **) - htab_find_slot (libfunc_hash, &e, NO_INSERT); + slot = libfunc_hash->find_slot (&e, NO_INSERT); if (!slot) { const struct optab_libcall_d *d @@ -157,8 +152,7 @@ optab_libfunc (optab optab, enum machine_mode mode) return NULL; d->libcall_gen (optab, d->libcall_basename, d->libcall_suffix, mode); - slot = (struct libfunc_entry **) - htab_find_slot (libfunc_hash, &e, NO_INSERT); + slot = libfunc_hash->find_slot (&e, NO_INSERT); if (!slot) return NULL; } @@ -6100,22 +6094,25 @@ gen_satfractuns_conv_libfunc (convert_optab tab, gen_interclass_conv_libfunc (tab, opname, tmode, fmode); } -/* A table of previously-created libfuncs, hashed by name. */ -static GTY ((param_is (union tree_node))) htab_t libfunc_decls; - /* Hashtable callbacks for libfunc_decls. */ -static hashval_t -libfunc_decl_hash (const void *entry) +struct libfunc_decl_hasher : ggc_hasher<tree> { - return IDENTIFIER_HASH_VALUE (DECL_NAME ((const_tree) entry)); -} + static hashval_t + hash (tree entry) + { + return IDENTIFIER_HASH_VALUE (DECL_NAME (entry)); + } -static int -libfunc_decl_eq (const void *entry1, const void *entry2) -{ - return DECL_NAME ((const_tree) entry1) == (const_tree) entry2; -} + static bool + equal (tree decl, tree name) + { + return DECL_NAME (decl) == name; + } +}; + +/* A table of previously-created libfuncs, hashed by name. */ +static GTY (()) hash_table<libfunc_decl_hasher> *libfunc_decls; /* Build a decl for a libfunc named NAME. */ @@ -6143,18 +6140,16 @@ rtx init_one_libfunc (const char *name) { tree id, decl; - void **slot; hashval_t hash; if (libfunc_decls == NULL) - libfunc_decls = htab_create_ggc (37, libfunc_decl_hash, - libfunc_decl_eq, NULL); + libfunc_decls = hash_table<libfunc_decl_hasher>::create_ggc (37); /* See if we have already created a libfunc decl for this function. */ id = get_identifier (name); hash = IDENTIFIER_HASH_VALUE (id); - slot = htab_find_slot_with_hash (libfunc_decls, id, hash, INSERT); - decl = (tree) *slot; + tree *slot = libfunc_decls->find_slot_with_hash (id, hash, INSERT); + decl = *slot; if (decl == NULL) { /* Create a new decl, so that it can be passed to @@ -6171,12 +6166,11 @@ rtx set_user_assembler_libfunc (const char *name, const char *asmspec) { tree id, decl; - void **slot; hashval_t hash; id = get_identifier (name); hash = IDENTIFIER_HASH_VALUE (id); - slot = htab_find_slot_with_hash (libfunc_decls, id, hash, NO_INSERT); + tree *slot = libfunc_decls->find_slot_with_hash (id, hash, NO_INSERT); gcc_assert (slot); decl = (tree) *slot; set_user_assembler_name (decl, asmspec); @@ -6200,7 +6194,7 @@ set_optab_libfunc (optab op, enum machine_mode mode, const char *name) val = init_one_libfunc (name); else val = 0; - slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, INSERT); + slot = libfunc_hash->find_slot (&e, INSERT); if (*slot == NULL) *slot = ggc_alloc<libfunc_entry> (); (*slot)->op = op; @@ -6228,7 +6222,7 @@ set_conv_libfunc (convert_optab optab, enum machine_mode tmode, val = init_one_libfunc (name); else val = 0; - slot = (struct libfunc_entry **) htab_find_slot (libfunc_hash, &e, INSERT); + slot = libfunc_hash->find_slot (&e, INSERT); if (*slot == NULL) *slot = ggc_alloc<libfunc_entry> (); (*slot)->op = optab; @@ -6244,9 +6238,9 @@ void init_optabs (void) { if (libfunc_hash) - htab_empty (libfunc_hash); + libfunc_hash->empty (); else - libfunc_hash = htab_create_ggc (10, hash_libfunc, eq_libfunc, NULL); + libfunc_hash = hash_table<libfunc_hasher>::create_ggc (10); /* Fill in the optabs with the insns we support. */ init_all_optabs (this_fn_optabs); |