From: Anthony Green Date: Sun, 20 Nov 2022 17:20:40 +0000 (-0500) Subject: Fix large struct passing on PA-RISC X-Git-Tag: upstream/3.4.7~87 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=c50c16d0bcb58952840184aa83e62c6d912bf779;p=platform%2Fupstream%2Flibffi.git Fix large struct passing on PA-RISC --- diff --git a/src/pa/ffi.c b/src/pa/ffi.c index 95e6694..186bf69 100644 --- a/src/pa/ffi.c +++ b/src/pa/ffi.c @@ -376,10 +376,26 @@ extern void ffi_call_pa32(void (*)(UINT32 *, extended_cif *, unsigned), void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) { extended_cif ecif; + size_t i, nargs = cif->nargs; + ffi_type **arg_types = cif->arg_types; ecif.cif = cif; ecif.avalue = avalue; + /* If we have any large 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 && size > 8) + { + char *argcopy = alloca (size); + memcpy (argcopy, avalue[i], size); + avalue[i] = argcopy; + } + } + /* If the return value is a struct and we don't have a return value address then we need to make one. */