Skip to main content

SimpleJIT

Struct SimpleJIT 

Source
pub struct SimpleJIT { /* private fields */ }
Expand description

A convenience wrapper around LLVMLLJIT.

It takes ownership of the LLVMModule to be compiled and its owning LLVMContext.

§Example

use pliron_llvm::llvm_sys::core::{LLVMContext, LLVMMemoryBuffer, LLVMModule};
use pliron_llvm::llvm_sys::lljit::SimpleJIT;

let context = LLVMContext::default();

let ir = r#"
  @sum_global = global i32 0

  define i32 @add(i32 %a, i32 %b) {
      %sum = add i32 %a, %b
      store i32 %sum, ptr @sum_global
      ret i32 %sum
  }"#;

let module = LLVMModule::from_ir_in_str(&context, ir, None).unwrap();

let jit = SimpleJIT::new(context, module).unwrap();
let adder = unsafe { jit.lookup_symbol::<fn(i32, i32) -> i32>("add").unwrap() };
assert_eq!(adder(2, 3), 5);

// The global is updated as a side effect of calling `add`, and can be
// looked up (as a pointer to its storage).
let sum_global = unsafe { jit.lookup_symbol::<*const i32>("sum_global").unwrap() };
assert_eq!(unsafe { **sum_global }, 5);

Implementations§

Source§

impl SimpleJIT

Source

pub fn new(context: LLVMContext, module: LLVMModule) -> Result<Self, String>

Create a JIT from module and the context that contains it.

See type documentation for examples.

Source

pub unsafe fn lookup_symbol<'jit, T: Copy>( &'jit self, symbol_name: &str, ) -> Result<JitSymbol<'jit, T>, String>

Lookup a symbol in the JIT and interpret it to be of type F.

See type documentation for examples.

§Safety

The type of the symbol must be correct.

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
§

impl<T> Downcast for T
where T: Any,

§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts Box<dyn Trait> (where Trait: Downcast) to Box<dyn Any>, which can then be downcast into Box<dyn ConcreteType> where ConcreteType implements Trait.
§

fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>

Converts Rc<Trait> (where Trait: Downcast) to Rc<Any>, which can then be further downcast into Rc<ConcreteType> where ConcreteType implements Trait.
§

fn as_any(&self) -> &(dyn Any + 'static)

Converts &Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &Any’s vtable from &Trait’s.
§

fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)

Converts &mut Trait (where Trait: Downcast) to &Any. This is needed since Rust cannot generate &mut Any’s vtable from &mut Trait’s.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.