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

View File

@@ -30,10 +30,6 @@ bytes = "1"
# - Optional shared dependencies.
wat = { version = "1.0", 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`.
[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-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-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 }
js-sys = { version = "0.3.51", optional = true }
@@ -99,9 +93,6 @@ default = ["sys-default"]
# default = ["js-default"]
std = []
core = ["hashbrown"]
webc_runner = ["webc", "serde_cbor", "anyhow"]
webc_runner_rt_emscripten = ["wasmer-emscripten"]
webc_runner_rt_wasi = ["wasmer-wasi"]
# Features for `sys`.
sys = [

View File

@@ -437,7 +437,3 @@ mod js;
#[cfg(feature = "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"]
static-artifact-load = ["wasmer-compiler/static-artifact-load"]
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.
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));
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
.inner
.imports()
.map(|import_type| {
let ext = import_object

View File

@@ -95,7 +95,7 @@ wast = ["wasmer-wast"]
wasi = ["wasmer-wasi"]
emscripten = ["wasmer-emscripten"]
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 = [
"wasmer-compiler/translator",
"wasmer-compiler/compiler",

View File

@@ -15,7 +15,7 @@ use wasmer::*;
use wasmer_cache::{Cache, FileSystemCache, Hash};
use wasmer_types::Type as ValueType;
#[cfg(feature = "webc_runner")]
use wasmer::runners::WapmContainer;
use wasmer_wasi::runners::{WapmContainer, Runner};
use crate::cli::SplitVersion;
use clap::Parser;
use wasmer_registry::PackageDownloadInfo;
@@ -371,7 +371,7 @@ impl Run {
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());
result = Some(if id.is_empty() {
runner.run(&container).map_err(|e| format!("{e}"))
@@ -386,7 +386,7 @@ impl Run {
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());
result = Some(if id.is_empty() {
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 }
derivative = { version = "^2" }
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]
libc = { version = "^0.2", default-features = false }
@@ -46,6 +51,10 @@ tracing-wasm = "0.2"
default = ["sys-default"]
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-default = ["wasmer/wat", "wasmer/compiler", "sys", "logging", "host-fs", "sys-poll", "host-vnet" ]
sys-poll = []

View File

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

View File

@@ -3,7 +3,7 @@
use crate::runners::WapmContainer;
use anyhow::anyhow;
use serde_derive::{Deserialize, Serialize};
use serde::{Deserialize, Serialize};
use std::error::Error as StdError;
use std::sync::Arc;
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 = ();
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)?;
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)?;
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 mut emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?;
let emscripten_globals = emscripten_globals.map_err(|e| anyhow!("{}", e))?;
env.as_mut(store)
.set_data(&emscripten_globals.data, Default::default());

View File

@@ -4,11 +4,11 @@
use wasmer_vfs::webc_fs::WebcFileSystem;
use crate::runners::WapmContainer;
use anyhow::{anyhow, Context};
use serde_derive::{Deserialize, Serialize};
use serde::{Deserialize, Serialize};
use std::error::Error as StdError;
use std::sync::Arc;
use wasmer::{Cranelift, FunctionEnv, Instance, Module, Store};
use wasmer_wasi::{VirtualFile, WasiFunctionEnv, WasiState};
use crate::{VirtualFile, WasiFunctionEnv, WasiState};
use webc::{Command, WebCMmap};
#[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 = ();
fn can_run_command(
@@ -94,7 +94,7 @@ fn prepare_webc_env(
pub(crate) fn exec_module(
store: &mut Store,
module: &Module,
mut wasi_env: wasmer_wasi::WasiFunctionEnv,
wasi_env: crate::WasiFunctionEnv,
) -> Result<(), anyhow::Error> {
let import_object = wasi_env.import_object(store, &module)?;
let instance = Instance::new(store, &module, &import_object)?;