use crate::ast::*;
use crate::conf::ParsedConf;
use crate::error::*;
use crate::runtime::WeldRuntimeErrno;
use crate::sir::*;
use crate::util::stats::CompilationStats;
use std::fmt;
mod llvm2;
pub use self::llvm2::load_library;
#[derive(Clone, Debug)]
#[repr(C)]
pub struct WeldInputArgs {
pub input: i64,
pub nworkers: i32,
pub mem_limit: i64,
pub run: i64,
}
#[derive(Clone, Debug)]
#[repr(C)]
pub struct WeldOutputArgs {
pub output: i64,
pub run: i64,
pub errno: WeldRuntimeErrno,
}
pub trait Runnable {
fn run(&self, arg: i64) -> i64;
}
pub struct CompiledModule {
runnable: Box<dyn Runnable + Send + Sync>,
}
impl CompiledModule {
pub fn run(&self, arg: i64) -> i64 {
self.runnable.run(arg)
}
}
impl fmt::Debug for CompiledModule {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
write!(f, "CompiledModule")
}
}
pub fn compile_program(
program: &SirProgram,
conf: &mut ParsedConf,
stats: &mut CompilationStats,
) -> WeldResult<CompiledModule> {
let runnable = llvm2::compile(&program, conf, stats)?;
let result = CompiledModule { runnable };
Ok(result)
}
pub fn size_of(ty: &Type) -> usize {
llvm2::size_of(ty)
}