mirror of
https://github.com/fluencelabs/wasmer
synced 2025-04-25 10:22:19 +00:00
Remove Backend dependency
This commit is contained in:
parent
d4e964519d
commit
d7154fe791
2
Cargo.lock
generated
2
Cargo.lock
generated
@ -1752,6 +1752,8 @@ dependencies = [
|
|||||||
"criterion",
|
"criterion",
|
||||||
"lazy_static",
|
"lazy_static",
|
||||||
"memmap",
|
"memmap",
|
||||||
|
"serde",
|
||||||
|
"serde_derive",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"wabt",
|
"wabt",
|
||||||
"wasmer-clif-backend",
|
"wasmer-clif-backend",
|
||||||
|
@ -18,7 +18,7 @@ use std::mem;
|
|||||||
use std::sync::{Arc, RwLock};
|
use std::sync::{Arc, RwLock};
|
||||||
use wasmer_runtime_core::error::CompileError;
|
use wasmer_runtime_core::error::CompileError;
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
backend::{Backend, CacheGen, Token},
|
backend::{CacheGen, Token},
|
||||||
cache::{Artifact, Error as CacheError},
|
cache::{Artifact, Error as CacheError},
|
||||||
codegen::*,
|
codegen::*,
|
||||||
memory::MemoryType,
|
memory::MemoryType,
|
||||||
@ -58,8 +58,8 @@ impl ModuleCodeGenerator<CraneliftFunctionCodeGenerator, Caller, CodegenError>
|
|||||||
unimplemented!("cross compilation is not available for clif backend")
|
unimplemented!("cross compilation is not available for clif backend")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn backend_id() -> Backend {
|
fn backend_id() -> String {
|
||||||
Backend::Cranelift
|
"cranelift".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_precondition(&mut self, _module_info: &ModuleInfo) -> Result<(), CodegenError> {
|
fn check_precondition(&mut self, _module_info: &ModuleInfo) -> Result<(), CodegenError> {
|
||||||
|
@ -8721,8 +8721,8 @@ impl<'ctx> ModuleCodeGenerator<LLVMFunctionCodeGenerator<'ctx>, LLVMBackend, Cod
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn backend_id() -> Backend {
|
fn backend_id() -> String {
|
||||||
Backend::LLVM
|
"llvm".to_string()
|
||||||
}
|
}
|
||||||
|
|
||||||
fn check_precondition(&mut self, _module_info: &ModuleInfo) -> Result<(), CodegenError> {
|
fn check_precondition(&mut self, _module_info: &ModuleInfo) -> Result<(), CodegenError> {
|
||||||
|
@ -8,40 +8,40 @@ mod tests {
|
|||||||
use wasmer_runtime_core::fault::{pop_code_version, push_code_version};
|
use wasmer_runtime_core::fault::{pop_code_version, push_code_version};
|
||||||
use wasmer_runtime_core::state::CodeVersion;
|
use wasmer_runtime_core::state::CodeVersion;
|
||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
backend::{Backend, Compiler},
|
backend::Compiler,
|
||||||
compile_with, imports, Func,
|
compile_with, imports, Func,
|
||||||
};
|
};
|
||||||
|
|
||||||
#[cfg(feature = "llvm")]
|
#[cfg(feature = "llvm")]
|
||||||
fn get_compiler(limit: u64) -> (impl Compiler, Backend) {
|
fn get_compiler(limit: u64) -> impl Compiler {
|
||||||
use wasmer_llvm_backend::ModuleCodeGenerator as LLVMMCG;
|
use wasmer_llvm_backend::ModuleCodeGenerator as LLVMMCG;
|
||||||
let c: StreamingCompiler<LLVMMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
let c: StreamingCompiler<LLVMMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
||||||
let mut chain = MiddlewareChain::new();
|
let mut chain = MiddlewareChain::new();
|
||||||
chain.push(Metering::new(limit));
|
chain.push(Metering::new(limit));
|
||||||
chain
|
chain
|
||||||
});
|
});
|
||||||
(c, Backend::LLVM)
|
c
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(feature = "singlepass")]
|
#[cfg(feature = "singlepass")]
|
||||||
fn get_compiler(limit: u64) -> (impl Compiler, Backend) {
|
fn get_compiler(limit: u64) -> impl Compiler {
|
||||||
use wasmer_singlepass_backend::ModuleCodeGenerator as SinglePassMCG;
|
use wasmer_singlepass_backend::ModuleCodeGenerator as SinglePassMCG;
|
||||||
let c: StreamingCompiler<SinglePassMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
let c: StreamingCompiler<SinglePassMCG, _, _, _, _> = StreamingCompiler::new(move || {
|
||||||
let mut chain = MiddlewareChain::new();
|
let mut chain = MiddlewareChain::new();
|
||||||
chain.push(Metering::new(limit));
|
chain.push(Metering::new(limit));
|
||||||
chain
|
chain
|
||||||
});
|
});
|
||||||
(c, Backend::Singlepass)
|
c
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
|
#[cfg(not(any(feature = "llvm", feature = "clif", feature = "singlepass")))]
|
||||||
compile_error!("compiler not specified, activate a compiler via features");
|
compile_error!("compiler not specified, activate a compiler via features");
|
||||||
|
|
||||||
#[cfg(feature = "clif")]
|
#[cfg(feature = "clif")]
|
||||||
fn get_compiler(_limit: u64) -> (impl Compiler, Backend) {
|
fn get_compiler(_limit: u64) -> impl Compiler {
|
||||||
compile_error!("cranelift does not implement metering");
|
compile_error!("cranelift does not implement metering");
|
||||||
use wasmer_clif_backend::CraneliftCompiler;
|
use wasmer_clif_backend::CraneliftCompiler;
|
||||||
(CraneliftCompiler::new(), Backend::Cranelift)
|
CraneliftCompiler::new()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Assemblyscript
|
// Assemblyscript
|
||||||
@ -161,7 +161,12 @@ mod tests {
|
|||||||
|
|
||||||
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
let add_to: Func<(i32, i32), i32> = instance.func("add_to").unwrap();
|
||||||
|
|
||||||
let cv_pushed = if let Some(msm) = instance.module.runnable_module.get_module_state_map() {
|
let cv_pushed = if let Some(msm) = instance
|
||||||
|
.module
|
||||||
|
.runnable_module
|
||||||
|
.borrow()
|
||||||
|
.get_module_state_map()
|
||||||
|
{
|
||||||
push_code_version(CodeVersion {
|
push_code_version(CodeVersion {
|
||||||
baseline: true,
|
baseline: true,
|
||||||
msm: msm,
|
msm: msm,
|
||||||
|
@ -3,12 +3,11 @@
|
|||||||
//! and loaded to allow skipping compilation and fast startup.
|
//! and loaded to allow skipping compilation and fast startup.
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::Backend,
|
module::ModuleInfo,
|
||||||
module::{Module, ModuleInfo},
|
|
||||||
sys::Memory,
|
sys::Memory,
|
||||||
};
|
};
|
||||||
use blake2b_simd::blake2bp;
|
use blake2b_simd::blake2bp;
|
||||||
use std::{fmt, io, mem, slice};
|
use std::{io, mem, slice};
|
||||||
|
|
||||||
/// Indicates the invalid type of invalid cache file
|
/// Indicates the invalid type of invalid cache file
|
||||||
#[derive(Debug)]
|
#[derive(Debug)]
|
||||||
@ -35,7 +34,7 @@ pub enum Error {
|
|||||||
/// The cached binary has been invalidated.
|
/// The cached binary has been invalidated.
|
||||||
InvalidatedCache,
|
InvalidatedCache,
|
||||||
/// The current backend does not support caching.
|
/// The current backend does not support caching.
|
||||||
UnsupportedBackend(Backend),
|
UnsupportedBackend(String),
|
||||||
}
|
}
|
||||||
|
|
||||||
impl From<io::Error> for Error {
|
impl From<io::Error> for Error {
|
||||||
@ -246,24 +245,6 @@ impl Artifact {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/// A generic cache for storing and loading compiled wasm modules.
|
|
||||||
///
|
|
||||||
/// The `wasmer-runtime` supplies a naive `FileSystemCache` api.
|
|
||||||
pub trait Cache {
|
|
||||||
/// Error type to return when load error occurs
|
|
||||||
type LoadError: fmt::Debug;
|
|
||||||
/// Error type to return when store error occurs
|
|
||||||
type StoreError: fmt::Debug;
|
|
||||||
|
|
||||||
/// loads a module using the default `Backend`
|
|
||||||
fn load(&self, key: WasmHash) -> Result<Module, Self::LoadError>;
|
|
||||||
/// loads a cached module using a specific `Backend`
|
|
||||||
fn load_with_backend(&self, key: WasmHash, backend: Backend)
|
|
||||||
-> Result<Module, Self::LoadError>;
|
|
||||||
/// Store a module into the cache with the given key
|
|
||||||
fn store(&mut self, key: WasmHash, module: Module) -> Result<(), Self::StoreError>;
|
|
||||||
}
|
|
||||||
|
|
||||||
/// A unique ID generated from the version of Wasmer for use with cache versioning
|
/// A unique ID generated from the version of Wasmer for use with cache versioning
|
||||||
pub const WASMER_VERSION_HASH: &'static str =
|
pub const WASMER_VERSION_HASH: &'static str =
|
||||||
include_str!(concat!(env!("OUT_DIR"), "/wasmer_version_hash.txt"));
|
include_str!(concat!(env!("OUT_DIR"), "/wasmer_version_hash.txt"));
|
||||||
|
@ -92,10 +92,10 @@ pub trait ModuleCodeGenerator<FCG: FunctionCodeGenerator<E>, RM: RunnableModule,
|
|||||||
) -> Self;
|
) -> Self;
|
||||||
|
|
||||||
/// Returns the backend id associated with this MCG.
|
/// Returns the backend id associated with this MCG.
|
||||||
fn backend_id() -> Backend;
|
fn backend_id() -> String;
|
||||||
|
|
||||||
/// It sets if the current compiler requires validation before compilation
|
/// It sets if the current compiler requires validation before compilation
|
||||||
fn requires_pre_validation(&self) -> bool {
|
fn requires_pre_validation() -> bool {
|
||||||
true
|
true
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -231,8 +231,8 @@ impl<
|
|||||||
validate_with_features(wasm, &compiler_config.features)?;
|
validate_with_features(wasm, &compiler_config.features)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
let mut mcg = match MCG::backend_id() {
|
let mut mcg = match MCG::backend_id().as_ref() {
|
||||||
Backend::LLVM => MCG::new_with_target(
|
"llvm" => MCG::new_with_target(
|
||||||
compiler_config.triple.clone(),
|
compiler_config.triple.clone(),
|
||||||
compiler_config.cpu_name.clone(),
|
compiler_config.cpu_name.clone(),
|
||||||
compiler_config.cpu_features.clone(),
|
compiler_config.cpu_features.clone(),
|
||||||
@ -242,7 +242,6 @@ impl<
|
|||||||
let mut chain = (self.middleware_chain_generator)();
|
let mut chain = (self.middleware_chain_generator)();
|
||||||
let info = crate::parse::read_module(
|
let info = crate::parse::read_module(
|
||||||
wasm,
|
wasm,
|
||||||
MCG::backend_id(),
|
|
||||||
&mut mcg,
|
&mut mcg,
|
||||||
&mut chain,
|
&mut chain,
|
||||||
&compiler_config,
|
&compiler_config,
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
//! The module module contains the implementation data structures and helper functions used to
|
//! The module module contains the implementation data structures and helper functions used to
|
||||||
//! manipulate and access wasm modules.
|
//! manipulate and access wasm modules.
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::{Backend, RunnableModule},
|
backend::RunnableModule,
|
||||||
cache::{Artifact, Error as CacheError},
|
cache::{Artifact, Error as CacheError},
|
||||||
error,
|
error,
|
||||||
import::ImportObject,
|
import::ImportObject,
|
||||||
@ -65,7 +65,7 @@ pub struct ModuleInfo {
|
|||||||
/// Map signature index to function signature.
|
/// Map signature index to function signature.
|
||||||
pub signatures: Map<SigIndex, FuncSig>,
|
pub signatures: Map<SigIndex, FuncSig>,
|
||||||
/// Backend.
|
/// Backend.
|
||||||
pub backend: Backend,
|
pub backend: String,
|
||||||
|
|
||||||
/// Table of namespace indexes.
|
/// Table of namespace indexes.
|
||||||
pub namespace_table: StringTable<NamespaceIndex>,
|
pub namespace_table: StringTable<NamespaceIndex>,
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
use crate::codegen::*;
|
use crate::codegen::*;
|
||||||
use crate::{
|
use crate::{
|
||||||
backend::{Backend, CompilerConfig, RunnableModule},
|
backend::{CompilerConfig, RunnableModule},
|
||||||
error::CompileError,
|
error::CompileError,
|
||||||
module::{
|
module::{
|
||||||
DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder,
|
DataInitializer, ExportIndex, ImportName, ModuleInfo, StringTable, StringTableBuilder,
|
||||||
@ -57,7 +57,6 @@ pub fn read_module<
|
|||||||
E: Debug,
|
E: Debug,
|
||||||
>(
|
>(
|
||||||
wasm: &[u8],
|
wasm: &[u8],
|
||||||
backend: Backend,
|
|
||||||
mcg: &mut MCG,
|
mcg: &mut MCG,
|
||||||
middlewares: &mut MiddlewareChain,
|
middlewares: &mut MiddlewareChain,
|
||||||
compiler_config: &CompilerConfig,
|
compiler_config: &CompilerConfig,
|
||||||
@ -83,7 +82,7 @@ pub fn read_module<
|
|||||||
|
|
||||||
func_assoc: Map::new(),
|
func_assoc: Map::new(),
|
||||||
signatures: Map::new(),
|
signatures: Map::new(),
|
||||||
backend: backend,
|
backend: MCG::backend_id(),
|
||||||
|
|
||||||
namespace_table: StringTable::new(),
|
namespace_table: StringTable::new(),
|
||||||
name_table: StringTable::new(),
|
name_table: StringTable::new(),
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
//! state could read or updated at runtime. Use cases include generating stack traces, switching
|
//! state could read or updated at runtime. Use cases include generating stack traces, switching
|
||||||
//! generated code from one tier to another, or serializing state of a running instace.
|
//! generated code from one tier to another, or serializing state of a running instace.
|
||||||
|
|
||||||
use crate::backend::{Backend, RunnableModule};
|
use crate::backend::RunnableModule;
|
||||||
use std::collections::BTreeMap;
|
use std::collections::BTreeMap;
|
||||||
use std::ops::Bound::{Included, Unbounded};
|
use std::ops::Bound::{Included, Unbounded};
|
||||||
use std::sync::Arc;
|
use std::sync::Arc;
|
||||||
@ -186,7 +186,7 @@ pub struct CodeVersion {
|
|||||||
pub base: usize,
|
pub base: usize,
|
||||||
|
|
||||||
/// The backend used to compile this module.
|
/// The backend used to compile this module.
|
||||||
pub backend: Backend,
|
pub backend: String,
|
||||||
|
|
||||||
/// `RunnableModule` for this code version.
|
/// `RunnableModule` for this code version.
|
||||||
pub runnable_module: Arc<Box<dyn RunnableModule>>,
|
pub runnable_module: Arc<Box<dyn RunnableModule>>,
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
//! The tiering module supports switching between code compiled with different optimization levels
|
//! The tiering module supports switching between code compiled with different optimization levels
|
||||||
//! as runtime.
|
//! as runtime.
|
||||||
use crate::backend::{Backend, Compiler, CompilerConfig};
|
use crate::backend::{Compiler, CompilerConfig};
|
||||||
use crate::compile_with_config;
|
use crate::compile_with_config;
|
||||||
use crate::fault::{
|
use crate::fault::{
|
||||||
catch_unsafe_unwind, ensure_sighandler, pop_code_version, push_code_version, with_ctx,
|
catch_unsafe_unwind, ensure_sighandler, pop_code_version, push_code_version, with_ctx,
|
||||||
@ -43,7 +43,7 @@ struct OptimizationState {
|
|||||||
}
|
}
|
||||||
|
|
||||||
struct OptimizationOutcome {
|
struct OptimizationOutcome {
|
||||||
backend_id: Backend,
|
backend_id: String,
|
||||||
module: Module,
|
module: Module,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -54,7 +54,7 @@ unsafe impl Sync for CtxWrapper {}
|
|||||||
|
|
||||||
unsafe fn do_optimize(
|
unsafe fn do_optimize(
|
||||||
binary: &[u8],
|
binary: &[u8],
|
||||||
backend_id: Backend,
|
backend_id: String,
|
||||||
compiler: Box<dyn Compiler>,
|
compiler: Box<dyn Compiler>,
|
||||||
ctx: &Mutex<CtxWrapper>,
|
ctx: &Mutex<CtxWrapper>,
|
||||||
state: &OptimizationState,
|
state: &OptimizationState,
|
||||||
@ -87,8 +87,8 @@ pub unsafe fn run_tiering<F: Fn(InteractiveShellContext) -> ShellExitOperation>(
|
|||||||
import_object: &ImportObject,
|
import_object: &ImportObject,
|
||||||
start_raw: extern "C" fn(&mut Ctx),
|
start_raw: extern "C" fn(&mut Ctx),
|
||||||
baseline: &mut Instance,
|
baseline: &mut Instance,
|
||||||
baseline_backend: Backend,
|
baseline_backend: String,
|
||||||
optimized_backends: Vec<(Backend, Box<dyn Fn() -> Box<dyn Compiler> + Send>)>,
|
optimized_backends: Vec<(String, Box<dyn Fn() -> Box<dyn Compiler> + Send>)>,
|
||||||
interactive_shell: F,
|
interactive_shell: F,
|
||||||
) -> Result<(), String> {
|
) -> Result<(), String> {
|
||||||
ensure_sighandler();
|
ensure_sighandler();
|
||||||
@ -140,7 +140,7 @@ pub unsafe fn run_tiering<F: Fn(InteractiveShellContext) -> ShellExitOperation>(
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
loop {
|
loop {
|
||||||
let new_optimized: Option<(Backend, &mut Instance)> = {
|
let new_optimized: Option<(String, &mut Instance)> = {
|
||||||
let mut outcome = opt_state.outcome.lock().unwrap();
|
let mut outcome = opt_state.outcome.lock().unwrap();
|
||||||
if let Some(x) = outcome.take() {
|
if let Some(x) = outcome.take() {
|
||||||
let instance = x
|
let instance = x
|
||||||
|
@ -1064,7 +1064,7 @@ mod vm_ctx_tests {
|
|||||||
|
|
||||||
fn generate_module() -> ModuleInner {
|
fn generate_module() -> ModuleInner {
|
||||||
use super::Func;
|
use super::Func;
|
||||||
use crate::backend::{sys::Memory, Backend, CacheGen, RunnableModule};
|
use crate::backend::{sys::Memory, CacheGen, RunnableModule};
|
||||||
use crate::cache::Error as CacheError;
|
use crate::cache::Error as CacheError;
|
||||||
use crate::typed_func::Wasm;
|
use crate::typed_func::Wasm;
|
||||||
use crate::types::{LocalFuncIndex, SigIndex};
|
use crate::types::{LocalFuncIndex, SigIndex};
|
||||||
@ -1118,7 +1118,7 @@ mod vm_ctx_tests {
|
|||||||
|
|
||||||
func_assoc: Map::new(),
|
func_assoc: Map::new(),
|
||||||
signatures: Map::new(),
|
signatures: Map::new(),
|
||||||
backend: Backend::Cranelift,
|
backend: "".to_string(),
|
||||||
|
|
||||||
namespace_table: StringTable::new(),
|
namespace_table: StringTable::new(),
|
||||||
name_table: StringTable::new(),
|
name_table: StringTable::new(),
|
||||||
|
@ -24,6 +24,14 @@ path = "../clif-backend"
|
|||||||
version = "0.12.0"
|
version = "0.12.0"
|
||||||
optional = true
|
optional = true
|
||||||
|
|
||||||
|
# Dependencies for caching.
|
||||||
|
[dependencies.serde]
|
||||||
|
version = "1.0"
|
||||||
|
# This feature is required for serde to support serializing/deserializing reference counted pointers (e.g. Rc and Arc).
|
||||||
|
features = ["rc"]
|
||||||
|
[dependencies.serde_derive]
|
||||||
|
version = "1.0"
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
tempfile = "3.1"
|
tempfile = "3.1"
|
||||||
criterion = "0.2"
|
criterion = "0.2"
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
use crate::Module;
|
use crate::Module;
|
||||||
use memmap::Mmap;
|
use memmap::Mmap;
|
||||||
use std::{
|
use std::{
|
||||||
|
fmt,
|
||||||
fs::{create_dir_all, File},
|
fs::{create_dir_all, File},
|
||||||
io::{self, Write},
|
io::{self, Write},
|
||||||
path::PathBuf,
|
path::PathBuf,
|
||||||
@ -12,9 +13,27 @@ use std::{
|
|||||||
|
|
||||||
use wasmer_runtime_core::cache::Error as CacheError;
|
use wasmer_runtime_core::cache::Error as CacheError;
|
||||||
pub use wasmer_runtime_core::{
|
pub use wasmer_runtime_core::{
|
||||||
backend::Backend,
|
cache::{Artifact, WasmHash},
|
||||||
cache::{Artifact, Cache, WasmHash},
|
|
||||||
};
|
};
|
||||||
|
pub use super::Backend;
|
||||||
|
|
||||||
|
/// A generic cache for storing and loading compiled wasm modules.
|
||||||
|
///
|
||||||
|
/// The `wasmer-runtime` supplies a naive `FileSystemCache` api.
|
||||||
|
pub trait Cache {
|
||||||
|
/// Error type to return when load error occurs
|
||||||
|
type LoadError: fmt::Debug;
|
||||||
|
/// Error type to return when store error occurs
|
||||||
|
type StoreError: fmt::Debug;
|
||||||
|
|
||||||
|
/// loads a module using the default `Backend`
|
||||||
|
fn load(&self, key: WasmHash) -> Result<Module, Self::LoadError>;
|
||||||
|
/// loads a cached module using a specific `Backend`
|
||||||
|
fn load_with_backend(&self, key: WasmHash, backend: Backend)
|
||||||
|
-> Result<Module, Self::LoadError>;
|
||||||
|
/// Store a module into the cache with the given key
|
||||||
|
fn store(&mut self, key: WasmHash, module: Module) -> Result<(), Self::StoreError>;
|
||||||
|
}
|
||||||
|
|
||||||
/// Representation of a directory that contains compiled wasm artifacts.
|
/// Representation of a directory that contains compiled wasm artifacts.
|
||||||
///
|
///
|
||||||
@ -105,7 +124,7 @@ impl Cache for FileSystemCache {
|
|||||||
wasmer_runtime_core::load_cache_with(
|
wasmer_runtime_core::load_cache_with(
|
||||||
serialized_cache,
|
serialized_cache,
|
||||||
crate::compiler_for_backend(backend)
|
crate::compiler_for_backend(backend)
|
||||||
.ok_or_else(|| CacheError::UnsupportedBackend(backend))?
|
.ok_or_else(|| CacheError::UnsupportedBackend(backend.to_string().to_owned()))?
|
||||||
.as_ref(),
|
.as_ref(),
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
@ -91,7 +91,10 @@
|
|||||||
//! [`wasmer-singlepass-backend`]: https://crates.io/crates/wasmer-singlepass-backend
|
//! [`wasmer-singlepass-backend`]: https://crates.io/crates/wasmer-singlepass-backend
|
||||||
//! [`wasmer-clif-backend`]: https://crates.io/crates/wasmer-clif-backend
|
//! [`wasmer-clif-backend`]: https://crates.io/crates/wasmer-clif-backend
|
||||||
|
|
||||||
pub use wasmer_runtime_core::backend::{Backend, Features};
|
#[macro_use]
|
||||||
|
extern crate serde_derive;
|
||||||
|
|
||||||
|
pub use wasmer_runtime_core::backend::Features;
|
||||||
pub use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler};
|
pub use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler};
|
||||||
pub use wasmer_runtime_core::export::Export;
|
pub use wasmer_runtime_core::export::Export;
|
||||||
pub use wasmer_runtime_core::global::Global;
|
pub use wasmer_runtime_core::global::Global;
|
||||||
@ -144,6 +147,52 @@ pub mod cache;
|
|||||||
|
|
||||||
pub use wasmer_runtime_core::backend::{Compiler, CompilerConfig};
|
pub use wasmer_runtime_core::backend::{Compiler, CompilerConfig};
|
||||||
|
|
||||||
|
/// Enum used to select which compiler should be used to generate code.
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq, Eq)]
|
||||||
|
pub enum Backend {
|
||||||
|
#[cfg(feature = "singlepass")]
|
||||||
|
/// Singlepass backend
|
||||||
|
Singlepass,
|
||||||
|
#[cfg(feature = "cranelift")]
|
||||||
|
/// Cranelift backend
|
||||||
|
Cranelift,
|
||||||
|
#[cfg(feature = "llvm")]
|
||||||
|
/// LLVM backend
|
||||||
|
LLVM,
|
||||||
|
/// Auto backend
|
||||||
|
Auto,
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Backend {
|
||||||
|
/// Stable string representation of the backend.
|
||||||
|
/// It can be used as part of a cache key, for example.
|
||||||
|
pub fn to_string(&self) -> &'static str {
|
||||||
|
match self {
|
||||||
|
#[cfg(feature = "cranelift")]
|
||||||
|
Backend::Cranelift => "cranelift",
|
||||||
|
#[cfg(feature = "singlepass")]
|
||||||
|
Backend::Singlepass => "singlepass",
|
||||||
|
#[cfg(feature = "llvm")]
|
||||||
|
Backend::LLVM => "llvm",
|
||||||
|
Backend::Auto => "auto",
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl Default for Backend {
|
||||||
|
fn default() -> Self {
|
||||||
|
#[cfg(all(feature = "default-backend-singlepass", not(feature = "docs")))]
|
||||||
|
return Backend::Singlepass;
|
||||||
|
|
||||||
|
#[cfg(any(feature = "default-backend-cranelift", feature = "docs"))]
|
||||||
|
return Backend::Cranelift;
|
||||||
|
|
||||||
|
#[cfg(all(feature = "default-backend-llvm", not(feature = "docs")))]
|
||||||
|
return Backend::LLVM;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/// Compile WebAssembly binary code into a [`Module`].
|
/// Compile WebAssembly binary code into a [`Module`].
|
||||||
/// This function is useful if it is necessary to
|
/// This function is useful if it is necessary to
|
||||||
/// compile a module before it can be instantiated
|
/// compile a module before it can be instantiated
|
||||||
@ -268,9 +317,6 @@ pub fn compiler_for_backend(backend: Backend) -> Option<Box<dyn Compiler>> {
|
|||||||
#[cfg(feature = "default-backend-llvm")]
|
#[cfg(feature = "default-backend-llvm")]
|
||||||
return Some(Box::new(wasmer_llvm_backend::LLVMCompiler::new()));
|
return Some(Box::new(wasmer_llvm_backend::LLVMCompiler::new()));
|
||||||
}
|
}
|
||||||
|
|
||||||
#[cfg(not(all(feature = "llvm", feature = "singlepass", feature = "cranelift")))]
|
|
||||||
_ => None,
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -23,7 +23,7 @@ use std::{
|
|||||||
use wasmer_runtime_core::{
|
use wasmer_runtime_core::{
|
||||||
backend::{
|
backend::{
|
||||||
sys::{Memory, Protect},
|
sys::{Memory, Protect},
|
||||||
Architecture, Backend, CacheGen, CompilerConfig, InlineBreakpoint, InlineBreakpointType,
|
Architecture, CacheGen, CompilerConfig, InlineBreakpoint, InlineBreakpointType,
|
||||||
MemoryBoundCheckMode, RunnableModule, Token,
|
MemoryBoundCheckMode, RunnableModule, Token,
|
||||||
},
|
},
|
||||||
cache::{Artifact, Error as CacheError},
|
cache::{Artifact, Error as CacheError},
|
||||||
@ -647,10 +647,14 @@ impl ModuleCodeGenerator<X64FunctionCode, X64ExecutionContext, CodegenError>
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Singlepass does validation as it compiles
|
/// Singlepass does validation as it compiles
|
||||||
fn requires_pre_validation(&self) -> bool {
|
fn requires_pre_validation() -> bool {
|
||||||
false
|
false
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn backend_id() -> String {
|
||||||
|
"singlepass".to_string()
|
||||||
|
}
|
||||||
|
|
||||||
fn new_with_target(_: Option<String>, _: Option<String>, _: Option<String>) -> Self {
|
fn new_with_target(_: Option<String>, _: Option<String>, _: Option<String>) -> Self {
|
||||||
unimplemented!("cross compilation is not available for singlepass backend")
|
unimplemented!("cross compilation is not available for singlepass backend")
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user