use crate::func_environ::FuncEnvironment;
use cranelift_codegen::ir;
use cranelift_frontend::FunctionBuilder;
use cranelift_wasm::{WasmHeapType, WasmRefType, WasmResult, WasmValType};
#[cfg(feature = "gc")]
mod enabled;
#[cfg(feature = "gc")]
use enabled as imp;
#[cfg(not(feature = "gc"))]
mod disabled;
#[cfg(not(feature = "gc"))]
use disabled as imp;
pub fn gc_compiler(func_env: &FuncEnvironment<'_>) -> Box<dyn GcCompiler> {
imp::gc_compiler(func_env)
}
pub fn unbarriered_load_gc_ref(
func_env: &FuncEnvironment<'_>,
builder: &mut FunctionBuilder<'_>,
ty: WasmHeapType,
src: ir::Value,
flags: ir::MemFlags,
) -> WasmResult<ir::Value> {
imp::unbarriered_load_gc_ref(func_env, builder, ty, src, flags)
}
pub fn unbarriered_store_gc_ref(
func_env: &FuncEnvironment<'_>,
builder: &mut FunctionBuilder<'_>,
ty: WasmHeapType,
dst: ir::Value,
gc_ref: ir::Value,
flags: ir::MemFlags,
) -> WasmResult<()> {
imp::unbarriered_store_gc_ref(func_env, builder, ty, dst, gc_ref, flags)
}
pub fn gc_ref_table_grow_builtin(
ty: WasmHeapType,
func_env: &mut FuncEnvironment<'_>,
func: &mut ir::Function,
) -> WasmResult<ir::FuncRef> {
debug_assert!(ty.is_vmgcref_type_and_not_i31());
imp::gc_ref_table_grow_builtin(ty, func_env, func)
}
pub fn gc_ref_table_fill_builtin(
ty: WasmHeapType,
func_env: &mut FuncEnvironment<'_>,
func: &mut ir::Function,
) -> WasmResult<ir::FuncRef> {
debug_assert!(ty.is_vmgcref_type_and_not_i31());
imp::gc_ref_table_fill_builtin(ty, func_env, func)
}
pub fn gc_ref_global_get_builtin(
ty: WasmValType,
func_env: &mut FuncEnvironment<'_>,
func: &mut ir::Function,
) -> WasmResult<ir::FuncRef> {
debug_assert!(ty.is_vmgcref_type());
imp::gc_ref_global_get_builtin(ty, func_env, func)
}
pub fn gc_ref_global_set_builtin(
ty: WasmValType,
func_env: &mut FuncEnvironment<'_>,
func: &mut ir::Function,
) -> WasmResult<ir::FuncRef> {
debug_assert!(ty.is_vmgcref_type());
imp::gc_ref_global_set_builtin(ty, func_env, func)
}
pub trait GcCompiler {
fn translate_read_gc_reference(
&mut self,
func_env: &mut FuncEnvironment<'_>,
builder: &mut FunctionBuilder,
ty: WasmRefType,
src: ir::Value,
flags: ir::MemFlags,
) -> WasmResult<ir::Value>;
fn translate_write_gc_reference(
&mut self,
func_env: &mut FuncEnvironment<'_>,
builder: &mut FunctionBuilder,
ty: WasmRefType,
dst: ir::Value,
new_val: ir::Value,
flags: ir::MemFlags,
) -> WasmResult<()>;
}