#llvm #jit

llama-wasm

友好的 LLVM 绑定 (WASM)

5 个版本 (有破坏性)

0.5.0 2020年5月20日
0.4.0 2020年5月3日
0.3.0 2020年4月25日
0.2.0 2020年4月24日
0.1.0 2020年4月8日

#111 in #jit

ISC 许可证

170KB
4.5K SLoC

llama

友好的 Rust 用的 LLVM 库。

目标

  • 支持最新的 llvm-sys 版本
  • 提供改进的接口,同时尽可能接近 LLVM C API。

由于 LLVM API 的体积,llama 中可能存在缺失、损坏或不完整的功能,如果您需要的功能未实现,请创建一个 issue。

注意: llama 将允许您生成无效的 IR,有关关注类型安全的 LLVM 绑定,请查看 inkwell

文档

示例

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;


// 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 jit_compile_sum(&mut self) -> Result<SumFunc, Error> {
        let i64 = Type::i64(&self.context)?;
        let sum_t = FuncType::new(i64, [i64, i64, i64])?;
        self.engine
            .module()
            .declare_function(&self.build, "sum", sum_t, |f| {
                let params = f.params();
                let x = params[0];
                let y = params[1];
                let z = params[2];

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

依赖项

~41MB
~1M SLoC