On 06/16/2015 02:55 AM, Richard Sandiford wrote:
This patch stops pointer_hash from inheriting typed_noop_remove and
instead creates a new class nofree_ptr_hash that inherits from both.
It then updates all uses of typed_noop_remove (which are all pointers)
and pointer_hash so that they use this new class instead.

gcc/
        * hash-table.h: Update comments.
        * hash-traits.h (pointer_hash): Don't inherit from typed_noop_remove.
        (nofree_ptr_hash): New class.
        * asan.c (asan_mem_ref_hasher): Inherit from nofree_ptr_hash rather
        than typed_noop_remove.  Remove redudant typedefs.
        * attribs.c (attribute_hasher): Likewise.
        * cfg.c (bb_copy_hasher): Likewise.
        * cselib.c (cselib_hasher): Likewise.
        * dse.c (invariant_group_base_hasher): Likewise.
        * dwarf2cfi.c (trace_info_hasher): Likewise.
        * dwarf2out.c (macinfo_entry_hasher): Likewise.
        (comdat_type_hasher, loc_list_hasher): Likewise.
        * gcse.c (pre_ldst_expr_hasher): Likewise.
        * genmatch.c (id_base): Likewise.
        * genrecog.c (test_pattern_hasher): Likewise.
        * gimple-ssa-strength-reduction.c (cand_chain_hasher): Likewise.
        * haifa-sched.c (delay_i1_hasher): Likewise.
        * hard-reg-set.h (simplifiable_subregs_hasher): Likewise.
        * ipa-icf.h (congruence_class_group_hash): Likewise.
        * ipa-profile.c (histogram_hash): Likewise.
        * ira-color.c (allocno_hard_regs_hasher): Likewise.
        * lto-streamer.h (string_slot_hasher): Likewise.
        * lto-streamer.c (tree_entry_hasher): Likewise.
        * plugin.c (event_hasher): Likewise.
        * postreload-gcse.c (expr_hasher): Likewise.
        * store-motion.c (st_expr_hasher): Likewise.
        * tree-sra.c (uid_decl_hasher): Likewise.
        * tree-ssa-coalesce.c (coalesce_pair_hasher): Likewise.
        (ssa_name_var_hash): Likewise.
        * tree-ssa-live.c (tree_int_map_hasher): Likewise.
        * tree-ssa-loop-im.c (mem_ref_hasher): Likewise.
        * tree-ssa-pre.c (pre_expr_d): Likewise.
        * tree-ssa-sccvn.c (vn_nary_op_hasher): Likewise.
        * vtable-verify.h (registration_hasher): Likewise.
        * vtable-verify.c (vtbl_map_hasher): Likewise.
        * config/arm/arm.c (libcall_hasher): Likewise.
        * config/i386/winnt.c (wrapped_symbol_hasher): Likewise.
        * config/ia64/ia64.c (bundle_state_hasher): Likewise.
        * config/sol2.c (comdat_entry_hasher): Likewise.
        * fold-const.c (fold): Use nofree_ptr_hash instead of pointer_hash.
        (print_fold_checksum, fold_checksum_tree): Likewise.
        (debug_fold_checksum, fold_build1_stat_loc): Likewise.
        (fold_build2_stat_loc, fold_build3_stat_loc): Likewise.
        (fold_build_call_array_loc): Likewise.
        * tree-ssa-ccp.c (gimple_htab): Likewise.
        * tree-browser.c (tree_upper_hasher): Inherit from nofree_ptr_hash
        rather than pointer_type.

gcc/c/
        * c-decl.c (detect_field_duplicates_hash): Use nofree_ptr_hash
        instead of pointer_hash.
        (detect_field_duplicates): Likewise.

gcc/cp/
        * class.c (fixed_type_or_null_ref_ht): Inherit from nofree_ptr_hash
        rather than pointer_hash.
        (fixed_type_or_null): Use nofree_ptr_hash instead of pointer_hash.
        * semantics.c (nrv_data): Likewise.
        * tree.c (verify_stmt_tree_r, verify_stmt_tree): Likewise.

gcc/java/
        * jcf-io.c (charstar_hash): Inherit from nofree_ptr_hash rather
        than typed_noop_remove.  Remove redudant typedefs.

gcc/lto/
        * lto.c (tree_scc_hasher): Inherit from nofree_ptr_hash rather
        than typed_noop_remove.  Remove redudant typedefs.

gcc/objc/
        * objc-act.c (decl_name_hash): Inherit from nofree_ptr_hash rather
        than typed_noop_remove.  Remove redudant typedefs.

libcc1/
        * plugin.cc (string_hasher): Inherit from nofree_ptr_hash rather
        than typed_noop_remove.  Remove redudant typedefs.
        (plugin_context): Use nofree_ptr_hash rather than pointer_hash.
        (plugin_context::mark): Likewise.
So are we allowing multiple inheritance in GCC? It seems like that's what we've got for nofree_ptr_hash. Is there a better way to achieve what you're trying to do, or do you think this use ought to fall under some kind of exception?


Index: gcc/haifa-sched.c
===================================================================
--- gcc/haifa-sched.c   2015-06-16 09:53:47.338092692 +0100
+++ gcc/haifa-sched.c   2015-06-16 09:53:47.322092878 +0100
@@ -614,9 +614,8 @@ struct delay_pair

  /* Helpers for delay hashing.  */

-struct delay_i1_hasher : typed_noop_remove <delay_pair>
+struct delay_i1_hasher : nofree_ptr_hash <delay_pair>
  {
-  typedef delay_pair *value_type;
    typedef void *compare_type;
    static inline hashval_t hash (const delay_pair *);
    static inline bool equal (const delay_pair *, const void *);
Did you keep compare_type intentionally? Similarly for the changes in hard-reg-set.h, tree-ssa-loop-im.c, and tree-ssa-sccvn.c. You probably did, but I just want to be sure.

So I'm holding off on approving this one pending further discussion of the use of multiple inheritance for nofree_ptr_hash.

Jeff

Reply via email to