use crate::compiler::Compiler;
use anyhow::Result;
use cranelift_codegen::settings;
use std::sync::Arc;
use target_lexicon::Triple;
use wasmtime_environ::{CompilerBuilder, Setting};
use winch_codegen::isa;
struct Builder {
triple: Triple,
shared_flags: settings::Builder,
isa_builder: isa::Builder,
}
pub fn builder() -> Box<dyn CompilerBuilder> {
let triple = Triple::host();
Box::new(Builder {
triple: triple.clone(),
shared_flags: settings::builder(),
isa_builder: isa::lookup(triple).expect("host architecture is not supported"),
})
}
impl CompilerBuilder for Builder {
fn triple(&self) -> &target_lexicon::Triple {
&self.triple
}
fn target(&mut self, target: target_lexicon::Triple) -> Result<()> {
self.triple = target;
Ok(())
}
fn set(&mut self, _name: &str, _val: &str) -> Result<()> {
Ok(())
}
fn enable(&mut self, _name: &str) -> Result<()> {
Ok(())
}
fn settings(&self) -> Vec<Setting> {
vec![]
}
fn build(&self) -> Result<Box<dyn wasmtime_environ::Compiler>> {
let flags = settings::Flags::new(self.shared_flags.clone());
Ok(Box::new(Compiler::new(
self.isa_builder.clone().build(flags)?,
)))
}
fn enable_incremental_compilation(
&mut self,
_cache_store: Arc<dyn wasmtime_environ::CacheStore>,
) {
todo!()
}
}
impl std::fmt::Debug for Builder {
fn fmt(&self, f: &mut std::fmt::Formatter) -> std::fmt::Result {
write!(f, "Builder: {{ triple: {:?} }}", self.triple())
}
}