diff mbox

[08/13] Add a ggc_cache_ptr_hash

Message ID 87fv5s10un.fsf@e105548-lin.cambridge.arm.com
State New
Headers show

Commit Message

Richard Sandiford June 16, 2015, 9:03 a.m. UTC
Like the previous patch, but for ggc_cache_hasher.

gcc/
	* hash-traits.h (ggc_cache_hasher): Rename to...
	(ggc_cache_remove): ...this and remove typedefs.
	(ggc_cache_ptr_hash): New class.
	* hash-table.h: Update commentary.
	* emit-rtl.c (const_int_hasher): Inherit from ggc_cache_ptr_hash
	rather than ggc_cache_hasher.
	(const_wide_int_hasher, reg_attr_hasher): Likewise.
	(const_double_hasher, const_fixed_hasher): Likewise.
	* function.c (insn_cache_hasher): Likewise.
	* trans-mem.c (tm_wrapper_hasher): Likewise.
	* tree.h (tree_decl_map_cache_hasher): Likewise.
	* tree.c (type_cache_hasher, int_cst_hasher): Likewise.
	(cl_option_hasher, tree_vec_map_cache_hasher): Likewise.
	* ubsan.c (tree_type_map_cache_hasher): Likewise.
	* varasm.c (tm_clone_hasher): Likewise.
	* config/i386/i386.c (dllimport_hasher): Likewise.
	* config/nvptx/nvptx.c (declared_libfunc_hasher): Likewise.
	(tree_hasher): Likewise.

gcc/ada/
	* gcc-interface/decl.c (value_annotation_hasher): Inherit from
	ggc_cache_ptr_hash rather than ggc_cache_hasher.
	* gcc-interface/utils.c (pad_type_hasher): Likewise.

Comments

Jeff Law June 23, 2015, 11:15 p.m. UTC | #1
On 06/16/2015 03:03 AM, Richard Sandiford wrote:
> Like the previous patch, but for ggc_cache_hasher.
>
> gcc/
> 	* hash-traits.h (ggc_cache_hasher): Rename to...
> 	(ggc_cache_remove): ...this and remove typedefs.
> 	(ggc_cache_ptr_hash): New class.
> 	* hash-table.h: Update commentary.
> 	* emit-rtl.c (const_int_hasher): Inherit from ggc_cache_ptr_hash
> 	rather than ggc_cache_hasher.
> 	(const_wide_int_hasher, reg_attr_hasher): Likewise.
> 	(const_double_hasher, const_fixed_hasher): Likewise.
> 	* function.c (insn_cache_hasher): Likewise.
> 	* trans-mem.c (tm_wrapper_hasher): Likewise.
> 	* tree.h (tree_decl_map_cache_hasher): Likewise.
> 	* tree.c (type_cache_hasher, int_cst_hasher): Likewise.
> 	(cl_option_hasher, tree_vec_map_cache_hasher): Likewise.
> 	* ubsan.c (tree_type_map_cache_hasher): Likewise.
> 	* varasm.c (tm_clone_hasher): Likewise.
> 	* config/i386/i386.c (dllimport_hasher): Likewise.
> 	* config/nvptx/nvptx.c (declared_libfunc_hasher): Likewise.
> 	(tree_hasher): Likewise.
>
> gcc/ada/
> 	* gcc-interface/decl.c (value_annotation_hasher): Inherit from
> 	ggc_cache_ptr_hash rather than ggc_cache_hasher.
> 	* gcc-interface/utils.c (pad_type_hasher): Likewise.
Same as others -- concern about multiple inheritance.  Otherwise it's OK.

jeff
diff mbox

Patch

Index: gcc/hash-traits.h
===================================================================
--- gcc/hash-traits.h	2015-06-16 10:02:04.196341817 +0100
+++ gcc/hash-traits.h	2015-06-16 10:02:04.192341864 +0100
@@ -149,14 +149,12 @@  struct ggc_remove
   }
 };
 
-/* Hasher for cache entry in gc memory.  */
+/* Remover and marker for "cache" entries in gc memory.  These entries can
+   be deleted if there are no non-cache references to the data.  */
 
 template<typename T>
-struct ggc_cache_hasher : ggc_remove<T>
+struct ggc_cache_remove : ggc_remove<T>
 {
-  typedef T value_type;
-  typedef T compare_type;
-
   /* Entries are weakly held because this is for caches.  */
   static void ggc_mx (T &) {}
 
@@ -185,4 +183,11 @@  struct free_ptr_hash : pointer_hash <T>,
 template <typename T>
 struct ggc_ptr_hash : pointer_hash <T>, ggc_remove <T *> {};
 
+/* Traits for elements that point to gc memory.  The elements don't
+   in themselves keep the pointed-to data alive and they can be deleted
+   if the pointed-to data is going to be collected.  */
+
+template <typename T>
+struct ggc_cache_ptr_hash : pointer_hash <T>, ggc_cache_remove <T *> {};
+
 #endif
Index: gcc/hash-table.h
===================================================================
--- gcc/hash-table.h	2015-06-16 10:02:04.196341817 +0100
+++ gcc/hash-table.h	2015-06-16 10:02:40.715918847 +0100
@@ -91,7 +91,7 @@  Software Foundation; either version 3, o
    We compose this into a few steps.
 
       1. Decide on a removal policy for values stored in the table.
-         hash-traits.h provides class templates for the three most common
+         hash-traits.h provides class templates for the four most common
          policies:
 
          * typed_free_remove implements the static 'remove' member function
@@ -105,6 +105,13 @@  Software Foundation; either version 3, o
          Use this for garbage-collected data that needs to be preserved across
          collections.
 
+         * ggc_cache_remove is like ggc_remove, except that it does not
+         mark the entries during the normal gc mark phase.  Instead it
+         uses 'keep_cache_entry' (described above) to keep elements that
+         were not collected and delete those that were.  Use this for
+         garbage-collected caches that should not in themselves stop
+         the data from being collected.
+
          You can use these policies by simply deriving the descriptor type
          from one of those class template, with the appropriate argument.
 
Index: gcc/emit-rtl.c
===================================================================
--- gcc/emit-rtl.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/emit-rtl.c	2015-06-16 10:02:04.188341910 +0100
@@ -141,7 +141,7 @@  rtx const_tiny_rtx[4][(int) MAX_MACHINE_
 /* A hash table storing CONST_INTs whose absolute value is greater
    than MAX_SAVED_CONST_INT.  */
 
-struct const_int_hasher : ggc_cache_hasher<rtx>
+struct const_int_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   typedef HOST_WIDE_INT compare_type;
 
@@ -151,7 +151,7 @@  struct const_int_hasher : ggc_cache_hash
 
 static GTY ((cache)) hash_table<const_int_hasher> *const_int_htab;
 
-struct const_wide_int_hasher : ggc_cache_hasher<rtx>
+struct const_wide_int_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   static hashval_t hash (rtx x);
   static bool equal (rtx x, rtx y);
@@ -160,7 +160,7 @@  struct const_wide_int_hasher : ggc_cache
 static GTY ((cache)) hash_table<const_wide_int_hasher> *const_wide_int_htab;
 
 /* A hash table storing register attribute structures.  */
-struct reg_attr_hasher : ggc_cache_hasher<reg_attrs *>
+struct reg_attr_hasher : ggc_cache_ptr_hash<reg_attrs>
 {
   static hashval_t hash (reg_attrs *x);
   static bool equal (reg_attrs *a, reg_attrs *b);
@@ -169,7 +169,7 @@  struct reg_attr_hasher : ggc_cache_hashe
 static GTY ((cache)) hash_table<reg_attr_hasher> *reg_attrs_htab;
 
 /* A hash table storing all CONST_DOUBLEs.  */
-struct const_double_hasher : ggc_cache_hasher<rtx>
+struct const_double_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   static hashval_t hash (rtx x);
   static bool equal (rtx x, rtx y);
@@ -178,7 +178,7 @@  struct const_double_hasher : ggc_cache_h
 static GTY ((cache)) hash_table<const_double_hasher> *const_double_htab;
 
 /* A hash table storing all CONST_FIXEDs.  */
-struct const_fixed_hasher : ggc_cache_hasher<rtx>
+struct const_fixed_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   static hashval_t hash (rtx x);
   static bool equal (rtx x, rtx y);
Index: gcc/function.c
===================================================================
--- gcc/function.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/function.c	2015-06-16 10:02:04.188341910 +0100
@@ -123,7 +123,7 @@  struct function *cfun = 0;
 
 /* These hashes record the prologue and epilogue insns.  */
 
-struct insn_cache_hasher : ggc_cache_hasher<rtx>
+struct insn_cache_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   static hashval_t hash (rtx x) { return htab_hash_pointer (x); }
   static bool equal (rtx a, rtx b) { return a == b; }
Index: gcc/trans-mem.c
===================================================================
--- gcc/trans-mem.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/trans-mem.c	2015-06-16 10:02:04.188341910 +0100
@@ -474,7 +474,7 @@  build_tm_abort_call (location_t loc, boo
 /* Map for aribtrary function replacement under TM, as created
    by the tm_wrap attribute.  */
 
-struct tm_wrapper_hasher : ggc_cache_hasher<tree_map *>
+struct tm_wrapper_hasher : ggc_cache_ptr_hash<tree_map>
 {
   static inline hashval_t hash (tree_map *m) { return m->hash; }
   static inline bool
Index: gcc/tree.h
===================================================================
--- gcc/tree.h	2015-06-16 10:02:04.196341817 +0100
+++ gcc/tree.h	2015-06-16 10:02:04.192341864 +0100
@@ -4628,7 +4628,7 @@  #define tree_decl_map_eq tree_map_base_e
 extern unsigned int tree_decl_map_hash (const void *);
 #define tree_decl_map_marked_p tree_map_base_marked_p
 
-struct tree_decl_map_cache_hasher : ggc_cache_hasher<tree_decl_map *>
+struct tree_decl_map_cache_hasher : ggc_cache_ptr_hash<tree_decl_map>
 {
   static hashval_t hash (tree_decl_map *m) { return tree_decl_map_hash (m); }
   static bool
Index: gcc/tree.c
===================================================================
--- gcc/tree.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/tree.c	2015-06-16 10:02:04.188341910 +0100
@@ -198,7 +198,7 @@  struct GTY((for_user)) type_hash {
 /* Initial size of the hash table (rounded to next prime).  */
 #define TYPE_HASH_INITIAL_SIZE 1000
 
-struct type_cache_hasher : ggc_cache_hasher<type_hash *>
+struct type_cache_hasher : ggc_cache_ptr_hash<type_hash>
 {
   static hashval_t hash (type_hash *t) { return t->hash; }
   static bool equal (type_hash *a, type_hash *b);
@@ -222,7 +222,7 @@  static GTY ((cache)) hash_table<type_cac
 /* Hash table and temporary node for larger integer const values.  */
 static GTY (()) tree int_cst_node;
 
-struct int_cst_hasher : ggc_cache_hasher<tree>
+struct int_cst_hasher : ggc_cache_ptr_hash<tree_node>
 {
   static hashval_t hash (tree t);
   static bool equal (tree x, tree y);
@@ -238,7 +238,7 @@  static GTY ((cache)) hash_table<int_cst_
 static GTY (()) tree cl_optimization_node;
 static GTY (()) tree cl_target_option_node;
 
-struct cl_option_hasher : ggc_cache_hasher<tree>
+struct cl_option_hasher : ggc_cache_ptr_hash<tree_node>
 {
   static hashval_t hash (tree t);
   static bool equal (tree x, tree y);
@@ -255,7 +255,7 @@  static GTY ((cache))
 static GTY ((cache))
      hash_table<tree_decl_map_cache_hasher> *value_expr_for_decl;
 
-struct tree_vec_map_cache_hasher : ggc_cache_hasher<tree_vec_map *>
+struct tree_vec_map_cache_hasher : ggc_cache_ptr_hash<tree_vec_map>
 {
   static hashval_t hash (tree_vec_map *m) { return DECL_UID (m->base.from); }
 
Index: gcc/ubsan.c
===================================================================
--- gcc/ubsan.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/ubsan.c	2015-06-16 10:02:04.192341864 +0100
@@ -85,7 +85,7 @@  struct GTY((for_user)) tree_type_map {
   tree decl;
 };
 
-struct tree_type_map_cache_hasher : ggc_cache_hasher<tree_type_map *>
+struct tree_type_map_cache_hasher : ggc_cache_ptr_hash<tree_type_map>
 {
   static inline hashval_t
   hash (tree_type_map *t)
Index: gcc/varasm.c
===================================================================
--- gcc/varasm.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/varasm.c	2015-06-16 10:02:04.192341864 +0100
@@ -5792,7 +5792,7 @@  assemble_alias (tree decl, tree target)
    to its transaction aware clone.  Note that tm_pure functions are
    considered to be their own clone.  */
 
-struct tm_clone_hasher : ggc_cache_hasher<tree_map *>
+struct tm_clone_hasher : ggc_cache_ptr_hash<tree_map>
 {
   static hashval_t hash (tree_map *m) { return tree_map_hash (m); }
   static bool equal (tree_map *a, tree_map *b) { return tree_map_eq (a, b); }
Index: gcc/config/i386/i386.c
===================================================================
--- gcc/config/i386/i386.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/config/i386/i386.c	2015-06-16 10:02:04.184341957 +0100
@@ -14203,7 +14203,7 @@  legitimize_tls_address (rtx x, enum tls_
    to symbol DECL if BEIMPORT is true.  Otherwise create or return the
    unique refptr-DECL symbol corresponding to symbol DECL.  */
 
-struct dllimport_hasher : ggc_cache_hasher<tree_map *>
+struct dllimport_hasher : ggc_cache_ptr_hash<tree_map>
 {
   static inline hashval_t hash (tree_map *m) { return m->hash; }
   static inline bool
Index: gcc/config/nvptx/nvptx.c
===================================================================
--- gcc/config/nvptx/nvptx.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/config/nvptx/nvptx.c	2015-06-16 10:02:04.184341957 +0100
@@ -67,7 +67,7 @@ 
    decls corresponding to them.  */
 static std::stringstream func_decls;
 
-struct declared_libfunc_hasher : ggc_cache_hasher<rtx>
+struct declared_libfunc_hasher : ggc_cache_ptr_hash<rtx_def>
 {
   static hashval_t hash (rtx x) { return htab_hash_pointer (x); }
   static bool equal (rtx a, rtx b) { return a == b; }
@@ -76,7 +76,7 @@  struct declared_libfunc_hasher : ggc_cac
 static GTY((cache))
   hash_table<declared_libfunc_hasher> *declared_libfuncs_htab;
 
-  struct tree_hasher : ggc_cache_hasher<tree>
+struct tree_hasher : ggc_cache_ptr_hash<tree_node>
 {
   static hashval_t hash (tree t) { return htab_hash_pointer (t); }
   static bool equal (tree a, tree b) { return a == b; }
Index: gcc/ada/gcc-interface/decl.c
===================================================================
--- gcc/ada/gcc-interface/decl.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/ada/gcc-interface/decl.c	2015-06-16 10:02:04.172342095 +0100
@@ -135,7 +135,7 @@  typedef struct variant_desc_d {
 
 /* A hash table used to cache the result of annotate_value.  */
 
-struct value_annotation_hasher : ggc_cache_hasher<tree_int_map *>
+struct value_annotation_hasher : ggc_cache_ptr_hash<tree_int_map>
 {
   static inline hashval_t
   hash (tree_int_map *m)
Index: gcc/ada/gcc-interface/utils.c
===================================================================
--- gcc/ada/gcc-interface/utils.c	2015-06-16 10:02:04.196341817 +0100
+++ gcc/ada/gcc-interface/utils.c	2015-06-16 10:02:04.176342049 +0100
@@ -239,7 +239,7 @@  struct GTY((for_user)) pad_type_hash {
   tree type;
 };
 
-struct pad_type_hasher : ggc_cache_hasher<pad_type_hash *>
+struct pad_type_hasher : ggc_cache_ptr_hash<pad_type_hash>
 {
   static inline hashval_t hash (pad_type_hash *t) { return t->hash; }
   static bool equal (pad_type_hash *a, pad_type_hash *b);