[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