use crate::*;
pub struct Jit<'ctx> {
engine: ExecutionEngine<'ctx>,
build: Builder<'ctx>,
context: Context<'ctx>,
}
impl<'ctx> Jit<'ctx> {
pub fn new(name: impl AsRef<str>, opt: Option<usize>) -> Result<Jit<'ctx>, Error> {
let context = Context::new()?;
let module = Module::new(&context, name)?;
let build = Builder::new(&context)?;
let engine = ExecutionEngine::new_jit(module, opt.unwrap_or_default())?;
Ok(Jit {
context,
build,
engine,
})
}
pub fn into_inner(self) -> (Context<'ctx>, Builder<'ctx>, ExecutionEngine<'ctx>) {
(self.context, self.build, self.engine)
}
pub fn engine(&self) -> &ExecutionEngine<'ctx> {
&self.engine
}
pub fn engine_mut(&mut self) -> &mut ExecutionEngine<'ctx> {
&mut self.engine
}
pub fn build(&self) -> &Builder<'ctx> {
&self.build
}
pub fn build_mut(&mut self) -> &mut Builder<'ctx> {
&mut self.build
}
pub fn context(&self) -> &Context<'ctx> {
&self.context
}
pub fn context_mut(&mut self) -> &mut Context<'ctx> {
&mut self.context
}
pub fn module(&self) -> &Module<'ctx> {
self.engine.module()
}
pub fn module_mut(&mut self) -> &mut Module<'ctx> {
self.engine.module_mut()
}
pub fn declare_function<
T: Into<Value<'ctx>>,
F: FnOnce(&Builder<'ctx>, Func<'ctx>) -> Result<T, Error>,
>(
&self,
name: impl AsRef<str>,
ft: FuncType,
def: F,
) -> Result<Func<'ctx>, Error> {
self.module()
.declare_function(&self.build, name, ft, |x| def(&self.build, x))
}
pub fn define_function(&self, name: impl AsRef<str>, t: FuncType) -> Result<Func<'ctx>, Error> {
self.module().define_function(name, t)
}
pub fn define_global(
&self,
name: impl AsRef<str>,
ty: impl AsRef<Type<'ctx>>,
) -> Result<Value<'ctx>, Error> {
self.module().define_global(name, ty)
}
pub fn declare_global(
&self,
name: impl AsRef<str>,
t: impl AsRef<Value<'ctx>>,
) -> Result<Value<'ctx>, Error> {
self.module().declare_global(name, t)
}
}