hash-traits.h (default_hash_traits): New structure.
authorRichard Sandiford <richard.sandiford@arm.com>
Thu, 25 Jun 2015 17:07:26 +0000 (17:07 +0000)
committerRichard Sandiford <rsandifo@gcc.gnu.org>
Thu, 25 Jun 2015 17:07:26 +0000 (17:07 +0000)
gcc/
* hash-traits.h (default_hash_traits): New structure.
* hash-set.h (default_hashset_traits): Delete.
(hash_set): Use default_hash_traits<Key> instead of
default_hashset_traits.  Delete hash_entry type and use Key directly.
* ipa-devirt.c (pair_traits): Delete.
(default_hash_traits <type_pair>): Override.
(odr_subtypes_equivalent_p): Remove pair_types template parameter.
(odr_types_equivalent_p, add_type_duplicate): Likewise.

From-SVN: r224964

gcc/ChangeLog
gcc/hash-set.h
gcc/hash-traits.h
gcc/ipa-devirt.c

index 5bd35bd..e4b464e 100644 (file)
@@ -1,5 +1,16 @@
 2015-06-25  Richard Sandiford  <richard.sandiford@arm.com>
 
+       * hash-traits.h (default_hash_traits): New structure.
+       * hash-set.h (default_hashset_traits): Delete.
+       (hash_set): Use default_hash_traits<Key> instead of
+       default_hashset_traits.  Delete hash_entry type and use Key directly.
+       * ipa-devirt.c (pair_traits): Delete.
+       (default_hash_traits <type_pair>): Override.
+       (odr_subtypes_equivalent_p): Remove pair_types template parameter.
+       (odr_types_equivalent_p, add_type_duplicate): Likewise.
+
+2015-06-25  Richard Sandiford  <richard.sandiford@arm.com>
+
        * hash-traits.h (typed_noop_remove): Don't require a pointer type.
 
 2015-06-25  Richard Sandiford  <richard.sandiford@arm.com>
index 3ec0b15..2fb6cae 100644 (file)
@@ -21,162 +21,9 @@ along with GCC; see the file COPYING3.  If not see
 #ifndef hash_set_h
 #define hash_set_h
 
-/* implement default behavior for traits when types allow it.  */
-
-struct default_hashset_traits
-{
-  /* Hashes the passed in key.  */
-
-  template<typename T>
-  static hashval_t
-  hash (T *p)
-    {
-      return uintptr_t (p) >> 3;
-    }
-
-  template<typename T> static hashval_t hash(const T &v) { return v; }
-
-  /* Return true if the two keys passed as arguments are equal.  */
-
-  template<typename T>
-  static bool
-  equal (const T &a, const T &b)
-    {
-      return a == b;
-    }
-
-  /* Called to dispose of the key before marking the entry as deleted.  */
-
-  template<typename T> static void remove (T &v) { v.~T (); }
-
-  /* Mark the passed in entry as being deleted.  */
-
-  template<typename T>
-  static void
-  mark_deleted (T *&e)
-    {
-      e = reinterpret_cast<void *> (1);
-    }
-
-  /* Mark the passed in entry as being empty.  */
-
-  template<typename T>
-  static void
-  mark_empty (T *&e)
-    {
-      e = NULL;
-    }
-
-  /* Return true if the passed in entry is marked as deleted.  */
-
-  template<typename T>
-  static bool
-  is_deleted (T *e)
-    {
-      return e == reinterpret_cast<void *> (1);
-    }
-
-  /* Return true if the passed in entry is marked as empty.  */
-
-  template<typename T> static bool is_empty (T *e) { return e == NULL; }
-
-  /* ggc walking routine, mark all objects refered to by this one.  */
-
-  template<typename T>
-  static void
-  ggc_mx (T &x)
-    {
-      extern void gt_ggc_mx (T &);
-      gt_ggc_mx (x);
-    }
-
-  /* pch walking routine, note all objects refered to by this element.  */
-
-  template<typename T>
-  static void
-  pch_nx (T &x)
-    {
-      extern void gt_pch_nx (T &);
-      gt_pch_nx (x);
-    }
-};
-
-template<typename Key, typename Traits = default_hashset_traits>
+template<typename Key, typename Traits = default_hash_traits<Key> >
 class hash_set
 {
-  struct hash_entry
-  {
-    Key m_key;
-
-    typedef hash_entry value_type;
-    typedef Key compare_type;
-
-    static hashval_t hash (const hash_entry &e)
-      {
-               return Traits::hash (e.m_key);
-      }
-
-    static bool equal (const hash_entry &a, const Key &b)
-               {
-         return Traits::equal (a.m_key, b);
-               }
-
-    static void remove (hash_entry &e) { Traits::remove (e.m_key); }
-
-    static void
-    mark_deleted (hash_entry &e)
-      {
-               Traits::mark_deleted (e.m_key);
-      }
-
-    static bool is_deleted (const hash_entry &e)
-      {
-               return Traits::is_deleted (e.m_key);
-      }
-
-    static void
-    mark_empty (hash_entry &e)
-      {
-       Traits::mark_empty (e.m_key);
-      }
-
-    static bool
-    is_empty (const hash_entry &e)
-      {
-       return Traits::is_empty (e.m_key);
-      }
-
-    static void ggc_mx (hash_entry &e)
-      {
-       Traits::ggc_mx (e.m_key);
-      }
-
-    static void pch_nx (hash_entry &e)
-      {
-       Traits::pch_nx (e.m_key);
-      }
-
-    static void pch_nx (hash_entry &e, gt_pointer_operator op, void *c)
-      {
-       pch_nx_helper (e.m_key, op, c);
-      }
-
-  private:
-    template<typename T>
-    static void
-      pch_nx_helper (T &x, gt_pointer_operator op, void *cookie)
-       {
-         gt_pch_nx (&x, op, cookie);
-       }
-
-    template<typename T>
-      static void
-      pch_nx_helper (T *&x, gt_pointer_operator op, void *cookie)
-       {
-         op (&x, cookie);
-       }
-  };
-
 public:
   explicit hash_set (size_t n = 13, bool ggc = false CXX_MEM_STAT_INFO)
     : m_table (n, ggc, true, HASH_SET_ORIGIN PASS_MEM_STAT) {}
@@ -196,11 +43,10 @@ public:
 
   bool add (const Key &k)
     {
-      hash_entry *e = m_table.find_slot_with_hash (k, Traits::hash (k),
-                                                  INSERT);
-      bool existed = !hash_entry::is_empty (*e);
+      Key *e = m_table.find_slot_with_hash (k, Traits::hash (k), INSERT);
+      bool existed = !Traits::is_empty (*e);
       if (!existed)
-       e->m_key = k;
+       *e = k;
 
       return existed;
     }
@@ -209,8 +55,8 @@ public:
 
   bool contains (const Key &k)
     {
-      hash_entry &e = m_table.find_with_hash (k, Traits::hash (k));
-      return !Traits::is_empty (e.m_key);
+      Key &e = m_table.find_with_hash (k, Traits::hash (k));
+      return !Traits::is_empty (e);
     }
 
   /* Call the call back on each pair of key and value with the passed in
@@ -219,9 +65,9 @@ public:
   template<typename Arg, bool (*f)(const Key &, Arg)>
   void traverse (Arg a) const
     {
-      for (typename hash_table<hash_entry>::iterator iter = m_table.begin ();
+      for (typename hash_table<Traits>::iterator iter = m_table.begin ();
           iter != m_table.end (); ++iter)
-       f ((*iter).m_key, a);
+       f (*iter, a);
     }
 
   /* Return the number of elements in the set.  */
@@ -234,7 +80,7 @@ private:
   template<typename T, typename U> friend void gt_pch_nx (hash_set<T, U> *);
       template<typename T, typename U> friend void gt_pch_nx (hash_set<T, U> *, gt_pointer_operator, void *);
 
-  hash_table<hash_entry> m_table;
+  hash_table<Traits> m_table;
 };
 
 /* ggc marking routines.  */
index c8314e5..c580de9 100644 (file)
@@ -190,4 +190,9 @@ struct ggc_ptr_hash : pointer_hash <T>, ggc_remove <T *> {};
 template <typename T>
 struct ggc_cache_ptr_hash : pointer_hash <T>, ggc_cache_remove <T *> {};
 
+template <typename T> struct default_hash_traits;
+
+template <typename T>
+struct default_hash_traits <T *> : ggc_ptr_hash <T> {};
+
 #endif
index b735f64..80f73a6 100644 (file)
@@ -162,8 +162,11 @@ typedef struct
   tree second;
 } type_pair;
 
-struct pair_traits : default_hashset_traits
+template <>
+struct default_hash_traits <type_pair> : typed_noop_remove <type_pair>
 {
+  typedef type_pair value_type;
+  typedef type_pair compare_type;
   static hashval_t
   hash (type_pair p)
   {
@@ -192,7 +195,7 @@ struct pair_traits : default_hashset_traits
 };
 
 static bool odr_types_equivalent_p (tree, tree, bool, bool *,
-                                   hash_set<type_pair,pair_traits> *,
+                                   hash_set<type_pair> *,
                                    location_t, location_t);
 
 static bool odr_violation_reported = false;
@@ -769,7 +772,7 @@ set_type_binfo (tree type, tree binfo)
 
 static bool
 odr_subtypes_equivalent_p (tree t1, tree t2,
-                          hash_set<type_pair,pair_traits> *visited,
+                          hash_set<type_pair> *visited,
                           location_t loc1, location_t loc2)
 {
 
@@ -1335,7 +1338,7 @@ warn_types_mismatch (tree t1, tree t2, location_t loc1, location_t loc2)
 
 static bool
 odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
-                       hash_set<type_pair,pair_traits> *visited,
+                       hash_set<type_pair> *visited,
                        location_t loc1, location_t loc2)
 {
   /* Check first for the obvious case of pointer identity.  */
@@ -1785,7 +1788,7 @@ odr_types_equivalent_p (tree t1, tree t2, bool warn, bool *warned,
 bool
 odr_types_equivalent_p (tree type1, tree type2)
 {
-  hash_set<type_pair,pair_traits> visited;
+  hash_set<type_pair> visited;
 
 #ifdef ENABLE_CHECKING
   gcc_assert (odr_or_derived_type_p (type1) && odr_or_derived_type_p (type2));
@@ -1860,7 +1863,7 @@ add_type_duplicate (odr_type val, tree type)
   bool base_mismatch = false;
   unsigned int i;
   bool warned = false;
-  hash_set<type_pair,pair_traits> visited;
+  hash_set<type_pair> visited;
 
   gcc_assert (in_lto_p);
   vec_safe_push (val->types, type);