use crate::abi::Abi;
use lamina_mir::MirType;
use lamina_platform::TargetOperatingSystem;
pub struct WasmABI {
target_os: TargetOperatingSystem,
}
impl WasmABI {
pub fn new(target_os: TargetOperatingSystem) -> Self {
Self { target_os }
}
pub fn mangle_function_name(&self, name: &str) -> String {
name.to_string()
}
pub fn get_runtime_imports(&self) -> &'static [(&'static str, &'static str)] {
&[
(
"$writebyte",
"(import \"env\" \"writebyte\" (func $writebyte (param i64) (result i64)))",
),
(
"$readbyte",
"(import \"env\" \"readbyte\" (func $readbyte (result i64)))",
),
(
"$malloc",
"(import \"env\" \"malloc\" (func $malloc (param i64) (result i64)))",
),
(
"$free",
"(import \"env\" \"free\" (func $free (param i64)))",
),
(
"$write",
"(import \"env\" \"write\" (func $write (param i64 i64) (result i64)))",
),
(
"$read",
"(import \"env\" \"read\" (func $read (param i64 i64) (result i64)))",
),
(
"$memcpy",
"(import \"env\" \"memcpy\" (func $memcpy (param i64 i64 i64)))",
),
(
"$memmove",
"(import \"env\" \"memmove\" (func $memmove (param i64 i64 i64)))",
),
(
"$memset",
"(import \"env\" \"memset\" (func $memset (param i64 i64 i64)))",
),
]
}
pub fn get_wasm_type(&self, ty: &MirType) -> &'static str {
let _ = ty;
"i64"
}
pub fn generate_local_decl(&self, index: usize) -> String {
format!(" (local $l{index} i64)")
}
}
impl Abi for WasmABI {
fn target_os(&self) -> TargetOperatingSystem {
self.target_os
}
fn mangle_function_name(&self, name: &str) -> String {
WasmABI::mangle_function_name(self, name)
}
}