22 个版本 (12 个重大更改)

0.14.2 2022年5月21日
0.12.0 2022年3月8日
0.9.0 2021年10月22日
0.7.0 2020年11月13日
0.0.0 2019年7月24日

#1144编程语言


用于 llama-wasm

ISC 许可

165KB
4K SLoC

llama

为 Rust 提供友好的 LLVM 库。

目标

  • 支持最新的 llvm-sys 版本(截至 LLVM 14 和 llama 0.14.0 版本号匹配)
  • 提供改进的接口,同时尽可能接近 LLVM C API。

由于 LLVM API 的规模,llama 中可能存在缺失、损坏或不完整的功能,请创建问题单,如果您需要的功能尚未实现。

注意llama 允许您生成无效的 IR,请查看 inkwell 以获取专注于类型安全的 LLVM 绑定

文档

示例

Inkwell 的 llama 示例

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;

fn compile_sum(jit: &mut Jit) -> Result<SumFunc, Error> {
    let i64 = Type::i64(jit.context())?;
    let sum_t = FuncType::new(i64, [i64, i64, i64])?;
    jit.declare_function("sum", sum_t, |build, f| {
        let params = f.params();
        let x = params[0];
        let y = params[1];
        let z = params[2];

        let sum = build.add(x, y, "sum")?;
        let sum = build.add(sum, z, "sum")?;
        build.ret(sum)
    })?;

    unsafe { jit.engine().function("sum") }
}

fn main() -> Result<(), Error> {
    let mut jit = Jit::new("sum", None)?;

    let sum = compile_sum(&mut jit)?;

    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(())
}

依赖关系

~0.6–1.6MB
~33K SLoC