This adds support for `.wat` tests in `cranelift-filetest`. The test runner translates the WAT to Wasm and then uses `cranelift-wasm` to translate the Wasm to CLIF. These tests are always precise output tests. The test expectations can be updated by running tests with the `CRANELIFT_TEST_BLESS=1` environment variable set, similar to our compile precise output tests. The test's expected output is contained in the last comment in the test file. The tests allow for configuring the kinds of heaps used to implement Wasm linear memory via TOML in a `;;!` comment at the start of the test. To get ISA and Cranelift flags parsing available in the filetests crate, I had to move the `parse_sets_and_triple` helper from the `cranelift-tools` binary crate to the `cranelift-reader` crate, where I think it logically fits. Additionally, I had to make some more bits of `cranelift-wasm`'s dummy environment `pub` so that I could properly wrap and compose it with the environment used for the `.wat` tests. I don't think this is a big deal, but if we eventually want to clean this stuff up, we can probably remove the dummy environments completely, remove `translate_module`, and fold them into these new test environments and test runner (since Wasmtime isn't using those things anyways).
77 lines
2.3 KiB
Rust
77 lines
2.3 KiB
Rust
//! Performs translation from a wasm module in binary format to the in-memory form
|
|
//! of Cranelift IR. More particularly, it translates the code of all the functions bodies and
|
|
//! interacts with an environment implementing the
|
|
//! [`ModuleEnvironment`](trait.ModuleEnvironment.html)
|
|
//! trait to deal with tables, globals and linear memory.
|
|
//!
|
|
//! The crate provides a `DummyEnvironment` struct that will allow to translate the code of the
|
|
//! functions but will fail at execution.
|
|
//!
|
|
//! The main function of this module is [`translate_module`](fn.translate_module.html).
|
|
|
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)]
|
|
#![warn(unused_import_braces)]
|
|
#![cfg_attr(feature = "std", deny(unstable_features))]
|
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
|
#![cfg_attr(feature = "cargo-clippy", allow(clippy::new_without_default))]
|
|
#![cfg_attr(
|
|
feature = "cargo-clippy",
|
|
warn(
|
|
clippy::float_arithmetic,
|
|
clippy::mut_mut,
|
|
clippy::nonminimal_bool,
|
|
clippy::map_unwrap_or,
|
|
clippy::clippy::print_stdout,
|
|
clippy::unicode_not_nfc,
|
|
clippy::use_self
|
|
)
|
|
)]
|
|
#![no_std]
|
|
|
|
#[cfg(not(feature = "std"))]
|
|
#[macro_use]
|
|
extern crate alloc as std;
|
|
#[cfg(feature = "std")]
|
|
#[macro_use]
|
|
extern crate std;
|
|
|
|
#[cfg(not(feature = "std"))]
|
|
use hashbrown::{
|
|
hash_map,
|
|
hash_map::Entry::{Occupied, Vacant},
|
|
HashMap,
|
|
};
|
|
#[cfg(feature = "std")]
|
|
use std::collections::{
|
|
hash_map,
|
|
hash_map::Entry::{Occupied, Vacant},
|
|
HashMap,
|
|
};
|
|
|
|
mod code_translator;
|
|
mod environ;
|
|
mod func_translator;
|
|
mod module_translator;
|
|
mod sections_translator;
|
|
mod state;
|
|
mod translation_utils;
|
|
|
|
pub use crate::environ::{
|
|
DummyEnvironment, DummyFuncEnvironment, DummyModuleInfo, ExpectedReachability, FuncEnvironment,
|
|
GlobalVariable, ModuleEnvironment, TargetEnvironment,
|
|
};
|
|
pub use crate::func_translator::FuncTranslator;
|
|
pub use crate::module_translator::translate_module;
|
|
pub use crate::state::FuncTranslationState;
|
|
pub use crate::translation_utils::*;
|
|
pub use cranelift_frontend::FunctionBuilder;
|
|
pub use wasmtime_types::*;
|
|
|
|
// Convenience reexport of the wasmparser crate that we're linking against,
|
|
// since a number of types in `wasmparser` show up in the public API of
|
|
// `cranelift-wasm`.
|
|
pub use wasmparser;
|
|
|
|
/// Version number of this crate.
|
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|