Commit e0702244 by Richard Sandiford Committed by Richard Sandiford

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
parent 1c952460
2015-06-25 Richard Sandiford <richard.sandiford@arm.com>
* 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 <richard.sandiford@arm.com>
* config/mips/mips.c (mips16_flip_traits): Use it.
(local_alias_traits, mips16_local_aliases): Convert from a map of
rtxes to a map of symbol names.
......
......@@ -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<typename T>
static bool
is_empty (T &e)
{
return e.m_key == INT_MIN;
}
template<typename T>
static bool
is_deleted (T &e)
{
return e.m_key == (INT_MIN + 1);
}
template<typename T> static void mark_empty (T &e) { e.m_key = INT_MIN; }
template<typename T>
static void
mark_deleted (T &e)
{
e.m_key = INT_MIN + 1;
}
};
struct alias_set_hash : int_hash <int, INT_MIN, INT_MIN + 1> {};
struct alias_set_traits : simple_hashmap_traits <alias_set_hash> {};
struct GTY(()) alias_set_entry_d {
/* The alias set number, as stored in MEM_ALIAS_SET. */
......
......@@ -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 ();
......
......@@ -57,6 +57,68 @@ typed_noop_remove <Type>::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 <typename Type, Type Empty, Type Deleted = Empty>
struct int_hash : typed_noop_remove <Type>
{
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 <typename Type, Type Empty, Type Deleted>
inline hashval_t
int_hash <Type, Empty, Deleted>::hash (value_type x)
{
return x;
}
template <typename Type, Type Empty, Type Deleted>
inline bool
int_hash <Type, Empty, Deleted>::equal (value_type x, value_type y)
{
return x == y;
}
template <typename Type, Type Empty, Type Deleted>
inline void
int_hash <Type, Empty, Deleted>::mark_deleted (Type &x)
{
gcc_assert (Empty != Deleted);
x = Deleted;
}
template <typename Type, Type Empty, Type Deleted>
inline void
int_hash <Type, Empty, Deleted>::mark_empty (Type &x)
{
x = Empty;
}
template <typename Type, Type Empty, Type Deleted>
inline bool
int_hash <Type, Empty, Deleted>::is_deleted (Type x)
{
return Empty != Deleted && x == Deleted;
}
template <typename Type, Type Empty, Type Deleted>
inline bool
int_hash <Type, Empty, Deleted>::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). */
......
......@@ -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<typename Type>
static bool
is_deleted (Type &e)
{
return e.m_key == deleted_value;
}
template<typename Type>
static bool
is_empty (Type &e)
{
return e.m_key == empty_value;
}
template<typename Type>
static void
mark_deleted (Type &e)
{
e.m_key = deleted_value;
}
template<typename Type>
static void
mark_empty (Type &e)
{
e.m_key = empty_value;
}
};
typedef int_hash <int, 0, -1> map_hash;
typedef simple_hashmap_traits <map_hash> summary_hashmap_traits;
/* Getter for summary callgraph ID. */
T* get (int uid)
......
......@@ -35,25 +35,8 @@ enum copy_body_cge_which
CB_CGE_MOVE_CLONES
};
struct dependence_hasher : default_hashmap_traits
{
template<typename T>
static void
mark_deleted (T &e)
{ gcc_unreachable (); }
template<typename T>
static void
mark_empty (T &e)
{ e.m_key = 0; }
template<typename T>
static bool
is_deleted (T &)
{ return false; }
template<typename T> static bool is_empty (T &e) { return e.m_key == 0; }
};
typedef int_hash <unsigned short, 0> dependence_hash;
typedef simple_hashmap_traits <dependence_hash> dependence_hasher;
/* Data required for function body duplication. */
......
......@@ -1017,23 +1017,16 @@ static vec<oecount> cvec;
/* Oecount hashtable helpers. */
struct oecount_hasher
struct oecount_hasher : int_hash <int, 0, 1>
{
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];
......
......@@ -1248,19 +1248,8 @@ gimple_mod_subtract_transform (gimple_stmt_iterator *si)
return true;
}
struct profile_id_traits : default_hashmap_traits
{
template<typename T>
static bool
is_deleted (T &e)
{
return e.m_key == UINT_MAX;
}
template<typename T> static bool is_empty (T &e) { return e.m_key == 0; }
template<typename T> static void mark_deleted (T &e) { e.m_key = UINT_MAX; }
template<typename T> static void mark_empty (T &e) { e.m_key = 0; }
};
typedef int_hash <unsigned int, 0, UINT_MAX> profile_id_hash;
typedef simple_hashmap_traits <profile_id_hash> profile_id_traits;
static hash_map<unsigned int, cgraph_node *, profile_id_traits> *
cgraph_node_map = 0;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment