From a3089a4501939af3a6df928953a4338c9b2d6676 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 24 Jul 2019 17:31:59 -0700 Subject: [PATCH 1/2] fix caching for other backends, improve default compiler code --- Cargo.toml | 7 ++--- lib/runtime-core/Cargo.toml | 1 + lib/runtime-core/src/backend.rs | 1 + lib/runtime-core/src/cache.rs | 1 + lib/runtime/Cargo.toml | 9 ++++--- lib/runtime/src/cache.rs | 7 ++++- lib/runtime/src/lib.rs | 46 ++++++++++++++++++++++++++++++--- 7 files changed, 62 insertions(+), 10 deletions(-) diff --git a/Cargo.toml b/Cargo.toml index 1a3432803..fd7d5d10f 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -66,15 +66,16 @@ glob = "0.2.11" rustc_version = "0.2.3" [features] -default = ["fast-tests", "wasi"] +default = ["fast-tests", "wasi", "backend-cranelift"] "loader-kernel" = ["wasmer-kernel-loader"] debug = ["wasmer-runtime-core/debug"] trace = ["wasmer-runtime-core/trace"] extra-debug = ["wasmer-clif-backend/debug", "wasmer-runtime-core/debug"] # This feature will allow cargo test to run much faster fast-tests = [] -"backend-llvm" = ["wasmer-llvm-backend", "wasmer-runtime-core/backend-llvm"] -"backend-singlepass" = ["wasmer-singlepass-backend", "wasmer-runtime-core/backend-singlepass"] +backend-cranelift = ["wasmer-runtime-core/backend-cranelift", "wasmer-runtime/cranelift"] +backend-llvm = ["wasmer-llvm-backend", "wasmer-runtime-core/backend-llvm", "wasmer-runtime/llvm"] +backend-singlepass = ["wasmer-singlepass-backend", "wasmer-runtime-core/backend-singlepass", "wasmer-runtime/singlepass"] wasi = ["wasmer-wasi"] # vfs = ["wasmer-runtime-abi"] diff --git a/lib/runtime-core/Cargo.toml b/lib/runtime-core/Cargo.toml index 364b82262..ed5c54592 100644 --- a/lib/runtime-core/Cargo.toml +++ b/lib/runtime-core/Cargo.toml @@ -55,5 +55,6 @@ cc = "1.0" debug = [] trace = ["debug"] # backend flags used in conditional compilation of Backend::variants +"backend-cranelift" = [] "backend-singlepass" = [] "backend-llvm" = [] diff --git a/lib/runtime-core/src/backend.rs b/lib/runtime-core/src/backend.rs index 1eb8ba108..91f737b69 100644 --- a/lib/runtime-core/src/backend.rs +++ b/lib/runtime-core/src/backend.rs @@ -32,6 +32,7 @@ pub enum Backend { impl Backend { pub fn variants() -> &'static [&'static str] { &[ + #[cfg(feature = "backend-cranelift")] "cranelift", #[cfg(feature = "backend-singlepass")] "singlepass", diff --git a/lib/runtime-core/src/cache.rs b/lib/runtime-core/src/cache.rs index 18c571b00..57f36e7ea 100644 --- a/lib/runtime-core/src/cache.rs +++ b/lib/runtime-core/src/cache.rs @@ -20,6 +20,7 @@ pub enum Error { Unknown(String), InvalidFile(InvalidFileType), InvalidatedCache, + UnsupportedBackend(Backend), } impl From for Error { diff --git a/lib/runtime/Cargo.toml b/lib/runtime/Cargo.toml index d613ded7d..e8e02afd0 100644 --- a/lib/runtime/Cargo.toml +++ b/lib/runtime/Cargo.toml @@ -32,12 +32,15 @@ path = "../llvm-backend" optional = true [features] -default = ["default-compiler"] -default-compiler = ["wasmer-clif-backend"] -cache = ["default-compiler"] +default = ["cranelift", "default-backend-cranelift"] +cranelift = ["wasmer-clif-backend"] +cache = ["cranelift"] debug = ["wasmer-clif-backend/debug", "wasmer-runtime-core/debug"] llvm = ["wasmer-llvm-backend"] singlepass = ["wasmer-singlepass-backend"] +default-backend-singlepass = ["singlepass"] +default-backend-llvm = ["llvm"] +default-backend-cranelift = ["cranelift"] [[bench]] name = "nginx" diff --git a/lib/runtime/src/cache.rs b/lib/runtime/src/cache.rs index fdb0d58c8..015212e1b 100644 --- a/lib/runtime/src/cache.rs +++ b/lib/runtime/src/cache.rs @@ -103,7 +103,12 @@ impl Cache for FileSystemCache { let serialized_cache = Artifact::deserialize(&mmap[..])?; unsafe { - wasmer_runtime_core::load_cache_with(serialized_cache, &super::default_compiler()) + wasmer_runtime_core::load_cache_with( + serialized_cache, + super::compiler_for_backend(backend) + .ok_or_else(|| CacheError::UnsupportedBackend(backend))? + .as_ref(), + ) } } diff --git a/lib/runtime/src/lib.rs b/lib/runtime/src/lib.rs index efe72ea10..0ea37a0d3 100644 --- a/lib/runtime/src/lib.rs +++ b/lib/runtime/src/lib.rs @@ -76,6 +76,7 @@ //! [`wasmer-clif-backend`]: https://crates.io/crates/wasmer-clif-backend //! [`compile_with`]: fn.compile_with.html +pub use wasmer_runtime_core::backend::Backend; pub use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler}; pub use wasmer_runtime_core::export::Export; pub use wasmer_runtime_core::global::Global; @@ -179,17 +180,56 @@ pub fn instantiate(wasm: &[u8], import_object: &ImportObject) -> error::Result impl Compiler { - #[cfg(feature = "llvm")] + #[cfg(any( + all( + feature = "default-backend-llvm", + any( + feature = "default-backend-cranelift", + feature = "default-backend-singlepass" + ) + ), + all( + feature = "default-backend-cranelift", + feature = "default-backend-singlepass" + ) + ))] + compile_error!( + "The `default-backend-X` features are mutually exclusive. Please choose just one" + ); + + #[cfg(feature = "default-backend-llvm")] use wasmer_llvm_backend::LLVMCompiler as DefaultCompiler; - #[cfg(feature = "singlepass")] + #[cfg(feature = "default-backend-singlepass")] use wasmer_singlepass_backend::SinglePassCompiler as DefaultCompiler; - #[cfg(not(any(feature = "llvm", feature = "singlepass")))] + #[cfg(feature = "default-backend-cranelift")] use wasmer_clif_backend::CraneliftCompiler as DefaultCompiler; DefaultCompiler::new() } +pub fn compiler_for_backend(backend: Backend) -> Option> { + match backend { + #[cfg(feature = "cranelift")] + Backend::Cranelift => Some(Box::new(wasmer_clif_backend::CraneliftCompiler::new())), + + #[cfg(feature = "singlepass")] + Backend::Singlepass => Some(Box::new( + wasmer_singlepass_backend::SinglePassCompiler::new(), + )), + + #[cfg(feature = "llvm")] + Backend::LLVM => Some(Box::new(wasmer_llvm_backend::LLVMCompiler::new())), + + #[cfg(any( + not(feature = "llvm"), + not(feature = "singlepass"), + not(feature = "cranelift") + ))] + _ => None, + } +} + /// The current version of this crate pub const VERSION: &str = env!("CARGO_PKG_VERSION"); From 99b75c4deaae31cfe0c94a6e89524b70e1f5f077 Mon Sep 17 00:00:00 2001 From: Mark McCaskey Date: Wed, 24 Jul 2019 17:46:32 -0700 Subject: [PATCH 2/2] update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index 8e097611c..c81eae7bb 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,6 +5,7 @@ All PRs to the Wasmer repository must add to this file. Blocks of changes will separated by version increments. ## **[Unreleased]** +- [#579](https://github.com/wasmerio/wasmer/pull/579) Fix bug in caching with LLVM and Singlepass backends. Add `default-backend-singlepass`, `default-backend-llvm`, and `default-backend-cranelift` features to `wasmer-runtime` to control the `default_compiler()` function (this is a breaking change). Add `compiler_for_backend` function in `wasmer-runtime` - [#542](https://github.com/wasmerio/wasmer/pull/542) Add SIMD support to wasmer and implement it in the LLVM backend only. ## 0.5.7