This libgo patch improves the big-endian hash function for key sizes less than 8 bytes. The previous hash function would always make all hash values a large multiple of some constants, which interacted badly with the map code. This patch fixes that problem and fixes PR 52342. Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu. Committed to mainline.
Ian
diff -r 071257161dab libgo/runtime/go-type-identity.c --- a/libgo/runtime/go-type-identity.c Sun Mar 04 22:03:57 2012 -0800 +++ b/libgo/runtime/go-type-identity.c Sun Mar 04 22:36:37 2012 -0800 @@ -6,6 +6,7 @@ #include <stddef.h> +#include "config.h" #include "go-type.h" /* The 64-bit type. */ @@ -31,7 +32,11 @@ unsigned char a[8]; } u; u.v = 0; - __builtin_memcpy (&u.a, key, key_size); +#ifdef WORDS_BIGENDIAN + __builtin_memcpy (&u.a[8 - key_size], key, key_size); +#else + __builtin_memcpy (&u.a[0], key, key_size); +#endif if (sizeof (uintptr_t) >= 8) return (uintptr_t) u.v; else