* Remove some allocations in `CodeMemory` This commit removes the `FinishedFunctions` type as well as allocations associated with trampolines when allocating inside of a `CodeMemory`. The main goal of this commit is to improve the time spent in `CodeMemory` where currently today a good portion of time is spent simply parsing symbol names and trying to extract function indices from them. Instead this commit implements a new strategy (different from #3236) where compilation records offset/length information for all functions/trampolines so this doesn't need to be re-learned from the object file later. A consequence of this commit is that this offset information will be decoded/encoded through `bincode` unconditionally, but we can also optimize that later if necessary as well. Internally this involved quite a bit of refactoring since the previous map for `FinishedFunctions` was relatively heavily relied upon. * comments
91 lines
2.9 KiB
Rust
91 lines
2.9 KiB
Rust
//! Standalone environment for WebAssembly using Cranelift. Provides functions to translate
|
|
//! `get_global`, `set_global`, `memory.size`, `memory.grow`, `call_indirect` that hardcode in
|
|
//! the translation the base addresses of regions of memory that will hold the globals, tables and
|
|
//! linear memories.
|
|
|
|
#![deny(missing_docs, trivial_numeric_casts, unused_extern_crates)]
|
|
#![warn(unused_import_braces)]
|
|
#![cfg_attr(feature = "clippy", plugin(clippy(conf_file = "../../clippy.toml")))]
|
|
#![cfg_attr(
|
|
feature = "cargo-clippy",
|
|
allow(clippy::new_without_default, 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
|
|
)
|
|
)]
|
|
|
|
mod address_map;
|
|
mod builtin;
|
|
mod compilation;
|
|
mod module;
|
|
mod module_environ;
|
|
pub mod obj;
|
|
mod stack_map;
|
|
mod trap_encoding;
|
|
mod tunables;
|
|
mod vmoffsets;
|
|
|
|
pub use crate::address_map::*;
|
|
pub use crate::builtin::*;
|
|
pub use crate::compilation::*;
|
|
pub use crate::module::*;
|
|
pub use crate::module_environ::*;
|
|
pub use crate::stack_map::StackMap;
|
|
pub use crate::trap_encoding::*;
|
|
pub use crate::tunables::Tunables;
|
|
pub use crate::vmoffsets::*;
|
|
pub use object;
|
|
|
|
// Reexport all of these type-level since they're quite commonly used and it's
|
|
// much easier to refer to everything through one crate rather than importing
|
|
// one of three and making sure you're using the right one.
|
|
pub use cranelift_entity::*;
|
|
pub use wasmtime_types::*;
|
|
|
|
/// WebAssembly page sizes are defined to be 64KiB.
|
|
pub const WASM_PAGE_SIZE: u32 = 0x10000;
|
|
|
|
/// The number of pages (for 32-bit modules) we can have before we run out of
|
|
/// byte index space.
|
|
pub const WASM32_MAX_PAGES: u64 = 1 << 16;
|
|
/// The number of pages (for 64-bit modules) we can have before we run out of
|
|
/// byte index space.
|
|
pub const WASM64_MAX_PAGES: u64 = 1 << 48;
|
|
|
|
/// Version number of this crate.
|
|
pub const VERSION: &str = env!("CARGO_PKG_VERSION");
|
|
|
|
/// Iterates through all `LibCall` members and all runtime exported functions.
|
|
#[macro_export]
|
|
macro_rules! for_each_libcall {
|
|
($op:ident) => {
|
|
$op![
|
|
(UdivI64, wasmtime_i64_udiv),
|
|
(UdivI64, wasmtime_i64_udiv),
|
|
(SdivI64, wasmtime_i64_sdiv),
|
|
(UremI64, wasmtime_i64_urem),
|
|
(SremI64, wasmtime_i64_srem),
|
|
(IshlI64, wasmtime_i64_ishl),
|
|
(UshrI64, wasmtime_i64_ushr),
|
|
(SshrI64, wasmtime_i64_sshr),
|
|
(CeilF32, wasmtime_f32_ceil),
|
|
(FloorF32, wasmtime_f32_floor),
|
|
(TruncF32, wasmtime_f32_trunc),
|
|
(NearestF32, wasmtime_f32_nearest),
|
|
(CeilF64, wasmtime_f64_ceil),
|
|
(FloorF64, wasmtime_f64_floor),
|
|
(TruncF64, wasmtime_f64_trunc),
|
|
(NearestF64, wasmtime_f64_nearest)
|
|
];
|
|
};
|
|
}
|