#jit-编译器 #互操作性 #包装器 #安全包装器 #优化 #IR #LLVM

gnu-libjit

libjit即时编译器的安全Rust包装器

8次重大版本发布

0.9.0 2022年8月21日
0.7.0 2022年8月21日
0.1.1 2022年6月15日

#454 in 编程语言

每月32次下载

GPL-2.0-only

40KB
902

gnu-libjit

警告:此包装器仅包含我为自己的项目所需的libjit的所有功能。您可能会发现它缺少某些功能。添加它们应该不会太难(

该crate是一个安全且性能良好的libjit即时编译器的包装器。它具有自己的IR、优化过程和易于互操作。

可以即时编译一个小程序并在 < 5 毫秒内执行它,与LLVM的 ~ 80 毫秒相比。我强烈推荐inkwell库作为安全、功能丰富且文档齐全的LLVM Rust包装器。请注意,您不太可能使用任何LLVM包装器在个位数毫秒内执行即时编译的程序,但您确实可以获得比此库更强大的优化、更安全和更稳定的性能。

示例

use gnu_libjit::{Abi, Context};

fn main() {
    let mut context = Context::new();
    context.build_start();


    let int_type = Context::int_type();
    let params = vec![int_type, int_type, int_type];
    let mut func = context.function(Abi::Cdecl, int_type, params).unwrap();

    let x = func.arg(0).unwrap();
    let y = func.arg(1).unwrap();
    let z = func.arg(2).unwrap();
    let temp1 = func.insn_mult(&x, &y);
    let temp2 = func.insn_add(&temp1, &z);
    func.insn_return(temp2);
    func.compile();
    context.build_end();
    
    let result: extern "C" fn(i32,i32,i32) -> i32 = func.to_closure();
    println!("3*5+2 = {}", result(3,5,2))
}

有关更多信息,请参阅./examples./src/test.rs。没有文档。函数的命名几乎与libjit库中的函数完全相同。您可以使用其文档在此处

功能

  • 支持最常见的类型 f32f64i64i32i8u8 *mut c_void
  • 易于调用原生Rust函数
  • 支持将标签插入到IR中
  • if if_not 分支加上 eq 操作符来调用它们

许可证

请参阅LICENSE

依赖项

~2.5MB
~72K SLoC