aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ChangeLog21
-rw-r--r--gcc/ada/ChangeLog6
-rw-r--r--gcc/ada/gcc-interface/decl.c2
-rw-r--r--gcc/ada/gcc-interface/utils.c2
-rw-r--r--gcc/config/i386/i386.c2
-rw-r--r--gcc/config/nvptx/nvptx.c4
-rw-r--r--gcc/emit-rtl.c10
-rw-r--r--gcc/function.c2
-rw-r--r--gcc/hash-table.h9
-rw-r--r--gcc/hash-traits.h15
-rw-r--r--gcc/trans-mem.c2
-rw-r--r--gcc/tree.c8
-rw-r--r--gcc/tree.h2
-rw-r--r--gcc/ubsan.c2
-rw-r--r--gcc/varasm.c2
15 files changed, 64 insertions, 25 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 9737e4a..3f906d8 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,26 @@
2015-06-25 Richard Sandiford <richard.sandiford@arm.com>
+ * 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.
+
+2015-06-25 Richard Sandiford <richard.sandiford@arm.com>
+
* hash-traits.h (ggc_hasher): Rename to...
(ggc_remover): ...this and remove typedefs.
(ggc_cache_hasher): Update accordingly. Add typedefs.
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index e4fc125..d07340a 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,11 @@
2015-06-25 Richard Sandiford <richard.sandiford@arm.com>
+ * 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.
+
+2015-06-25 Richard Sandiford <richard.sandiford@arm.com>
+
* gcc-interface/decl.c (value_annotation_hasher::handle_cache_entry):
Delete.
(value_annotation_hasher::keep_cache_entry): New function.
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index 7511c56..1c82b6e 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -134,7 +134,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)
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 6044600..f09db59 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -237,7 +237,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);
diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
index a05f226..5c90440 100644
--- a/gcc/config/i386/i386.c
+++ b/gcc/config/i386/i386.c
@@ -14212,7 +14212,7 @@ legitimize_tls_address (rtx x, enum tls_model model, bool for_mov)
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
diff --git a/gcc/config/nvptx/nvptx.c b/gcc/config/nvptx/nvptx.c
index 98e7422..af08abe 100644
--- a/gcc/config/nvptx/nvptx.c
+++ b/gcc/config/nvptx/nvptx.c
@@ -66,7 +66,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; }
@@ -75,7 +75,7 @@ struct declared_libfunc_hasher : ggc_cache_hasher<rtx>
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; }
diff --git a/gcc/emit-rtl.c b/gcc/emit-rtl.c
index bab02fe..e7f7eab 100644
--- a/gcc/emit-rtl.c
+++ b/gcc/emit-rtl.c
@@ -140,7 +140,7 @@ rtx_insn *invalid_insn_rtx;
/* 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;
@@ -150,7 +150,7 @@ struct const_int_hasher : ggc_cache_hasher<rtx>
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);
@@ -159,7 +159,7 @@ struct const_wide_int_hasher : ggc_cache_hasher<rtx>
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);
@@ -168,7 +168,7 @@ struct reg_attr_hasher : ggc_cache_hasher<reg_attrs *>
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);
@@ -177,7 +177,7 @@ struct const_double_hasher : ggc_cache_hasher<rtx>
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);
diff --git a/gcc/function.c b/gcc/function.c
index f6b7d30..cb3e9bb 100644
--- a/gcc/function.c
+++ b/gcc/function.c
@@ -122,7 +122,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; }
diff --git a/gcc/hash-table.h b/gcc/hash-table.h
index 3f49345..5f3dbed 100644
--- a/gcc/hash-table.h
+++ b/gcc/hash-table.h
@@ -91,7 +91,7 @@ along with GCC; see the file COPYING3. If not see
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 @@ along with GCC; see the file COPYING3. If not see
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.
diff --git a/gcc/hash-traits.h b/gcc/hash-traits.h
index 77f88f3..5fd43f1 100644
--- a/gcc/hash-traits.h
+++ b/gcc/hash-traits.h
@@ -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>, typed_free_remove <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
diff --git a/gcc/trans-mem.c b/gcc/trans-mem.c
index b3dbcbd..9e860ce 100644
--- a/gcc/trans-mem.c
+++ b/gcc/trans-mem.c
@@ -471,7 +471,7 @@ build_tm_abort_call (location_t loc, bool is_outer)
/* 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
diff --git a/gcc/tree.c b/gcc/tree.c
index 2511246..139544d 100644
--- a/gcc/tree.c
+++ b/gcc/tree.c
@@ -196,7 +196,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);
@@ -220,7 +220,7 @@ static GTY ((cache)) hash_table<type_cache_hasher> *type_hash_table;
/* 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);
@@ -236,7 +236,7 @@ static GTY ((cache)) hash_table<int_cst_hasher> *int_cst_hash_table;
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);
@@ -253,7 +253,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); }
diff --git a/gcc/tree.h b/gcc/tree.h
index 51465e2..250f99d 100644
--- a/gcc/tree.h
+++ b/gcc/tree.h
@@ -4626,7 +4626,7 @@ extern unsigned int tree_map_hash (const void *);
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
diff --git a/gcc/ubsan.c b/gcc/ubsan.c
index 14e54ef..ded725a 100644
--- a/gcc/ubsan.c
+++ b/gcc/ubsan.c
@@ -83,7 +83,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)
diff --git a/gcc/varasm.c b/gcc/varasm.c
index 0f87228..611b6ca 100644
--- a/gcc/varasm.c
+++ b/gcc/varasm.c
@@ -5790,7 +5790,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); }