1 use std::fs::File;
2 use std::io::Write;
3 use std::path::Path;
4 use target_lexicon::Triple;
5 use wasmtime::{CodeBuilder, Config, Engine, Result, error::Context as _};
6 
7 pub fn compile_cranelift(
8     wasm: &[u8],
9     path: Option<&Path>,
10     target: Option<Triple>,
11     output: impl AsRef<Path>,
12 ) -> Result<()> {
13     let mut config = Config::new();
14     config.debug_info(true);
15     if let Some(target) = target {
16         config.target(&target.to_string())?;
17     }
18     let engine = Engine::new(&config)?;
19     let module = CodeBuilder::new(&engine)
20         .wasm_binary_or_text(wasm, path)?
21         .compile_module()?;
22     let bytes = module.serialize()?;
23 
24     let mut file = File::create(output).context("failed to create object file")?;
25     file.write_all(&bytes)
26         .context("failed to write object file")?;
27 
28     Ok(())
29 }
30