http://gcc.gnu.org/bugzilla/show_bug.cgi?id=50165

--- Comment #4 from Richard Guenther <rguenth at gcc dot gnu.org> 2011-08-24 
10:16:56 UTC ---
(In reply to comment #3)
> The following patch fixes the problem for me:
> 
> diff --git a/gcc/data-streamer.h b/gcc/data-streamer.h
> index c413a75..acf1305 100644
> --- a/gcc/data-streamer.h
> +++ b/gcc/data-streamer.h
> @@ -92,12 +92,7 @@ static inline hashval_t
>  hash_string_slot_node (const void *p)
>  {
>    const struct string_slot *ds = (const struct string_slot *) p;
> -  hashval_t r = ds->len;
> -  int i;
> -
> -  for (i = 0; i < ds->len; i++)
> -     r = r * 67 + (unsigned)ds->s[i] - 113;
> -  return r;
> +  return (hashval_t) htab_hash_string (ds->s);
>  }
> 
>  /* Returns nonzero if P1 and P2 are equal.  */
> @@ -107,11 +102,7 @@ eq_string_slot_node (const void *p1, const void *p2)
>  {
>    const struct string_slot *ds1 = (const struct string_slot *) p1;
>    const struct string_slot *ds2 = (const struct string_slot *) p2;
> -
> -  if (ds1->len == ds2->len)
> -    return memcmp (ds1->s, ds2->s, ds1->len) == 0;
> -
> -  return 0;
> +  return strcmp (ds1->s, ds2->s) == 0;
>  }
> 
>  /* Returns a new bit-packing context for bit-packing into S.  */

Can you check if keeping the ds1->len == ds2->len check in eq_string_slot_node
but using strcmp works as well?  If not, then it seems ->len is not
properly initialized in all cases (which would explain that changing the
hash is also important).

Reply via email to