diff options
author | Trevor Saunders <tsaunders@mozilla.com> | 2014-11-20 15:10:26 +0000 |
---|---|---|
committer | Trevor Saunders <tbsaunde@gcc.gnu.org> | 2014-11-20 15:10:26 +0000 |
commit | 1f012f560f6eea9cc07dcf9ee343d7a17692f9bc (patch) | |
tree | 6b7936d20ee14a50ce2a7310a7f0b65175230ba7 /gcc | |
parent | d242408fda0bb64230b5446911d860df3e19a3da (diff) | |
download | gcc-1f012f560f6eea9cc07dcf9ee343d7a17692f9bc.zip gcc-1f012f560f6eea9cc07dcf9ee343d7a17692f9bc.tar.gz gcc-1f012f560f6eea9cc07dcf9ee343d7a17692f9bc.tar.bz2 |
fix hash_table when empty elements are not 0
gcc/ChangeLog:
2014-11-20 Trevor Saunders <tsaunders@mozilla.com>
* hash-table.h (hash_table::hash_table): Call alloc_entries.
(hash_table::alloc_entries): new method.
(hash_table::expand): Call alloc_entries.
(hash_table::empty): Likewise.
From-SVN: r217868
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/hash-table.h | 47 |
2 files changed, 33 insertions, 21 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d481c9..e0b8c79 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,12 @@ 2014-11-20 Trevor Saunders <tsaunders@mozilla.com> + * hash-table.h (hash_table::hash_table): Call alloc_entries. + (hash_table::alloc_entries): new method. + (hash_table::expand): Call alloc_entries. + (hash_table::empty): Likewise. + +2014-11-20 Trevor Saunders <tsaunders@mozilla.com> + * config/i386/i386.c, function.c, trans-mem.c, tree-core.h, tree.c, tree.h, ubsan.c, varasm.c: Use hash_table instead of htab. diff --git a/gcc/hash-table.h b/gcc/hash-table.h index a6f66c0..5485d06 100644 --- a/gcc/hash-table.h +++ b/gcc/hash-table.h @@ -1201,6 +1201,7 @@ private: template<typename T> friend void gt_pch_nx (hash_table<T> *, gt_pointer_operator, void *); + value_type *alloc_entries (size_t n) const; value_type *find_empty_slot_for_expand (hashval_t); void expand (); static bool is_deleted (value_type &v) @@ -1259,12 +1260,7 @@ hash_table<Descriptor, Allocator, true>::hash_table (size_t size, bool ggc) : size_prime_index = hash_table_higher_prime_index (size); size = prime_tab[size_prime_index].prime; - if (!m_ggc) - m_entries = Allocator <value_type> ::data_alloc (size); - else - m_entries = ggc_cleared_vec_alloc<value_type> (size); - - gcc_assert (m_entries != NULL); + m_entries = alloc_entries (size); m_size = size; m_size_prime_index = size_prime_index; } @@ -1282,6 +1278,26 @@ hash_table<Descriptor, Allocator, true>::~hash_table () ggc_free (m_entries); } +/* This function returns an array of empty hash table elements. */ + +template<typename Descriptor, template<typename Type> class Allocator> +inline typename hash_table<Descriptor, Allocator, true>::value_type * +hash_table<Descriptor, Allocator, true>::alloc_entries (size_t n) const +{ + value_type *nentries; + + if (!m_ggc) + nentries = Allocator <value_type> ::data_alloc (n); + else + nentries = ::ggc_cleared_vec_alloc<value_type> (n); + + gcc_assert (nentries != NULL); + for (size_t i = 0; i < n; i++) + mark_empty (nentries[i]); + + return nentries; +} + /* Similar to find_slot, but without several unwanted side effects: - Does not call equal when it finds an existing entry. - Does not change the count of elements/searches/collisions in the @@ -1351,13 +1367,7 @@ hash_table<Descriptor, Allocator, true>::expand () nsize = osize; } - value_type *nentries; - if (!m_ggc) - nentries = Allocator <value_type> ::data_alloc (nsize); - else - nentries = ggc_cleared_vec_alloc<value_type> (nsize); - - gcc_assert (nentries != NULL); + value_type *nentries = alloc_entries (nsize); m_entries = nentries; m_size = nsize; m_size_prime_index = nindex; @@ -1405,16 +1415,11 @@ hash_table<Descriptor, Allocator, true>::empty () int nsize = prime_tab[nindex].prime; if (!m_ggc) - { - Allocator <value_type> ::data_free (m_entries); - m_entries = Allocator <value_type> ::data_alloc (nsize); - } + Allocator <value_type> ::data_free (m_entries); else - { - ggc_free (m_entries); - m_entries = ggc_cleared_vec_alloc<value_type> (nsize); - } + ggc_free (m_entries); + m_entries = alloc_entries (nsize); m_size = nsize; m_size_prime_index = nindex; } |