mirror of
https://github.com/dart-lang/sdk
synced 2024-11-05 18:22:09 +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>
257 lines
6.4 KiB
Text
257 lines
6.4 KiB
Text
# Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file
|
|
# for details. All rights reserved. Use of this source code is governed by a
|
|
# BSD-style license that can be found in the LICENSE file.
|
|
|
|
import("build/config/gclient_args.gni")
|
|
import("sdk_args.gni")
|
|
|
|
targetting_fuchsia = target_os == "fuchsia"
|
|
|
|
# This target will be built if no target is specified when invoking ninja.
|
|
group("default") {
|
|
if (targetting_fuchsia) {
|
|
# Fuchsia has run_vm_tests marked testonly.
|
|
testonly = true
|
|
}
|
|
deps = [ ":runtime" ]
|
|
}
|
|
|
|
group("most") {
|
|
import("runtime/runtime_args.gni")
|
|
if (targetting_fuchsia) {
|
|
# Fuchsia has run_vm_tests marked testonly.
|
|
testonly = true
|
|
}
|
|
deps = [
|
|
":analysis_server",
|
|
":create_sdk",
|
|
":dart2js",
|
|
":dartanalyzer",
|
|
":dartdevc",
|
|
":runtime",
|
|
]
|
|
}
|
|
|
|
group("runtime") {
|
|
import("runtime/runtime_args.gni")
|
|
|
|
if (targetting_fuchsia) {
|
|
# Fuchsia has run_vm_tests marked testonly.
|
|
testonly = true
|
|
}
|
|
|
|
deps = [
|
|
"runtime/bin:dart",
|
|
"runtime/bin:entrypoints_verification_test",
|
|
"runtime/bin:ffi_test_dynamic_library",
|
|
"runtime/bin:ffi_test_functions",
|
|
"runtime/bin:process_test",
|
|
"runtime/bin:run_vm_tests",
|
|
"runtime/vm:kernel_platform_files($host_toolchain)",
|
|
"utils/kernel-service:kernel-service",
|
|
]
|
|
|
|
# TODO(bkonyi): this dep causes a segfault on Android XARM_X64 builds.
|
|
# See issue #41776.
|
|
if (dart_target_arch != "arm") {
|
|
deps += [
|
|
"utils/dartdev:dartdev",
|
|
"utils/dds:dds",
|
|
]
|
|
}
|
|
|
|
# We do not support AOT on ia32 and should therefore not provide native
|
|
# snapshot tooling.
|
|
if (dart_target_arch != "ia32" && dart_target_arch != "x86") {
|
|
if (dart_runtime_mode == "release") {
|
|
deps += [ "runtime/bin:analyze_snapshot_product" ]
|
|
} else {
|
|
deps += [ "runtime/bin:analyze_snapshot" ]
|
|
}
|
|
}
|
|
|
|
if (is_linux || is_android) {
|
|
deps += [ "runtime/bin:abstract_socket_test" ]
|
|
}
|
|
}
|
|
|
|
# A separate target and not included in group("runtime"). This way the target\
|
|
# "runtime" does not get many executables extra as build output.
|
|
group("run_ffi_unit_tests") {
|
|
deps = [ "runtime/bin/ffi_unit_test:run_ffi_unit_tests" ]
|
|
}
|
|
|
|
group("runtime_precompiled") {
|
|
deps = [
|
|
"runtime/bin:dart_precompiled_runtime",
|
|
"runtime/bin:process_test",
|
|
]
|
|
if (is_linux || is_android) {
|
|
deps += [ "runtime/bin:abstract_socket_test" ]
|
|
}
|
|
}
|
|
|
|
group("create_sdk") {
|
|
public_deps = [ "sdk:create_sdk" ]
|
|
}
|
|
|
|
group("create_platform_sdk") {
|
|
public_deps = [ "sdk:create_platform_sdk" ]
|
|
}
|
|
|
|
group("dart2js") {
|
|
deps = [ "utils/compiler:dart2js" ]
|
|
}
|
|
|
|
group("dart2wasm") {
|
|
deps = [
|
|
":runtime_precompiled",
|
|
"utils/dart2wasm:compile_dart2wasm_platform",
|
|
"utils/dart2wasm:dart2wasm_asserts_snapshot",
|
|
"utils/dart2wasm:dart2wasm_snapshot",
|
|
"utils/dart2wasm:test_wasm_modules",
|
|
]
|
|
}
|
|
|
|
group("dartanalyzer") {
|
|
deps = [ "utils/dartanalyzer" ]
|
|
}
|
|
|
|
group("dartdevc") {
|
|
deps = [ "utils/dartdevc" ]
|
|
}
|
|
|
|
group("analysis_server") {
|
|
deps = [ "utils/analysis_server" ]
|
|
}
|
|
|
|
# This is the target that is built on the dart2js build bots.
|
|
# It must depend on anything that is required by the dart2js
|
|
# test suites.
|
|
group("dart2js_bot") {
|
|
deps = [ ":create_sdk" ]
|
|
}
|
|
|
|
# This rule and the compressed_observatory_archive rule are for the Fuchsia
|
|
# bots that pre-build the Observatory. They copy the observatory tar files to
|
|
# the root build output directory for convenient access by the Fuchsia buildbot
|
|
# scripts.
|
|
group("observatory_archive") {
|
|
deps = [ "runtime/observatory:copy_observatory_archive" ]
|
|
}
|
|
|
|
group("compressed_observatory_archive") {
|
|
deps = [ "runtime/observatory:copy_compressed_observatory_archive" ]
|
|
}
|
|
|
|
if (is_fuchsia) {
|
|
import("third_party/fuchsia/sdk/${host_os}/build/component.gni")
|
|
import("third_party/fuchsia/sdk/${host_os}/build/package.gni")
|
|
|
|
template("dart_fuchsia_test_package") {
|
|
fuchsia_package(target_name) {
|
|
package_name = invoker.package_name
|
|
if (is_debug) {
|
|
package_name += "_debug"
|
|
} else if (is_release) {
|
|
package_name += "_release"
|
|
} else if (is_product) {
|
|
package_name += "_product"
|
|
}
|
|
testonly = true
|
|
deps = invoker.deps
|
|
}
|
|
}
|
|
|
|
template("dart_fuchsia_test_component") {
|
|
fuchsia_component(target_name) {
|
|
testonly = true
|
|
data_deps = [ "runtime/bin:dart" ]
|
|
if (defined(invoker.data_deps)) {
|
|
data_deps += invoker.data_deps
|
|
}
|
|
manifest = "build/fuchsia/dart.cmx"
|
|
|
|
library_files = []
|
|
if (defined(invoker.library_files)) {
|
|
library_files += invoker.library_files
|
|
}
|
|
resource_files = [
|
|
".dart_tool/package_config.json",
|
|
"pkg/testing/test/hello_test.dart",
|
|
"tools/addlatexhash.dart",
|
|
]
|
|
resource_dirs = invoker.resource_dirs
|
|
|
|
resources = []
|
|
foreach(file, library_files) {
|
|
resources += [
|
|
{
|
|
path = root_out_dir + "/" + file
|
|
dest = "lib/" + file
|
|
},
|
|
]
|
|
}
|
|
foreach(file, resource_files) {
|
|
resources += [
|
|
{
|
|
path = file
|
|
dest = "data/" + file
|
|
},
|
|
]
|
|
}
|
|
resources +=
|
|
exec_script("tools/fuchsia/find_resources.py", resource_dirs, "json")
|
|
}
|
|
}
|
|
|
|
dart_fuchsia_test_component("fuchsia_test_component") {
|
|
resource_dirs = [
|
|
"tests/standalone_2",
|
|
"pkg/async_helper",
|
|
"pkg/expect",
|
|
"pkg/meta",
|
|
"pkg/native_stack_traces",
|
|
"pkg/smith",
|
|
"third_party/pkg/args",
|
|
"third_party/pkg/async",
|
|
"third_party/pkg/collection",
|
|
"third_party/pkg/convert",
|
|
"third_party/pkg/crypto",
|
|
"third_party/pkg/http",
|
|
"third_party/pkg/http_parser",
|
|
"third_party/pkg/path",
|
|
"third_party/pkg/pool",
|
|
"third_party/pkg/stack_trace",
|
|
"third_party/pkg/string_scanner",
|
|
"third_party/pkg/typed_data",
|
|
]
|
|
}
|
|
|
|
dart_fuchsia_test_package("fuchsia_test_package") {
|
|
package_name = "dart_test"
|
|
deps = [ ":fuchsia_test_component" ]
|
|
}
|
|
|
|
dart_fuchsia_test_component("fuchsia_ffi_test_component") {
|
|
data_deps = [
|
|
"runtime/bin:ffi_test_dynamic_library",
|
|
"runtime/bin:ffi_test_functions",
|
|
]
|
|
library_files = [
|
|
"libffi_test_dynamic_library.so",
|
|
"libffi_test_functions.so",
|
|
]
|
|
resource_dirs = [
|
|
"pkg/expect",
|
|
"pkg/meta",
|
|
"tests/ffi",
|
|
"third_party/pkg/ffi",
|
|
]
|
|
}
|
|
|
|
dart_fuchsia_test_package("fuchsia_ffi_test_package") {
|
|
package_name = "dart_ffi_test"
|
|
deps = [ ":fuchsia_ffi_test_component" ]
|
|
}
|
|
}
|