A friendly LLVM library for Rust.
Goals:
- Support the latest llvm-sys
release (as of LLVM 14 and llama 0.14.0 the version numbers match)
- Provide an improved interface, while still remaining as close as possible to the LLVM C API.
Due to the size of the LLVM API there is bound to be missing, broken or incomplete functionality in llama
, please create an issue if something you need isn't implemented.
NOTE: llama
will let you generate invalid IR, take a look at inkwell for LLVM bindings with a focus on type-safety
Inkwell's example using llama
:
```rust use llama::*;
// Convenience type alias for the sum
function.
//
// Calling this is innately unsafe
because there's no guarantee it doesn't
// do unsafe
operations internally.
type SumFunc = unsafe extern "C" fn(u64, u64, u64) -> u64;
// Context should be last to perform cleanup in the correct order struct CodeGen<'ctx> { engine: ExecutionEngine<'ctx>, build: Builder<'ctx>, context: Context<'ctx>, }
impl<'ctx> CodeGen<'ctx> {
fn jitcompilesum(&mut self) -> Result
let sum = self.build.add(x, y, "sum")?;
let sum = self.build.add(sum, z, "sum")?;
self.build.ret(sum)
})?;
unsafe { self.engine.function("sum") }
}
}
fn main() -> Result<(), Error> { let context = Context::new()?; let module = Module::new(&context, "sum")?; let build = Builder::new(&context)?; let engine = ExecutionEngine::new_jit(module, 0)?; let mut codegen = CodeGen { context: context, build, engine, };
let sum = codegen.jit_compile_sum()?;
let x = 1u64;
let y = 2u64;
let z = 3u64;
unsafe {
println!("{} + {} + {} = {}", x, y, z, sum(x, y, z));
assert_eq!(sum(x, y, z), x + y + z);
}
Ok(())
} ```