Ian Lance Taylor <i...@google.com> writes:

> This patch to libgo, from Peter Collingbourne, changes some of the C
> code to make it easier to compile libgo with a compiler other than GCC.
> Bootstrapped and ran Go testsuite on x86_64-unknown-linux-gnu.
> Committed to mainline.
[...]
> diff -r d73f07d002ef libgo/runtime/print.c
> --- a/libgo/runtime/print.c   Tue May 27 15:00:31 2014 -0700
> +++ b/libgo/runtime/print.c   Wed May 28 16:09:25 2014 -0700
> @@ -2,6 +2,8 @@
>  // Use of this source code is governed by a BSD-style
>  // license that can be found in the LICENSE file.
>  
> +#include <complex.h>
> +#include <math.h>
>  #include <stdarg.h>
>  #include "runtime.h"
>  #include "array.h"
> @@ -174,13 +176,12 @@
>               gwrite("NaN", 3);
>               return;
>       }
> -     i = __builtin_isinf_sign(v);
> -     if(i > 0) {
> -             gwrite("+Inf", 4);
> -             return;
> -     }
> -     if(i < 0) {
> -             gwrite("-Inf", 4);
> +     if(isinf(v)) {
> +             if(signbit(v)) {
> +                     gwrite("-Inf", 4);
> +             } else {
> +                     gwrite("+Inf", 4);
> +             }
>               return;
>       }
>  

This change broke Solaris Go bootstrap:

/vol/gcc/src/hg/trunk/local/libgo/runtime/print.c: In function 
'__go_print_double':
/vol/gcc/src/hg/trunk/local/libgo/runtime/print.c:200:3: error: dereferencing 
type-punned pointer will break strict-aliasing rules [-Werror=strict-aliasing]
   if(signbit(v)) {
   ^
cc1: all warnings being treated as errors
make: *** [print.lo] Error 1

It's an issue in the gcc version of signbit in <iso/math_c99.h>,
ultimately:

#undef  signbit
#if defined(__sparc)
#define signbit(x)      __extension__( \
                        { __typeof(x) __x_s = (x); \
                        (int) (*(unsigned *) &__x_s >> 31); })
#elif defined(__i386) || defined(__amd64)
#define signbit(x)      __extension__( \
                        { __typeof(x) __x_s = (x); \
                        (sizeof (__x_s) == sizeof (float) ? \
                        (int) (*(unsigned *) &__x_s >> 31) : \
                        sizeof (__x_s) == sizeof (double) ? \
                        (int) (((unsigned *) &__x_s)[1] >> 31) : \
                        (int) (((unsigned short *) &__x_s)[4] >> 15)); })
#endif

Solaris lacks __signbit{f,,l} in libm, like some other Unices do, and
cannot use __builtin_signbit since that is missing in gcc 3.4 still
bundled with Solaris 10 and 11.  I'll probably go for handling this in
fixincludes on mainline, though, where the gcc 3 issue is irrelevant.

        Rainer

-- 
-----------------------------------------------------------------------------
Rainer Orth, Center for Biotechnology, Bielefeld University

Reply via email to