diff options
Diffstat (limited to 'js/src/ctypes/libffi-patches/arm64-darwin-variadic.patch')
-rw-r--r-- | js/src/ctypes/libffi-patches/arm64-darwin-variadic.patch | 34 |
1 files changed, 34 insertions, 0 deletions
diff --git a/js/src/ctypes/libffi-patches/arm64-darwin-variadic.patch b/js/src/ctypes/libffi-patches/arm64-darwin-variadic.patch new file mode 100644 index 0000000000..f617a61744 --- /dev/null +++ b/js/src/ctypes/libffi-patches/arm64-darwin-variadic.patch @@ -0,0 +1,34 @@ +https://github.com/libffi/libffi/pull/577. + +diff --git a/js/src/ctypes/libffi/src/aarch64/ffi.c b/js/src/ctypes/libffi/src/aarch64/ffi.c +index 1ebf43c192afe..a0a8c69dacf8b 100644 +--- a/js/src/ctypes/libffi/src/aarch64/ffi.c ++++ b/js/src/ctypes/libffi/src/aarch64/ffi.c +@@ -638,22 +638,23 @@ ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue, + if (state.ngrn < N_X_ARG_REG) + context->x[state.ngrn++] = ext; + else + { + void *d = allocate_to_stack (&state, stack, ty->alignment, s); + state.ngrn = N_X_ARG_REG; + /* Note that the default abi extends each argument + to a full 64-bit slot, while the iOS abi allocates +- only enough space. */ ++ only enough space, except for variadic arguments. */ + #ifdef __APPLE__ +- memcpy(d, a, s); +-#else +- *(ffi_arg *)d = ext; ++ if (!state.allocating_variadic) ++ memcpy(d, a, s); ++ else + #endif ++ *(ffi_arg *)d = ext; + } + } + break; + + case FFI_TYPE_FLOAT: + case FFI_TYPE_DOUBLE: + case FFI_TYPE_LONGDOUBLE: + case FFI_TYPE_STRUCT: |