use crate::error::LaminaError;
use crate::mir::codegen::from_ir;
use crate::parser::parse_module;
use lamina_platform::{detect_host, TargetArchitecture, TargetOperatingSystem};
pub fn compile_lir_function(
ir_code: &str,
function_name: &str,
codegen_units: usize,
) -> Result<unsafe extern "C" fn() -> i64, LaminaError> {
let host = detect_host();
let target_arch = host.arch;
let target_os = host.os;
let ir_module = parse_module(ir_code)?;
let mir_module = from_ir(&ir_module, "lir_macro")?;
let runtime_result = crate::runtime::compile_to_runtime(
&mir_module,
target_arch,
target_os,
Some(function_name),
)?;
unsafe {
let ptr: *const unsafe extern "C" fn() -> i64 = runtime_result.function_ptr as *const _;
Ok(*ptr)
}
}
pub fn compile_lir_function_i64(
ir_code: &str,
function_name: &str,
codegen_units: usize,
) -> Result<unsafe extern "C" fn(i64) -> i64, LaminaError> {
let host = detect_host();
let target_arch = host.arch;
let target_os = host.os;
let ir_module = parse_module(ir_code)?;
let mir_module = from_ir(&ir_module, "lir_macro")?;
let runtime_result = crate::runtime::compile_to_runtime(
&mir_module,
target_arch,
target_os,
Some(function_name),
)?;
unsafe {
let ptr: *const unsafe extern "C" fn(i64) -> i64 = runtime_result.function_ptr as *const _;
Ok(*ptr)
}
}
pub fn compile_lir_function_i64_i64(
ir_code: &str,
function_name: &str,
codegen_units: usize,
) -> Result<unsafe extern "C" fn(i64, i64) -> i64, LaminaError> {
let host = detect_host();
let target_arch = host.arch;
let target_os = host.os;
let ir_module = parse_module(ir_code)?;
let mir_module = from_ir(&ir_module, "lir_macro")?;
let runtime_result = crate::runtime::compile_to_runtime(
&mir_module,
target_arch,
target_os,
Some(function_name),
)?;
unsafe {
let ptr: *const unsafe extern "C" fn(i64, i64) -> i64 = runtime_result.function_ptr as *const _;
Ok(*ptr)
}
}