[PATCH] Fix libffi build on powerpc64-linux

Anthony Green green@moxielogic.com
Mon Apr 2 17:12:00 GMT 2012


On Mon, Apr 2, 2012 at 12:36 PM, Peter Bergner <bergner@vnet.ibm.com> wrote:
> Hi Anthony,
>
> I'd like to ping this patch that fixes the powerpc64-linux build breakage,
> which is also causing GCC mainline bootstrap to be broken (when building
> Java).  Can you please pull this fix and merge it into the GCC sources?

Please go ahead and check this into GCC.  I'll rebase the stand-alone
libffi from GCC tonight and submit the few patches I have left.

AG



>
> It passes build and make check on powerpc64-linux.  There is one make
> check error showing up on powerpc-linux (ie, 32-bit), but that is not
> related to this patch and seems to probably have been failing for
> years.  I'm working on a fix for that, but would like to see this
> patch go in now.  Thanks.
>
> Peter
>
>
>        * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp.
>        Silence casting pointer to integer of different size warning.
>        Delete goto to previously deleted label.
>        (ffi_call): Silence possibly undefined warning.
>        (ffi_closure_helper_SYSV): Declare variable type.
>
> diff --git a/src/powerpc/ffi.c b/src/powerpc/ffi.c
> index 1920c91..baca694 100644
> --- a/src/powerpc/ffi.c
> +++ b/src/powerpc/ffi.c
> @@ -146,6 +146,7 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
>   gpr_base.u = stacktop.u - ASM_NEEDS_REGISTERS - NUM_GPR_ARG_REGISTERS;
>   intarg_count = 0;
>  #ifndef __NO_FPRS__
> +  double double_tmp;
>   fpr_base.d = gpr_base.d - NUM_FPR_ARG_REGISTERS;
>   fparg_count = 0;
>   copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c);
> @@ -155,9 +156,9 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
>   next_arg.u = stack + 2;
>
>   /* Check that everything starts aligned properly.  */
> -  FFI_ASSERT (((unsigned) (char *) stack & 0xF) == 0);
> -  FFI_ASSERT (((unsigned) copy_space.c & 0xF) == 0);
> -  FFI_ASSERT (((unsigned) stacktop.c & 0xF) == 0);
> +  FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0);
> +  FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0);
> +  FFI_ASSERT (((unsigned long) stacktop.c & 0xF) == 0);
>   FFI_ASSERT ((bytes & 0xF) == 0);
>   FFI_ASSERT (copy_space.c >= next_arg.c);
>
> @@ -211,8 +212,6 @@ ffi_prep_args_SYSV (extended_cif *ecif, unsigned *const stack)
>
>        case FFI_TYPE_DOUBLE:
>          /* With FFI_LINUX_SOFT_FLOAT doubles are handled like UINT64.  */
> -         if (ecif->cif->abi == FFI_LINUX_SOFT_FLOAT)
> -           goto soft_double_prep;
>          double_tmp = **p_argv.d;
>
>          if (fparg_count >= NUM_FPR_ARG_REGISTERS)
> @@ -925,7 +924,7 @@ ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue)
>    */
>   unsigned int smst_buffer[2];
>   extended_cif ecif;
> -  unsigned int rsize;
> +  unsigned int rsize = 0;
>
>   ecif.cif = cif;
>   ecif.avalue = avalue;
> @@ -1132,7 +1131,7 @@ ffi_closure_helper_SYSV (ffi_closure *closure, void *rvalue,
>
>          if (nf < 8)
>            {
> -             temp = pfr->d;
> +             double temp = pfr->d;
>              pfr->f = (float) temp;
>              avalue[i] = pfr;
>              nf++;
>
>



More information about the Libffi-discuss mailing list