* Port v8 fuzzer to the new framework This commit aims to improve the support for the new "meta" differential fuzzer added in #4515 by ensuring that all existing differential fuzzing is migrated to this new fuzzer. This PR includes features such as: * The V8 differential execution is migrated to the new framework. * `Config::set_differential_config` no longer force-disables wasm features, instead allowing them to be enabled as per the fuzz input. * `DiffInstance::{hash, hash}` was replaced with `DiffInstance::get_{memory,global}` to allow more fine-grained assertions. * Support for `FuncRef` and `ExternRef` have been added to `DiffValue` and `DiffValueType`. For now though generating an arbitrary `ExternRef` and `FuncRef` simply generates a null value. * Arbitrary `DiffValue::{F32,F64}` values are guaranteed to use canonical NaN representations to fix an issue with v8 where with the v8 engine we can't communicate non-canonical NaN values through JS. * `DiffEngine::evaluate` allows "successful failure" for cases where engines can't support that particular invocation, for example v8 can't support `v128` arguments or return values. * Smoke tests were added for each engine to ensure that a simple wasm module works at PR-time. * Statistics printed from the main fuzzer now include percentage-rates for chosen engines as well as percentage rates for styles-of-module. There's also a few small refactorings here and there but mostly just things I saw along the way. * Update the fuzzing README
39 lines
1.2 KiB
Rust
39 lines
1.2 KiB
Rust
//! This library provides a way to interpret Wasm functions in the official Wasm
|
|
//! specification interpreter, written in OCaml, from Rust.
|
|
//!
|
|
//! In order to not break Wasmtime's build, this library will always compile. It
|
|
//! does depend on certain tools (see `README.md`) that may or may not be
|
|
//! available in the environment:
|
|
//! - when the tools are available, we build and link to an OCaml static
|
|
//! library (see `with_library` module)
|
|
//! - when the tools are not available, this library will panic at runtime (see
|
|
//! `without_library` module).
|
|
|
|
/// Enumerate the kinds of Wasm values.
|
|
#[derive(Clone, Debug, PartialEq)]
|
|
pub enum Value {
|
|
I32(i32),
|
|
I64(i64),
|
|
F32(i32),
|
|
F64(i64),
|
|
V128(Vec<u8>),
|
|
}
|
|
|
|
#[cfg(feature = "has-libinterpret")]
|
|
mod with_library;
|
|
#[cfg(feature = "has-libinterpret")]
|
|
pub use with_library::*;
|
|
|
|
#[cfg(not(feature = "has-libinterpret"))]
|
|
mod without_library;
|
|
#[cfg(not(feature = "has-libinterpret"))]
|
|
pub use without_library::*;
|
|
|
|
// If the user is fuzzing`, we expect the OCaml library to have been built.
|
|
#[cfg(all(fuzzing, not(feature = "has-libinterpret")))]
|
|
compile_error!("The OCaml library was not built.");
|
|
|
|
pub fn support_compiled_in() -> bool {
|
|
cfg!(feature = "has-libinterpret")
|
|
}
|