Description
Motivation
We are currently using a non-standard ABI (there isn't really a standardized one) for Wasm exports, which currently Rust is mimicking: rust-lang/rust#71871.
This has the big disadvantage of making the wasm32-unknown-unknown
backend ABI incompatible with wasm32-wasi
and wasm32-unknown-emscripten
. Which in turn makes wasm-bindgen
not compatible with any C/C++ dependency: #2317.
Plan
- Make
wasm-bindgen
follow the C ABI outlined here: https://github.com/WebAssembly/tool-conventions/blob/main/BasicCABI.md. Which mainly involves removing splatting. - Let users try it out with a compiler flag in Rust. (Introduce perma-unstable
wasm-c-abi
flag rust-lang/rust#117919:-Zwasm-c-abi
) - Figure out a migration path for users. (Add
wasm_c_abi
future-incompat
lint rust-lang/rust#117918) - Move the
wasm32-unknown-unknown
target to the C ABI. -
(optional) Introduce a flag towasm-bindgen
that uses the unstable"wasm"
ABI: Tracking issue for the unstable "wasm" ABI rust-lang/rust#83788.
Result
It should be possible to compile Rust with wasm32-unknown-unknown
while consuming Emscripten and WASI dependencies correctly, which would also partially address #3421. I know nothing about Emscripten, but WASI would require some additional hook ups to support it's API, which we should probably (help) support as well.
Downsides
There is a reason why the ABI differs, splatting is a performance improvement and the C ABI has no support for multi-value. Hopefully this can be addressed in the future and a better ABI can be agreed on. In the meantime users can use the "wasm"
ABI on nightly to opt into splatting without us having to break C compatibility for everybody else.