https://gcc.gnu.org/bugzilla/show_bug.cgi?id=87289

Peter Bergner <bergner at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
             Status|UNCONFIRMED                 |RESOLVED
                 CC|                            |bergner at gcc dot gnu.org
         Resolution|---                         |INVALID

--- Comment #8 from Peter Bergner <bergner at gcc dot gnu.org> ---
(In reply to pdbain from comment #5)
> The compiler trips on this part of jnicsup.cpp (ca. line 500):
> 
> #ifdef J9VM_INTERP_FLOAT_SUPPORT
>                       case 'F':
>                               /* float type */
>                               fltPtr = (jfloat*)--sp;
>                               /* The Linux SH4 compiler needs the next two 
> lines to be two steps.  If
> you combine them it fails to compile */
>                               dbl = ARG(jdouble, f);
>                               *fltPtr = (jfloat)dbl;
>                               break;
>                       case 'D':
>                               /* double type */
>                               dbl = ARG(jdouble, d);
>                               lngOrDblPtr = (UDATA *) &dbl;
>                               goto pushLongOrDouble;
> #endif
>                       case 'J':
>                               /* long type */
>                               lng = ARG(jlong, j);
>                               lngOrDblPtr = (UDATA *) &lng;
> pushLongOrDouble:
> #ifdef J9VM_ENV_DATA64
>                               --sp;
>                               *--sp = *(lngOrDblPtr);
> #else
>                               *--sp = *(lngOrDblPtr + 1);
>                               *--sp = *(lngOrDblPtr);
> #endif
>                               break;

I was able to create a small reproducer program and it shows you have a
-fstrict-aliasing bug in your source code.  You take the address of the double
var "dbl" and cast its address to a UDATA * pointer and then use it.  That
violates aliasing rules.  I was able to get my small reproducer program to work
using the -fno-strict-aliasing option as well as using -O0 and -O1 where
-fstrict-aliasing is not enabled by default.

I'll note that a quick scan through pushArguments() shows other code that looks
to violate the aliasing rules too.  You can either use -fno-strict-aliasing as
a work around or you will need to fix your code.

Reply via email to