From: Richard Sandiford Date: Thu, 25 Jun 2015 17:16:44 +0000 (+0000) Subject: gengtype-parse.c (require_template_declaration): Allow '+' in template parameters. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=e0702244b8e0fa5555e20b5554545bab9d06927f;p=gcc.git gengtype-parse.c (require_template_declaration): Allow '+' in template parameters. 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. From-SVN: r224973 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 3a639edcd4f..fed4758760f 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 f79cc4236a9..32eb3cf77ad 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 5663a268ec6..13b2b5c715b 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 8f97646f3e1..26da1f239b8 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 04483103a94..facb5961eb6 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 0bfd20c7776..3a47d978e12 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 3eb098eca5a..f243df51034 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 74f53754052..a84b8dae7a3 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;