libffi: Fix 32-bit SPARC structure passing [PR115681]
Checks
Commit Message
The libffi.closures/single_entry_structs2.c test FAILs on 32-bit SPARC:
FAIL: libffi.closures/single_entry_structs2.c -W -Wall -Wno-psabi -O0 execution test
The issue has been reported, analyzed and fixed upstream:
Several tests FAIL on 32-bit Solaris/SPARC
https://github.com/libffi/libffi/issues/841
Therefore this patch imports the fix into the GCC tree.
Tested on sparc-sun-solaris2.11. Ok for trunk?
Rainer
Comments
> The issue has been reported, analyzed and fixed upstream:
>
> Several tests FAIL on 32-bit Solaris/SPARC
> https://github.com/libffi/libffi/issues/841
>
> Therefore this patch imports the fix into the GCC tree.
>
> Tested on sparc-sun-solaris2.11. Ok for trunk?
Sure, thanks!
# HG changeset patch
# Parent 31401e58fa469c62c2278e38d35817fab3407e97
libffi: Fix 32-bit SPARC structure passing
@@ -286,6 +286,8 @@ ffi_call_int (ffi_cif *cif, void (*fn)(v
void **avalue, void *closure)
{
size_t bytes = cif->bytes;
+ size_t i, nargs = cif->nargs;
+ ffi_type **arg_types = cif->arg_types;
FFI_ASSERT (cif->abi == FFI_V8);
@@ -295,6 +297,20 @@ ffi_call_int (ffi_cif *cif, void (*fn)(v
&& (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT)
bytes += FFI_ALIGN (cif->rtype->size, 8);
+ /* If we have any structure arguments, make a copy so we are passing
+ by value. */
+ for (i = 0; i < nargs; i++)
+ {
+ ffi_type *at = arg_types[i];
+ int size = at->size;
+ if (at->type == FFI_TYPE_STRUCT)
+ {
+ char *argcopy = alloca (size);
+ memcpy (argcopy, avalue[i], size);
+ avalue[i] = argcopy;
+ }
+ }
+
ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure);
}