Files
wasmer/tests/compilers/config.rs
Syrus Akbary c9e66a1ddf Fix singlepass
2021-05-15 20:51:14 -07:00

141 lines
4.5 KiB
Rust

use std::sync::Arc;
use wasmer::{CompilerConfig, Engine as WasmerEngine, Features, ModuleMiddleware, Store};
#[derive(Clone, Debug, PartialEq)]
pub enum Compiler {
LLVM,
Cranelift,
Singlepass,
}
#[derive(Clone, Debug, PartialEq)]
pub enum Engine {
Native,
JIT,
}
#[derive(Clone)]
pub struct Config {
pub compiler: Compiler,
pub engine: Engine,
pub features: Features,
pub middlewares: Vec<Arc<dyn ModuleMiddleware>>,
pub canonicalize_nans: bool,
}
impl Config {
pub fn new(engine: Engine, compiler: Compiler) -> Self {
Self {
compiler,
engine,
features: Default::default(),
canonicalize_nans: false,
middlewares: vec![],
}
}
pub fn set_middlewares(&mut self, middlewares: Vec<Arc<dyn ModuleMiddleware>>) {
self.middlewares = middlewares;
}
pub fn set_features(&mut self, features: Features) {
self.features = features;
}
pub fn set_nan_canonicalization(&mut self, canonicalize_nans: bool) {
self.canonicalize_nans = canonicalize_nans;
}
pub fn store(&self) -> Store {
let compiler_config = self.compiler_config(self.canonicalize_nans);
let engine = self.engine(compiler_config);
Store::new(&*engine)
}
pub fn headless_store(&self) -> Store {
let engine = self.engine_headless();
Store::new(&*engine)
}
pub fn engine(&self, compiler_config: Box<dyn CompilerConfig>) -> Box<dyn WasmerEngine> {
#[cfg(not(feature = "engine"))]
compile_error!("Plese enable at least one engine via the features");
match &self.engine {
#[cfg(feature = "native")]
Engine::Native => Box::new(
wasmer_engine_native::Native::new(compiler_config)
.features(self.features.clone())
.engine(),
),
#[cfg(feature = "jit")]
Engine::JIT => Box::new(
wasmer_engine_jit::JIT::new(compiler_config)
.features(self.features.clone())
.engine(),
),
engine => panic!(
"The {:?} Engine is not enabled. Please enable it using the features",
engine
),
}
}
pub fn engine_headless(&self) -> Box<dyn WasmerEngine> {
match &self.engine {
#[cfg(feature = "native")]
Engine::Native => Box::new(wasmer_engine_native::Native::headless().engine()),
#[cfg(feature = "jit")]
Engine::JIT => Box::new(wasmer_engine_jit::JIT::headless().engine()),
engine => panic!(
"The {:?} Engine is not enabled. Please enable it using the features",
engine
),
}
}
pub fn compiler_config(&self, canonicalize_nans: bool) -> Box<dyn CompilerConfig> {
#[cfg(not(feature = "compiler"))]
compile_error!("Plese enable at least one compiler via the features");
match &self.compiler {
#[cfg(feature = "cranelift")]
Compiler::Cranelift => {
let mut compiler = wasmer_compiler_cranelift::Cranelift::new();
compiler.canonicalize_nans(canonicalize_nans);
compiler.enable_verifier();
self.add_middlewares(&mut compiler);
Box::new(compiler)
}
#[cfg(feature = "llvm")]
Compiler::LLVM => {
let mut compiler = wasmer_compiler_llvm::LLVM::new();
compiler.canonicalize_nans(canonicalize_nans);
compiler.enable_verifier();
self.add_middlewares(&mut compiler);
Box::new(compiler)
}
#[cfg(feature = "singlepass")]
Compiler::Singlepass => {
let mut compiler = wasmer_compiler_singlepass::Singlepass::new();
compiler.canonicalize_nans(canonicalize_nans);
compiler.enable_verifier();
self.add_middlewares(&mut compiler);
Box::new(compiler)
}
#[allow(dead_code)]
compiler => {
panic!(
"The {:?} Compiler is not enabled. Enable it via the features",
compiler
)
}
}
}
fn add_middlewares(&self, config: &mut dyn CompilerConfig) {
for middleware in self.middlewares.iter() {
config.push_middleware(middleware.clone());
}
}
}