From: rsandifo Date: Thu, 25 Jun 2015 17:16:44 +0000 (+0000) Subject: gcc/ X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=613732c1f5aaa8941c1e45b762a89aaaf10d36e1;p=thirdparty%2Fgcc.git gcc/ * gengtype-parse.c (require_template_declaration): Allow '+' in template parameters. Consolidate cases. * hash-traits.h (int_hash): New class. * alias.c (alias_set_hash): New structure. (alias_set_traits): Use it. * symbol-summary.h (function_summary::map_hash): New class. (function_summary::summary_hashmap_traits): Use it. * tree-inline.h (dependence_hash): New class. (dependence_hasher): Use it. * tree-ssa-reassoc.c (oecount_hasher): Use int_hash. * value-prof.c (profile_id_hash): New class. (profile_id_traits): Use it. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@224973 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a639edcd4f4..fed4758760f2 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,18 @@ +2015-06-25 Richard Sandiford + + * gengtype-parse.c (require_template_declaration): Allow '+' in + template parameters. Consolidate cases. + * hash-traits.h (int_hash): New class. + * alias.c (alias_set_hash): New structure. + (alias_set_traits): Use it. + * symbol-summary.h (function_summary::map_hash): New class. + (function_summary::summary_hashmap_traits): Use it. + * tree-inline.h (dependence_hash): New class. + (dependence_hasher): Use it. + * tree-ssa-reassoc.c (oecount_hasher): Use int_hash. + * value-prof.c (profile_id_hash): New class. + (profile_id_traits): Use it. + 2015-06-25 Richard Sandiford * config/mips/mips.c (mips16_flip_traits): Use it. diff --git a/gcc/alias.c b/gcc/alias.c index f79cc4236a9d..32eb3cf77adc 100644 --- a/gcc/alias.c +++ b/gcc/alias.c @@ -141,31 +141,8 @@ along with GCC; see the file COPYING3. If not see However, this is no actual entry for alias set zero. It is an error to attempt to explicitly construct a subset of zero. */ -struct alias_set_traits : default_hashmap_traits -{ - template - static bool - is_empty (T &e) - { - return e.m_key == INT_MIN; - } - - template - static bool - is_deleted (T &e) - { - return e.m_key == (INT_MIN + 1); - } - - template static void mark_empty (T &e) { e.m_key = INT_MIN; } - - template - static void - mark_deleted (T &e) - { - e.m_key = INT_MIN + 1; - } -}; +struct alias_set_hash : int_hash {}; +struct alias_set_traits : simple_hashmap_traits {}; struct GTY(()) alias_set_entry_d { /* The alias set number, as stored in MEM_ALIAS_SET. */ diff --git a/gcc/gengtype-parse.c b/gcc/gengtype-parse.c index 5663a268ec69..13b2b5c715ba 100644 --- a/gcc/gengtype-parse.c +++ b/gcc/gengtype-parse.c @@ -274,17 +274,13 @@ require_template_declaration (const char *tmpl_name) str = concat (str, "enum ", (char *) 0); continue; } - if (token () == NUM) + if (token () == NUM + || token () == ':' + || token () == '+') { str = concat (str, advance (), (char *) 0); continue; } - if (token () == ':') - { - advance (); - str = concat (str, ":", (char *) 0); - continue; - } if (token () == '<') { advance (); diff --git a/gcc/hash-traits.h b/gcc/hash-traits.h index 8f97646f3e1e..26da1f239b8c 100644 --- a/gcc/hash-traits.h +++ b/gcc/hash-traits.h @@ -57,6 +57,68 @@ typed_noop_remove ::remove (Type &) } +/* Hasher for integer type Type in which Empty is a spare value that can be + used to mark empty slots. If Deleted != Empty then Deleted is another + spare value that can be used for deleted slots; if Deleted == Empty then + hash table entries cannot be deleted. */ + +template +struct int_hash : typed_noop_remove +{ + typedef Type value_type; + typedef Type compare_type; + + static inline hashval_t hash (value_type); + static inline bool equal (value_type existing, value_type candidate); + static inline void mark_deleted (Type &); + static inline void mark_empty (Type &); + static inline bool is_deleted (Type); + static inline bool is_empty (Type); +}; + +template +inline hashval_t +int_hash ::hash (value_type x) +{ + return x; +} + +template +inline bool +int_hash ::equal (value_type x, value_type y) +{ + return x == y; +} + +template +inline void +int_hash ::mark_deleted (Type &x) +{ + gcc_assert (Empty != Deleted); + x = Deleted; +} + +template +inline void +int_hash ::mark_empty (Type &x) +{ + x = Empty; +} + +template +inline bool +int_hash ::is_deleted (Type x) +{ + return Empty != Deleted && x == Deleted; +} + +template +inline bool +int_hash ::is_empty (Type x) +{ + return x == Empty; +} + /* Pointer hasher based on pointer equality. Other types of pointer hash can inherit this and override the hash and equal functions with some other form of equality (such as string equality). */ diff --git a/gcc/symbol-summary.h b/gcc/symbol-summary.h index 04483103a940..facb5961eb60 100644 --- a/gcc/symbol-summary.h +++ b/gcc/symbol-summary.h @@ -200,45 +200,8 @@ protected: bool m_ggc; private: - struct summary_hashmap_traits: default_hashmap_traits - { - static const int deleted_value = -1; - static const int empty_value = 0; - - static hashval_t - hash (const int v) - { - return (hashval_t)v; - } - - template - static bool - is_deleted (Type &e) - { - return e.m_key == deleted_value; - } - - template - static bool - is_empty (Type &e) - { - return e.m_key == empty_value; - } - - template - static void - mark_deleted (Type &e) - { - e.m_key = deleted_value; - } - - template - static void - mark_empty (Type &e) - { - e.m_key = empty_value; - } - }; + typedef int_hash map_hash; + typedef simple_hashmap_traits summary_hashmap_traits; /* Getter for summary callgraph ID. */ T* get (int uid) diff --git a/gcc/tree-inline.h b/gcc/tree-inline.h index 0bfd20c7776d..3a47d978e123 100644 --- a/gcc/tree-inline.h +++ b/gcc/tree-inline.h @@ -35,25 +35,8 @@ enum copy_body_cge_which CB_CGE_MOVE_CLONES }; -struct dependence_hasher : default_hashmap_traits -{ - template - static void - mark_deleted (T &e) - { gcc_unreachable (); } - - template - static void - mark_empty (T &e) - { e.m_key = 0; } - - template - static bool - is_deleted (T &) - { return false; } - - template static bool is_empty (T &e) { return e.m_key == 0; } -}; +typedef int_hash dependence_hash; +typedef simple_hashmap_traits dependence_hasher; /* Data required for function body duplication. */ diff --git a/gcc/tree-ssa-reassoc.c b/gcc/tree-ssa-reassoc.c index 3eb098eca5a1..f243df510348 100644 --- a/gcc/tree-ssa-reassoc.c +++ b/gcc/tree-ssa-reassoc.c @@ -1017,23 +1017,16 @@ static vec cvec; /* Oecount hashtable helpers. */ -struct oecount_hasher +struct oecount_hasher : int_hash { - typedef int value_type; - typedef int compare_type; - static inline hashval_t hash (const value_type &); - static inline bool equal (const value_type &, const compare_type &); - static bool is_deleted (int &v) { return v == 1; } - static void mark_deleted (int &e) { e = 1; } - static bool is_empty (int &v) { return v == 0; } - static void mark_empty (int &e) { e = 0; } - static void remove (int &) {} + static inline hashval_t hash (int); + static inline bool equal (int, int); }; /* Hash function for oecount. */ inline hashval_t -oecount_hasher::hash (const value_type &p) +oecount_hasher::hash (int p) { const oecount *c = &cvec[p - 42]; return htab_hash_pointer (c->op) ^ (hashval_t)c->oecode; @@ -1042,7 +1035,7 @@ oecount_hasher::hash (const value_type &p) /* Comparison function for oecount. */ inline bool -oecount_hasher::equal (const value_type &p1, const compare_type &p2) +oecount_hasher::equal (int p1, int p2) { const oecount *c1 = &cvec[p1 - 42]; const oecount *c2 = &cvec[p2 - 42]; diff --git a/gcc/value-prof.c b/gcc/value-prof.c index 74f53754052b..a84b8dae7a3c 100644 --- a/gcc/value-prof.c +++ b/gcc/value-prof.c @@ -1248,19 +1248,8 @@ gimple_mod_subtract_transform (gimple_stmt_iterator *si) return true; } -struct profile_id_traits : default_hashmap_traits -{ - template - static bool - is_deleted (T &e) - { - return e.m_key == UINT_MAX; - } - - template static bool is_empty (T &e) { return e.m_key == 0; } - template static void mark_deleted (T &e) { e.m_key = UINT_MAX; } - template static void mark_empty (T &e) { e.m_key = 0; } -}; +typedef int_hash profile_id_hash; +typedef simple_hashmap_traits profile_id_traits; static hash_map * cgraph_node_map = 0;