mirror of
https://github.com/gcc-mirror/gcc.git
synced 2024-11-21 13:40:47 +00:00
libffi: Fix 32-bit SPARC structure passing [PR115681]
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. 2024-07-01 Rainer Orth <ro@CeBiTec.Uni-Bielefeld.DE> libffi: PR libffi/115681 * src/sparc/ffi.c (ffi_call_int): Copy structure arguments to maintain call-by-value semantics.
This commit is contained in:
parent
286cda3461
commit
61aa380bad
@ -286,6 +286,8 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue,
|
||||
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)(void), void *rvalue,
|
||||
&& (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);
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user