xref: /wasmtime-44.0.1/src/commands/explore.rs (revision 94740588)
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.
execute(mut self) -> Result<()>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