Branch
Hash :
20eacb22
Author :
Date :
2025-08-02T15:28:46
Emscripten: Add wasm64 target (#927) * src/wasm32: Allow building with Emscripten with 64bit support MEMORY64 enables 64bit pointers so this commit updates the accessors for the libffi data structures accordingly. Each JS functions in ffi.c receives pointers as BigInt (i64) values and with casts them to Numer (i53) using bigintToI53Checked. While memory64 supports 64bit addressing, the maximum memory size is currently limited to 16GiB [1]. Therefore, we can assume that the passed pointers are within the Number's range. [1] https://webassembly.github.io/memory64/js-api/#limits Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> * Add wasm64 target to the build scripts This commit adds support for the wasm64 target via the configure script. Emscripten supports two modes of the -sMEMORY64 flag[1] so the script allows users specifying the value through a configuration variable. Additionally, "src/wasm32" directory has been renamed to the more generic "src/wasm" because it's now shared between both 32bit and 64bit builds. [1] https://emscripten.org/docs/tools_reference/settings_reference.html#memory64 Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> * GitHub Actions: Add wasm64 tests This commit adds a test matrix for wasm32, wasm64 and wasm64 with the -sMEMORY64=2 flag, using the latest version of Emscripten. -Wno-main is added to suppress the following warning in unwindtest.cc and unwindtest_ffi_call.cc. > FAIL: libffi.closures/unwindtest_ffi_call.cc -W -Wall -O2 (test for excess errors) > Excess errors: > ./libffi.closures/unwindtest_ffi_call.cc:20:5: warning: 'main' should not be 'extern "C"' [-Wmain] > 20 | int main (void) > | ^ > 1 warning generated. Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> * testsuite: Fix types of main function test_libffi.py calls each test's main function without arguments, but some tests define the main function with parameters. This signature mismatch causes a runtime error with the recent version of Emscripten. This commit resolves this issue by updating the function signatures to match the way they are called. Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> * README: Add document about WASM64 Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com> --------- Signed-off-by: Kohei Tokunaga <ktokunaga.mail@gmail.com>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79
/* -----------------------------------------------------------------*-C-*-
ffitarget.h - Copyright (c) 2018-2023 Hood Chatham, Brion Vibber, Kleis Auke Wolthuizen, and others.
Target configuration macros for wasm32.
Permission is hereby granted, free of charge, to any person obtaining
a copy of this software and associated documentation files (the
``Software''), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:
The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED ``AS IS'', WITHOUT WARRANTY OF ANY KIND,
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
DEALINGS IN THE SOFTWARE.
----------------------------------------------------------------------- */
#ifndef LIBFFI_TARGET_H
#define LIBFFI_TARGET_H
#ifndef LIBFFI_H
#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead."
#endif
/* ---- Generic type definitions ----------------------------------------- */
typedef unsigned long ffi_arg;
typedef signed long ffi_sarg;
// TODO: https://github.com/emscripten-core/emscripten/issues/9868
typedef void (*ffi_fp)(void);
typedef enum ffi_abi {
FFI_FIRST_ABI = 0,
#if __SIZEOF_POINTER__ == 4
FFI_WASM32, // "raw", no structures, varargs, or closures (not implemented!)
FFI_WASM32_EMSCRIPTEN, // structures, varargs, and split 64-bit params
#elif __SIZEOF_POINTER__ == 8
FFI_WASM64,
FFI_WASM64_EMSCRIPTEN,
#else
#error "Unknown pointer size"
#endif
FFI_LAST_ABI,
#if __SIZEOF_POINTER__ == 4
#ifdef __EMSCRIPTEN__
FFI_DEFAULT_ABI = FFI_WASM32_EMSCRIPTEN
#else
FFI_DEFAULT_ABI = FFI_WASM32
#endif
#elif __SIZEOF_POINTER__ == 8
#ifdef __EMSCRIPTEN__
FFI_DEFAULT_ABI = FFI_WASM64_EMSCRIPTEN
#else
FFI_DEFAULT_ABI = FFI_WASM64
#endif
#else
#error "Unknown pointer size"
#endif
} ffi_abi;
#define FFI_CLOSURES 1
// #define FFI_GO_CLOSURES 0
#define FFI_TRAMPOLINE_SIZE 4
// #define FFI_NATIVE_RAW_API 0
#define FFI_TARGET_SPECIFIC_VARIADIC 1
#define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs
#endif