Skip to main content

portal_pc_waffle_backend/
lib.rs

1//! Backend: convert IR to Wasm for WAFFLE.
2#![no_std]
3#![forbid(unsafe_code)]
4#![allow(dead_code)]
5
6#[macro_use]
7extern crate alloc;
8
9use alloc::vec::Vec;
10use anyhow::Result;
11
12// Re-export dependencies
13pub use waffle_entity as entity;
14pub use waffle_ir as ir;
15pub use waffle_ir::*;
16pub use waffle_ir::cfg::CFGInfo;
17pub use waffle_passes_shared;
18
19pub mod backend;
20pub use backend::*;
21
22/// Compile a WAFFLE Module to Wasm bytes.
23pub fn to_wasm_bytes(module: &Module<'_>) -> Result<Vec<u8>> {
24    backend::compile(module).map(|m| m.finish())
25}
26
27/// Compile a WAFFLE Module to a wasm_encoder::Module.
28pub fn to_encoded_module(module: &Module<'_>) -> Result<wasm_encoder::Module> {
29    backend::compile(module)
30}
31
32pub trait ModuleExt<'a>{
33    fn module(&self) -> &Module<'a>;
34    fn to_wasm_bytes(&self) -> Result<Vec<u8>>{
35        return to_wasm_bytes(self.module());
36    }
37    fn to_encoded_module(&self) -> Result<wasm_encoder::Module>{
38        return to_encoded_module(self.module());
39    }
40}
41impl<'a> ModuleExt<'a> for Module<'a>{
42    fn module(&self) -> &Module<'a> {
43        self
44    }
45}
46
47#[cfg(test)]
48mod test {
49    use super::*;
50    #[test]
51    fn empty_module_valid() {
52        let module = Module::empty();
53        let _ = module.to_wasm_bytes().unwrap();
54    }
55}