Description
After compiling this simple example with emscripten (using tot-upstream
, with em++ issue_577.cpp -s WASM=1 -o issue_577.wasm
):
#include <iostream>
int main(int argc, char* argv[]) {
std::cout << "Does this work?" << std::endl;
return 0;
}
The WebAssembly file has the following imports:
(import "env" "__cxa_uncaught_exceptions" (func $env.__cxa_uncaught_exceptions (type $t16)))
(import "env" "__cxa_atexit" (func $env.__cxa_atexit (type $t1)))
(import "env" "__syscall6" (func $env.__syscall6 (type $t2)))
(import "env" "__syscall145" (func $env.__syscall145 (type $t2)))
(import "env" "__syscall140" (func $env.__syscall140 (type $t2)))
(import "wasi_unstable" "fd_write" (func $wasi_unstable.fd_write (type $t11)))
(import "env" "getenv" (func $env.getenv (type $t0)))
(import "env" "__map_file" (func $env.__map_file (type $t2)))
(import "env" "__syscall91" (func $env.__syscall91 (type $t2)))
(import "env" "strftime_l" (func $env.strftime_l (type $t7)))
(import "env" "__cxa_pure_virtual" (func $env.__cxa_pure_virtual (type $t12)))
(import "env" "pthread_cond_broadcast" (func $env.pthread_cond_broadcast (type $t0)))
(import "env" "pthread_cond_wait" (func $env.pthread_cond_wait (type $t2)))
(import "wasi_unstable" "proc_exit" (func $wasi_unstable.proc_exit (type $t10)))
Note that there wasi_unstable
imports are mixed with the emscripten env
ones.
(See attached generated wasm: issue_577.wasm.zip)
This makes a bit hard for standalone-wasm implementors, as now we have to mix two different ABIs (WASI and Emscripten POSIX-like) and make sure they both run properly. This is quite challenging as both WASI and Emscripten have a different data structure in the VM context (in Wasmer, the struct holding the the VM WASI data is different than the Emscripten data)
I think Emscripten should adopt only WASI when all the imports are WASI-like, otherwise use the already existing ABI.
Thoughts @kripken?