Fix compilation bugs with webc

This commit is contained in:
Felix Schütt
2022-10-28 11:23:23 +02:00
parent a0d9248576
commit a3f833fc40
11 changed files with 43 additions and 31 deletions

8
Cargo.lock generated
View File

@@ -3785,10 +3785,8 @@ dependencies = [
"js-sys", "js-sys",
"macro-wasmer-universal-test", "macro-wasmer-universal-test",
"more-asserts", "more-asserts",
"nuke-dir",
"serde", "serde",
"serde-wasm-bindgen", "serde-wasm-bindgen",
"serde_cbor",
"target-lexicon 0.12.4", "target-lexicon 0.12.4",
"tempfile", "tempfile",
"thiserror", "thiserror",
@@ -3804,7 +3802,6 @@ dependencies = [
"wasmer-vm", "wasmer-vm",
"wasmparser 0.83.0", "wasmparser 0.83.0",
"wat", "wat",
"webc",
"winapi", "winapi",
] ]
@@ -4219,6 +4216,7 @@ dependencies = [
name = "wasmer-wasi" name = "wasmer-wasi"
version = "3.0.0-rc.1" version = "3.0.0-rc.1"
dependencies = [ dependencies = [
"anyhow",
"bincode", "bincode",
"bytes", "bytes",
"cfg-if 1.0.0", "cfg-if 1.0.0",
@@ -4227,7 +4225,9 @@ dependencies = [
"generational-arena", "generational-arena",
"getrandom", "getrandom",
"libc", "libc",
"nuke-dir",
"serde", "serde",
"serde_cbor",
"thiserror", "thiserror",
"tracing", "tracing",
"tracing-wasm", "tracing-wasm",
@@ -4235,11 +4235,13 @@ dependencies = [
"wasm-bindgen", "wasm-bindgen",
"wasm-bindgen-test", "wasm-bindgen-test",
"wasmer", "wasmer",
"wasmer-emscripten",
"wasmer-vbus", "wasmer-vbus",
"wasmer-vfs", "wasmer-vfs",
"wasmer-vnet", "wasmer-vnet",
"wasmer-wasi-local-networking", "wasmer-wasi-local-networking",
"wasmer-wasi-types", "wasmer-wasi-types",
"webc",
"winapi", "winapi",
] ]

View File

@@ -30,10 +30,6 @@ bytes = "1"
# - Optional shared dependencies. # - Optional shared dependencies.
wat = { version = "1.0", optional = true } wat = { version = "1.0", optional = true }
tracing = { version = "0.1", optional = true } tracing = { version = "0.1", optional = true }
webc = { version = "3.0.0", optional = true, default-features = false, features = ["std", "mmap"] }
serde_cbor = { version = "0.11.2", optional = true }
nuke-dir = { version = "0.1.0", optional = true }
anyhow = { version = "1.0.66", optional = true }
# Dependencies and Development Dependencies for `sys`. # Dependencies and Development Dependencies for `sys`.
[target.'cfg(not(target_arch = "wasm32"))'.dependencies] [target.'cfg(not(target_arch = "wasm32"))'.dependencies]
@@ -47,8 +43,6 @@ target-lexicon = { version = "0.12.2", default-features = false }
wasmer-compiler-singlepass = { path = "../compiler-singlepass", version = "=3.0.0-rc.1", optional = true } wasmer-compiler-singlepass = { path = "../compiler-singlepass", version = "=3.0.0-rc.1", optional = true }
wasmer-compiler-cranelift = { path = "../compiler-cranelift", version = "=3.0.0-rc.1", optional = true } wasmer-compiler-cranelift = { path = "../compiler-cranelift", version = "=3.0.0-rc.1", optional = true }
wasmer-compiler-llvm = { path = "../compiler-llvm", version = "=3.0.0-rc.1", optional = true } wasmer-compiler-llvm = { path = "../compiler-llvm", version = "=3.0.0-rc.1", optional = true }
wasmer-emscripten = { path = "../emscripten", version = "=3.0.0-rc.1", optional = true }
wasmer-wasi = { path = "../wasi", version = "=3.0.0-rc.1", optional = true }
wasm-bindgen = { version = "0.2.74", optional = true } wasm-bindgen = { version = "0.2.74", optional = true }
js-sys = { version = "0.3.51", optional = true } js-sys = { version = "0.3.51", optional = true }
@@ -99,9 +93,6 @@ default = ["sys-default"]
# default = ["js-default"] # default = ["js-default"]
std = [] std = []
core = ["hashbrown"] core = ["hashbrown"]
webc_runner = ["webc", "serde_cbor", "anyhow"]
webc_runner_rt_emscripten = ["wasmer-emscripten"]
webc_runner_rt_wasi = ["wasmer-wasi"]
# Features for `sys`. # Features for `sys`.
sys = [ sys = [

View File

@@ -437,7 +437,3 @@ mod js;
#[cfg(feature = "js")] #[cfg(feature = "js")]
pub use js::*; pub use js::*;
/// Runners for WASI / Emscripten
#[cfg(feature = "webc_runner")]
pub mod runners;

View File

@@ -92,7 +92,7 @@ wasmer-artifact-load = ["wasmer-compiler/wasmer-artifact-load"]
wasmer-artifact-create = ["wasmer-compiler/wasmer-artifact-create"] wasmer-artifact-create = ["wasmer-compiler/wasmer-artifact-create"]
static-artifact-load = ["wasmer-compiler/static-artifact-load"] static-artifact-load = ["wasmer-compiler/static-artifact-load"]
static-artifact-create = ["wasmer-compiler/static-artifact-create"] static-artifact-create = ["wasmer-compiler/static-artifact-create"]
webc_runner = ["wasmer-api/webc_runner", "wasmer-vfs", "webc"] webc_runner = ["wasmer-wasi/webc_runner", "wasmer-vfs", "webc"]
# Deprecated features. # Deprecated features.
jit = ["compiler"] jit = ["compiler"]

View File

@@ -1144,8 +1144,18 @@ unsafe fn wasi_get_imports_inner(
let import_object = c_try!(wasi_env.inner.import_object(&mut store_mut, &module.inner)); let import_object = c_try!(wasi_env.inner.import_object(&mut store_mut, &module.inner));
imports_set_buffer(&store, &module.inner, import_object, imports)?;
Some(())
}
pub(crate) fn imports_set_buffer(
store: &StoreRef,
module: &wasmer_api::Module,
import_object: wasmer_api::Imports,
imports: &mut wasm_extern_vec_t,
) -> Option<()> {
imports.set_buffer(c_try!(module imports.set_buffer(c_try!(module
.inner
.imports() .imports()
.map(|import_type| { .map(|import_type| {
let ext = import_object let ext = import_object

View File

@@ -95,7 +95,7 @@ wast = ["wasmer-wast"]
wasi = ["wasmer-wasi"] wasi = ["wasmer-wasi"]
emscripten = ["wasmer-emscripten"] emscripten = ["wasmer-emscripten"]
wat = ["wasmer/wat"] wat = ["wasmer/wat"]
webc_runner = ["wasmer/webc_runner", "nuke-dir", "webc"] webc_runner = ["wasi", "wasmer-wasi/webc_runner", "wasmer-wasi/webc_runner_rt_wasi", "wasmer-wasi/webc_runner_rt_emscripten", "nuke-dir", "webc"]
compiler = [ compiler = [
"wasmer-compiler/translator", "wasmer-compiler/translator",
"wasmer-compiler/compiler", "wasmer-compiler/compiler",

View File

@@ -15,7 +15,7 @@ use wasmer::*;
use wasmer_cache::{Cache, FileSystemCache, Hash}; use wasmer_cache::{Cache, FileSystemCache, Hash};
use wasmer_types::Type as ValueType; use wasmer_types::Type as ValueType;
#[cfg(feature = "webc_runner")] #[cfg(feature = "webc_runner")]
use wasmer::runners::WapmContainer; use wasmer_wasi::runners::{WapmContainer, Runner};
use crate::cli::SplitVersion; use crate::cli::SplitVersion;
use clap::Parser; use clap::Parser;
use wasmer_registry::PackageDownloadInfo; use wasmer_registry::PackageDownloadInfo;
@@ -371,7 +371,7 @@ impl Run {
return r; return r;
} }
let mut runner = wasmer::runners::wasi::WasiRunner::default(); let mut runner = wasmer_wasi::runners::wasi::WasiRunner::default();
runner.set_args(args.to_vec()); runner.set_args(args.to_vec());
result = Some(if id.is_empty() { result = Some(if id.is_empty() {
runner.run(&container).map_err(|e| format!("{e}")) runner.run(&container).map_err(|e| format!("{e}"))
@@ -386,7 +386,7 @@ impl Run {
return r; return r;
} }
let mut runner = wasmer::runners::emscripten::EmscriptenRunner::default(); let mut runner = wasmer_wasi::runners::emscripten::EmscriptenRunner::default();
runner.set_args(args.to_vec()); runner.set_args(args.to_vec());
result = Some(if id.is_empty() { result = Some(if id.is_empty() {
runner.run(&container).map_err(|e| format!("{e}")) runner.run(&container).map_err(|e| format!("{e}"))

View File

@@ -28,6 +28,11 @@ bincode = { version = "1.3", optional = true }
chrono = { version = "^0.4", default-features = false, features = [ "wasmbind", "std", "clock" ], optional = true } chrono = { version = "^0.4", default-features = false, features = [ "wasmbind", "std", "clock" ], optional = true }
derivative = { version = "^2" } derivative = { version = "^2" }
bytes = "1" bytes = "1"
webc = { version = "3.0.0", optional = true, default-features = false, features = ["std", "mmap"] }
serde_cbor = { version = "0.11.2", optional = true }
nuke-dir = { version = "0.1.0", optional = true }
anyhow = { version = "1.0.66", optional = true }
wasmer-emscripten = { path = "../emscripten", version = "=3.0.0-rc.1", optional = true }
[target.'cfg(unix)'.dependencies] [target.'cfg(unix)'.dependencies]
libc = { version = "^0.2", default-features = false } libc = { version = "^0.2", default-features = false }
@@ -46,6 +51,10 @@ tracing-wasm = "0.2"
default = ["sys-default"] default = ["sys-default"]
wasix = [] wasix = []
webc_runner = ["webc", "serde_cbor", "anyhow", "serde", "wasmer/compiler", "wasmer/cranelift"]
webc_runner_rt_emscripten = ["wasmer-emscripten"]
webc_runner_rt_wasi = []
sys = ["wasmer/sys", "wasix", "wasmer-wasi-types/sys"] sys = ["wasmer/sys", "wasix", "wasmer-wasi-types/sys"]
sys-default = ["wasmer/wat", "wasmer/compiler", "sys", "logging", "host-fs", "sys-poll", "host-vnet" ] sys-default = ["wasmer/wat", "wasmer/compiler", "sys", "logging", "host-fs", "sys-poll", "host-vnet" ]
sys-poll = [] sys-poll = []

View File

@@ -40,6 +40,10 @@ mod state;
mod syscalls; mod syscalls;
mod utils; mod utils;
/// Runners for WASI / Emscripten
#[cfg(feature = "webc_runner")]
pub mod runners;
use crate::syscalls::*; use crate::syscalls::*;
pub use crate::state::{ pub use crate::state::{

View File

@@ -3,7 +3,7 @@
use crate::runners::WapmContainer; use crate::runners::WapmContainer;
use anyhow::anyhow; use anyhow::anyhow;
use serde_derive::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::error::Error as StdError; use std::error::Error as StdError;
use std::sync::Arc; use std::sync::Arc;
use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store}; use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store};
@@ -24,7 +24,7 @@ impl EmscriptenRunner {
} }
} }
impl crate::Runner for EmscriptenRunner { impl crate::runners::Runner for EmscriptenRunner {
type Output = (); type Output = ();
fn can_run_command(&self, _: &str, command: &Command) -> Result<bool, Box<dyn StdError>> { fn can_run_command(&self, _: &str, command: &Command) -> Result<bool, Box<dyn StdError>> {
@@ -48,7 +48,7 @@ impl crate::Runner for EmscriptenRunner {
let mut module = Module::new(&store, atom_bytes)?; let mut module = Module::new(&store, atom_bytes)?;
module.set_name(&atom_name); module.set_name(&atom_name);
let (mut globals, mut env) = let (mut globals, env) =
prepare_emscripten_env(&mut store, &module, container.webc.clone(), &atom_name)?; prepare_emscripten_env(&mut store, &module, container.webc.clone(), &atom_name)?;
exec_module( exec_module(
@@ -82,9 +82,9 @@ fn prepare_emscripten_env(
)); ));
} }
let mut env = FunctionEnv::new(store, EmEnv::new()); let env = FunctionEnv::new(store, EmEnv::new());
let emscripten_globals = EmscriptenGlobals::new(store, &env, &module); let emscripten_globals = EmscriptenGlobals::new(store, &env, &module);
let mut emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?; let emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?;
env.as_mut(store) env.as_mut(store)
.set_data(&emscripten_globals.data, Default::default()); .set_data(&emscripten_globals.data, Default::default());

View File

@@ -4,11 +4,11 @@
use wasmer_vfs::webc_fs::WebcFileSystem; use wasmer_vfs::webc_fs::WebcFileSystem;
use crate::runners::WapmContainer; use crate::runners::WapmContainer;
use anyhow::{anyhow, Context}; use anyhow::{anyhow, Context};
use serde_derive::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
use std::error::Error as StdError; use std::error::Error as StdError;
use std::sync::Arc; use std::sync::Arc;
use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store}; use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store};
use wasmer_wasi::{VirtualFile, WasiFunctionEnv, WasiState}; use crate::{VirtualFile, WasiFunctionEnv, WasiState};
use webc::{Command, WebCMmap}; use webc::{Command, WebCMmap};
#[derive(Debug, Default, Clone, PartialEq, PartialOrd, Hash, Serialize, Deserialize)] #[derive(Debug, Default, Clone, PartialEq, PartialOrd, Hash, Serialize, Deserialize)]
@@ -22,7 +22,7 @@ impl WasiRunner {
} }
} }
impl crate::Runner for WasiRunner { impl crate::runners::Runner for WasiRunner {
type Output = (); type Output = ();
fn can_run_command( fn can_run_command(
@@ -94,7 +94,7 @@ fn prepare_webc_env(
pub(crate) fn exec_module( pub(crate) fn exec_module(
store: &mut Store, store: &mut Store,
module: &Module, module: &Module,
mut wasi_env: wasmer_wasi::WasiFunctionEnv, wasi_env: crate::WasiFunctionEnv,
) -> Result<(), anyhow::Error> { ) -> Result<(), anyhow::Error> {
let import_object = wasi_env.import_object(store, &module)?; let import_object = wasi_env.import_object(store, &module)?;
let instance = Instance::new(store, &module, &import_object)?; let instance = Instance::new(store, &module, &import_object)?;