e940beb3af
Resolves: #2305877
48 lines
1.3 KiB
Diff
48 lines
1.3 KiB
Diff
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
|
|
|