use crate::compiler::nucleus;
pub mod binary;
pub mod conv;
const RUNTIME_NAME: &str = "blr_runtime";
pub fn register_runtime(data_size: u32, modules: &mut Vec<(String, String, nucleus::Module)>) {
let module = wat::parse_str(RUNTIME_WAT.replace("DATA_SIZE", &data_size.to_string()))
.expect("blr_runtime should be a valid wat module");
modules.push((
RUNTIME_NAME.to_string(),
"".to_string(),
nucleus::Module {
module,
imports: Default::default(),
externals: Default::default(),
exports: Default::default(),
},
));
}
const RUNTIME_WAT: &str = r#"
(module
(memory 100)
(export "mem" (memory 0))
(table $func_tbl 1000 funcref)
(export "func_tbl" (table $func_tbl))
(global $bump (mut i32) (i32.const DATA_SIZE))
(func $alloc (param $align i32) (param $size i32) (result i32)
(local $ptr i32)
global.get $bump
local.get $align
i32.add
i32.const 1
i32.sub
local.get $align
i32.const 1
i32.sub
i32.const -1
i32.xor
i32.and
local.tee $ptr
local.get $size
i32.add
global.set $bump
local.get $ptr)
;; Define realloc that performs a new allocation
(func $realloc (param $old_ptr i32) (param $old_size i32) (param $align i32) (param $size i32) (result i32)
local.get $align
local.get $size
call $alloc)
(export "alloc" (func $alloc))
(export "realloc" (func $realloc))
)"#;