From 1f012f560f6eea9cc07dcf9ee343d7a17692f9bc Mon Sep 17 00:00:00 2001 From: Trevor Saunders Date: Thu, 20 Nov 2014 15:10:26 +0000 Subject: [PATCH] fix hash_table when empty elements are not 0 gcc/ChangeLog: 2014-11-20 Trevor Saunders * 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 --- gcc/ChangeLog | 7 +++++++ gcc/hash-table.h | 47 ++++++++++++++++++++++++++--------------------- 2 files changed, 33 insertions(+), 21 deletions(-) diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 4d481c973c6..e0b8c79675b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +2014-11-20 Trevor Saunders + + * 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 * config/i386/i386.c, function.c, trans-mem.c, tree-core.h, diff --git a/gcc/hash-table.h b/gcc/hash-table.h index a6f66c05dd6..5485d06f5bd 100644 --- a/gcc/hash-table.h +++ b/gcc/hash-table.h @@ -1201,6 +1201,7 @@ private: template friend void gt_pch_nx (hash_table *, 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::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 ::data_alloc (size); - else - m_entries = ggc_cleared_vec_alloc (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::~hash_table () ggc_free (m_entries); } +/* This function returns an array of empty hash table elements. */ + +template class Allocator> +inline typename hash_table::value_type * +hash_table::alloc_entries (size_t n) const +{ + value_type *nentries; + + if (!m_ggc) + nentries = Allocator ::data_alloc (n); + else + nentries = ::ggc_cleared_vec_alloc (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::expand () nsize = osize; } - value_type *nentries; - if (!m_ggc) - nentries = Allocator ::data_alloc (nsize); - else - nentries = ggc_cleared_vec_alloc (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::empty () int nsize = prime_tab[nindex].prime; if (!m_ggc) - { - Allocator ::data_free (m_entries); - m_entries = Allocator ::data_alloc (nsize); - } + Allocator ::data_free (m_entries); else - { - ggc_free (m_entries); - m_entries = ggc_cleared_vec_alloc (nsize); - } + ggc_free (m_entries); + m_entries = alloc_entries (nsize); m_size = nsize; m_size_prime_index = nindex; } -- 2.30.2