This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[08/13] Add a ggc_cache_ptr_hash


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.

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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]