mirror of
https://github.com/dart-lang/sdk
synced 2024-11-02 09:43:08 +00:00
affc3392a0
This CL introduces a new kernel-to-kernel pass in Wasm backend to compile `FfiNative`-annotated external functions to external functions with `wasm:import` pragmas. The new pass `WasmFfiNativeTransformer` extends `FfiNativeTransformer`. Some `FfiNativeTransformer` methods made public to allow reuse in the pass. The conversion works like this: when we see a member like: @FfiNative<Int8 Function(Int8, Int8)>("ffi.addInt8") external int addInt8(int a, int b); We generate a Wasm import using Wasm ABI types according to emscripten calling conventions: @pragma('wasm:import', 'ffi.addInt8') external static WasmI32 addInt8_$import(WasmI32 a, WasmI32 b); and convert the original member (`addInt8()`) to a wrapper function that calls the Wasm import, converting the arguments and return values to Dart types: static int addInt8(int a, int b) { return WasmI32.toIntSigned( addInt8_$import( WasmI32::int8FromInt(a), WasmI32::int8FromInt(b), )); } Build, test, and CI changes: - Test runner now uses `// SharedObjects=...` lines in dart2wasm tests to pass extra Wasm modules to d8 command used to run the tests. Support for `// SharedObjects=...` lines were already used in native/AOT FFI tests, not added in this CL. We just start to use those lines in dart2wasm tests. - dart2wasm gn file updated with a target "test_wasm_modules" that builds FFI test Wasm modules to Wasm using emcc (emscripten C compiler). - CI dart2wasm_hostasserts configuration updated to copy the Wasm files generated by the "test_wasm_modules" target to the shards. TEST=tests/web/wasm/ffi_native_test Change-Id: I6527fe4e2ca2b582e16d84fee244e9cbe6dee307 Reviewed-on: https://dart-review.googlesource.com/c/sdk/+/252822 Reviewed-by: Alexander Thomas <athom@google.com> Commit-Queue: Ömer Ağacan <omersa@google.com> Reviewed-by: Ryan Macnak <rmacnak@google.com> Reviewed-by: Aske Simon Christensen <askesc@google.com> |
||
---|---|---|
.. | ||
BUILD.gn |