1#![deny(
2 dead_code,
3 missing_docs,
4 nonstandard_style,
5 unused_imports,
6 unused_mut,
7 unused_variables,
8 unused_unsafe,
9 unreachable_patterns
10)]
11#![doc(html_favicon_url = "https://wasmer.io/static/icons/favicon.ico")]
12#![doc(html_logo_url = "https://avatars3.githubusercontent.com/u/44205449?s=200&v=4")]
13
14#[macro_use]
95extern crate serde_derive;
96
97pub use wasmer_runtime_core::backend::{ExceptionCode, Features};
98pub use wasmer_runtime_core::codegen::{MiddlewareChain, StreamingCompiler};
99pub use wasmer_runtime_core::export::Export;
100pub use wasmer_runtime_core::global::Global;
101pub use wasmer_runtime_core::import::{ImportObject, LikeNamespace};
102pub use wasmer_runtime_core::instance::{DynFunc, Instance};
103pub use wasmer_runtime_core::memory::ptr::{Array, Item, WasmPtr};
104pub use wasmer_runtime_core::memory::Memory;
105pub use wasmer_runtime_core::module::Module;
106pub use wasmer_runtime_core::table::Table;
107pub use wasmer_runtime_core::types::Value;
108pub use wasmer_runtime_core::vm::Ctx;
109
110pub use wasmer_runtime_core::Func;
111pub use wasmer_runtime_core::{compile_with, validate};
112pub use wasmer_runtime_core::{func, imports};
113
114#[cfg(unix)]
115pub use wasmer_runtime_core::{
116 fault::{pop_code_version, push_code_version},
117 state::CodeVersion,
118};
119
120pub mod memory {
121 pub use wasmer_runtime_core::memory::{Atomically, Memory, MemoryView};
124}
125
126pub mod wasm {
127 pub use wasmer_runtime_core::global::Global;
129 pub use wasmer_runtime_core::table::Table;
130 pub use wasmer_runtime_core::types::{
131 FuncSig, GlobalDescriptor, MemoryDescriptor, TableDescriptor, Type, Value,
132 };
133}
134
135pub mod error {
136 pub use wasmer_runtime_core::cache::Error as CacheError;
139 pub use wasmer_runtime_core::error::*;
140}
141
142pub mod units {
143 pub use wasmer_runtime_core::units::{Bytes, Pages};
145}
146
147pub mod types {
148 pub use wasmer_runtime_core::types::*;
150}
151
152pub mod cache;
153
154pub use wasmer_runtime_core::backend::{Compiler, CompilerConfig};
155
156#[derive(Serialize, Deserialize, Debug, Copy, Clone, PartialEq, Eq)]
158pub enum Backend {
159 #[cfg(feature = "singlepass")]
160 Singlepass,
162 #[cfg(feature = "cranelift")]
163 Cranelift,
165 #[cfg(feature = "llvm")]
166 LLVM,
168 Auto,
170}
171
172impl Backend {
173 pub fn variants() -> &'static [&'static str] {
175 &[
176 #[cfg(feature = "singlepass")]
177 "singlepass",
178 #[cfg(feature = "cranelift")]
179 "cranelift",
180 #[cfg(feature = "llvm")]
181 "llvm",
182 "auto",
183 ]
184 }
185
186 pub fn to_string(&self) -> &'static str {
189 match self {
190 #[cfg(feature = "singlepass")]
191 Backend::Singlepass => "singlepass",
192 #[cfg(feature = "cranelift")]
193 Backend::Cranelift => "cranelift",
194 #[cfg(feature = "llvm")]
195 Backend::LLVM => "llvm",
196 Backend::Auto => "auto",
197 }
198 }
199}
200
201impl Default for Backend {
202 fn default() -> Self {
203 #[cfg(all(feature = "default-backend-singlepass", not(feature = "docs")))]
204 return Backend::Singlepass;
205
206 #[cfg(any(feature = "default-backend-cranelift", feature = "docs"))]
207 return Backend::Cranelift;
208
209 #[cfg(all(feature = "default-backend-llvm", not(feature = "docs")))]
210 return Backend::LLVM;
211
212 #[cfg(not(any(
213 feature = "default-backend-singlepass",
214 feature = "default-backend-cranelift",
215 feature = "default-backend-llvm",
216 )))]
217 panic!("There is no default-backend set.");
218 }
219}
220
221impl std::str::FromStr for Backend {
222 type Err = String;
223 fn from_str(s: &str) -> Result<Backend, String> {
224 match s.to_lowercase().as_str() {
225 #[cfg(feature = "singlepass")]
226 "singlepass" => Ok(Backend::Singlepass),
227 #[cfg(feature = "cranelift")]
228 "cranelift" => Ok(Backend::Cranelift),
229 #[cfg(feature = "llvm")]
230 "llvm" => Ok(Backend::LLVM),
231 "auto" => Ok(Backend::Auto),
232 _ => Err(format!("The backend {} doesn't exist", s)),
233 }
234 }
235}
236
237#[cfg(any(
254 feature = "default-backend-singlepass",
255 feature = "default-backend-cranelift",
256 feature = "default-backend-llvm",
257))]
258pub fn compile(wasm: &[u8]) -> error::CompileResult<Module> {
259 wasmer_runtime_core::compile_with(&wasm[..], &default_compiler())
260}
261
262#[cfg(any(
268 feature = "default-backend-singlepass",
269 feature = "default-backend-cranelift",
270 feature = "default-backend-llvm",
271))]
272pub fn compile_with_config(
273 wasm: &[u8],
274 compiler_config: CompilerConfig,
275) -> error::CompileResult<Module> {
276 wasmer_runtime_core::compile_with_config(&wasm[..], &default_compiler(), compiler_config)
277}
278
279pub fn compile_with_config_with(
282 wasm: &[u8],
283 compiler_config: CompilerConfig,
284 compiler: &dyn Compiler,
285) -> error::CompileResult<Module> {
286 wasmer_runtime_core::compile_with_config(&wasm[..], compiler, compiler_config)
287}
288
289#[cfg(any(
311 feature = "default-backend-singlepass",
312 feature = "default-backend-cranelift",
313 feature = "default-backend-llvm",
314))]
315pub fn instantiate(wasm: &[u8], import_object: &ImportObject) -> error::Result<Instance> {
316 let module = compile(wasm)?;
317 module.instantiate(import_object)
318}
319
320#[cfg(any(
329 feature = "default-backend-singlepass",
330 feature = "default-backend-cranelift",
331 feature = "default-backend-llvm",
332))]
333pub fn default_compiler() -> impl Compiler {
334 #[cfg(any(
335 all(
336 feature = "default-backend-llvm",
337 not(feature = "docs"),
338 any(
339 feature = "default-backend-cranelift",
340 feature = "default-backend-singlepass"
341 )
342 ),
343 all(
344 not(feature = "docs"),
345 feature = "default-backend-cranelift",
346 feature = "default-backend-singlepass"
347 )
348 ))]
349 compile_error!(
350 "The `default-backend-X` features are mutually exclusive. Please choose just one"
351 );
352
353 #[cfg(all(feature = "default-backend-llvm", not(feature = "docs")))]
354 use wasmer_llvm_backend::LLVMCompiler as DefaultCompiler;
355
356 #[cfg(all(feature = "default-backend-singlepass", not(feature = "docs")))]
357 use wasmer_singlepass_backend::SinglePassCompiler as DefaultCompiler;
358
359 #[cfg(any(feature = "default-backend-cranelift", feature = "docs"))]
360 use wasmer_clif_backend::CraneliftCompiler as DefaultCompiler;
361
362 return DefaultCompiler::new();
363}
364
365pub fn compiler_for_backend(backend: Backend) -> Option<Box<dyn Compiler>> {
371 match backend {
372 #[cfg(feature = "cranelift")]
373 Backend::Cranelift => Some(Box::new(wasmer_clif_backend::CraneliftCompiler::new())),
374
375 #[cfg(any(feature = "singlepass"))]
376 Backend::Singlepass => Some(Box::new(
377 wasmer_singlepass_backend::SinglePassCompiler::new(),
378 )),
379
380 #[cfg(feature = "llvm")]
381 Backend::LLVM => Some(Box::new(wasmer_llvm_backend::LLVMCompiler::new())),
382
383 Backend::Auto => {
384 #[cfg(feature = "default-backend-singlepass")]
385 return Some(Box::new(
386 wasmer_singlepass_backend::SinglePassCompiler::new(),
387 ));
388 #[cfg(feature = "default-backend-cranelift")]
389 return Some(Box::new(wasmer_clif_backend::CraneliftCompiler::new()));
390 #[cfg(feature = "default-backend-llvm")]
391 return Some(Box::new(wasmer_llvm_backend::LLVMCompiler::new()));
392
393 #[cfg(not(any(
394 feature = "default-backend-singlepass",
395 feature = "default-backend-cranelift",
396 feature = "default-backend-llvm",
397 )))]
398 panic!("There is no default-compiler set.");
399 }
400 }
401}
402
403pub const VERSION: &str = env!("CARGO_PKG_VERSION");
405
406#[cfg(test)]
407mod test {
408 use super::*;
409 use std::str::FromStr;
410
411 #[test]
412 fn str_repr_matches() {
413 for &backend in &[
417 #[cfg(feature = "cranelift")]
418 Backend::Cranelift,
419 #[cfg(feature = "llvm")]
420 Backend::LLVM,
421 #[cfg(feature = "singlepass")]
422 Backend::Singlepass,
423 ] {
424 assert_eq!(backend, Backend::from_str(backend.to_string()).unwrap());
425 }
426 }
427}