wasmer/lib/dynasm-backend/src/lib.rs

93 lines
2.4 KiB
Rust
Raw Normal View History

2019-02-11 16:52:01 +00:00
#![feature(proc_macro_hygiene)]
#[cfg(not(any(
all(target_os = "macos", target_arch = "x86_64"),
all(target_os = "linux", target_arch = "x86_64"),
)))]
compile_error!("This crate doesn't yet support compiling on operating systems other than linux and macos and architectures other than x86_64");
2019-02-11 16:52:01 +00:00
extern crate dynasmrt;
2019-02-11 16:52:01 +00:00
#[macro_use]
extern crate dynasm;
#[macro_use]
extern crate lazy_static;
extern crate byteorder;
2019-02-11 16:52:01 +00:00
mod codegen;
mod codegen_x64;
mod parse;
mod protect_unix;
2019-03-17 16:31:36 +00:00
mod stack;
2019-02-13 16:53:36 +00:00
2019-02-14 18:21:52 +00:00
use crate::codegen::{CodegenError, ModuleCodeGenerator};
use crate::parse::LoadError;
2019-02-13 16:53:36 +00:00
use wasmer_runtime_core::{
backend::{sys::Memory, Backend, CacheGen, Compiler, CompilerConfig, Token},
cache::{Artifact, Error as CacheError},
2019-03-17 02:54:50 +00:00
error::{CompileError, CompileResult},
module::{ModuleInfo, ModuleInner},
2019-02-13 16:53:36 +00:00
};
struct Placeholder;
impl CacheGen for Placeholder {
fn generate_cache(
&self,
2019-03-17 02:54:50 +00:00
_module: &ModuleInner,
) -> Result<(Box<ModuleInfo>, Box<[u8]>, Memory), CacheError> {
2019-03-17 16:31:36 +00:00
Err(CacheError::Unknown(
"the dynasm backend doesn't support caching yet".to_string(),
))
}
}
2019-02-13 16:53:36 +00:00
pub struct SinglePassCompiler {}
impl SinglePassCompiler {
pub fn new() -> Self {
Self {}
}
}
2019-02-13 16:53:36 +00:00
impl Compiler for SinglePassCompiler {
fn compile(
&self,
wasm: &[u8],
compiler_config: CompilerConfig,
_: Token,
) -> CompileResult<ModuleInner> {
2019-02-13 16:53:36 +00:00
let mut mcg = codegen_x64::X64ModuleCodeGenerator::new();
let info = parse::read_module(wasm, Backend::Dynasm, &mut mcg, &compiler_config)?;
let (ec, resolver) = mcg.finalize(&info)?;
2019-02-13 16:53:36 +00:00
Ok(ModuleInner {
cache_gen: Box::new(Placeholder),
func_resolver: Box::new(resolver),
2019-02-14 18:21:52 +00:00
protected_caller: Box::new(ec),
2019-02-13 16:53:36 +00:00
info: info,
})
}
unsafe fn from_cache(&self, _artifact: Artifact, _: Token) -> Result<ModuleInner, CacheError> {
2019-03-17 16:31:36 +00:00
Err(CacheError::Unknown(
"the dynasm backend doesn't support caching yet".to_string(),
))
}
2019-02-13 16:53:36 +00:00
}
2019-02-14 18:21:52 +00:00
impl From<CodegenError> for CompileError {
fn from(other: CodegenError) -> CompileError {
CompileError::InternalError {
msg: other.message.into(),
}
}
}
impl From<LoadError> for CompileError {
fn from(other: LoadError) -> CompileError {
CompileError::InternalError {
msg: format!("{:?}", other),
}
}
}