Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
bytecodealliance
GitHub Repository: bytecodealliance/wasmtime
Path: blob/main/src/commands/explore.rs
3069 views
1
//! The module that implements the `wasmtime explore` command.
2
3
use clap::Parser;
4
use std::{borrow::Cow, path::PathBuf};
5
use tempfile::tempdir;
6
use wasmtime::{Result, Strategy, error::Context as _};
7
use wasmtime_cli_flags::CommonOptions;
8
9
/// Explore the compilation of a WebAssembly module to native code.
10
#[derive(Parser)]
11
pub struct ExploreCommand {
12
#[command(flatten)]
13
common: CommonOptions,
14
15
/// The path of the WebAssembly module to compile
16
#[arg(required = true, value_name = "MODULE")]
17
module: PathBuf,
18
19
/// The path of the explorer output (derived from the MODULE name if none
20
/// provided)
21
#[arg(short, long)]
22
output: Option<PathBuf>,
23
}
24
25
impl ExploreCommand {
26
/// Executes the command.
27
pub fn execute(mut self) -> Result<()> {
28
self.common.init_logging()?;
29
30
let mut config = self.common.config(None)?;
31
32
let bytes =
33
Cow::Owned(std::fs::read(&self.module).with_context(|| {
34
format!("failed to read Wasm module: {}", self.module.display())
35
})?);
36
#[cfg(feature = "wat")]
37
let bytes = wat::parse_bytes(&bytes).map_err(|mut e| {
38
e.set_path(&self.module);
39
e
40
})?;
41
42
let output = self
43
.output
44
.clone()
45
.unwrap_or_else(|| self.module.with_extension("explore.html"));
46
let output_file = std::fs::File::create(&output)
47
.with_context(|| format!("failed to create file: {}", output.display()))?;
48
let mut output_file = std::io::BufWriter::new(output_file);
49
50
let clif_dir = if let Some(Strategy::Cranelift) | None = self.common.codegen.compiler {
51
let clif_dir = tempdir()?;
52
config.emit_clif(clif_dir.path());
53
config.cache(None); // cache does not emit clif
54
Some(clif_dir)
55
} else {
56
None
57
};
58
59
wasmtime_explorer::generate(
60
&config,
61
self.common.target.as_deref(),
62
clif_dir.as_ref().map(|tmp_dir| tmp_dir.path()),
63
&bytes,
64
&mut output_file,
65
)?;
66
67
println!("Exploration written to {}", output.display());
68
Ok(())
69
}
70
}
71
72