libffi/0007-Fix-struct-args-Rainer-Orth.patch

48 lines
1.3 KiB
Diff
Raw Normal View History

From 8e3ef965c2d0015ed129a06d0f11f30c2120a413 Mon Sep 17 00:00:00 2001
From: Anthony Green <green@moxielogic.com>
Date: Fri, 28 Jun 2024 04:07:09 -0400
Subject: [PATCH 7/7] Fix struct args (Rainer Orth)
Content-type: text/plain; charset=UTF-8
---
src/sparc/ffi.c | 16 ++++++++++++++++
1 file changed, 16 insertions(+)
diff --git a/src/sparc/ffi.c b/src/sparc/ffi.c
index 9e406d0..cf819ee 100644
--- a/src/sparc/ffi.c
+++ b/src/sparc/ffi.c
@@ -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);
}
--
2.46.0