2 个版本

0.1.1 2023 年 6 月 5 日
0.1.0 2023 年 6 月 5 日

238性能分析

33 每月下载量

Apache-2.0

13KB
110

Autophagy

GitHub Action Crate License

又一款用于 Rust 的 AOT 编译器,以实现真正的同构。

背景

现有的 Rust 解释器大多是 cargo build 或 rustc 的包装。这会带来额外的开销,例如进程创建和文件系统访问。根据用例,这种方法可能不适合在 Rust 程序中编译和运行 Rust 代码。

这个 crate 旨在提供 Rust 代码到汇编的完全内存编译及其执行。这将赋予需要动态代码生成的软件能力。

示例

use autophagy_mlir::Compiler;
use melior::{
    dialect::DialectRegistry,
    ir::{Location, Module},
    pass::{self, PassManager},
    utility::{register_all_dialects, register_all_llvm_translations},
    Context, ExecutionEngine,
};

#[autophagy::quote]
fn fibonacci(x: i32) -> i32 {
    if x <= 0i32 {
        0i32
    } else if x == 1i32 {
        1i32
    } else {
        fibonacci(x - 1i32) + fibonacci(x - 2i32)
    }
}

let registry = DialectRegistry::new();
register_all_dialects(&registry);

let context = Context::new();
context.append_dialect_registry(&registry);
context.load_all_available_dialects();
register_all_llvm_translations(&context);
context.attach_diagnostic_handler(|diagnostic| {
    eprintln!("{}", diagnostic);
    true
});

let location = Location::unknown(&context);

let mut module = Module::new(location);

Compiler::new(&context, &module).compile_fn(&fibonacci_fn()).unwrap();

assert!(module.as_operation().verify());

let pass_manager = PassManager::new(&context);
pass_manager.add_pass(pass::conversion::create_func_to_llvm());

pass_manager
    .nested_under("func.func")
    .add_pass(pass::conversion::create_arith_to_llvm());
pass_manager
    .nested_under("func.func")
    .add_pass(pass::conversion::create_index_to_llvm_pass());
pass_manager.add_pass(pass::conversion::create_scf_to_control_flow());
pass_manager.add_pass(pass::conversion::create_control_flow_to_llvm());
pass_manager.add_pass(pass::conversion::create_mem_ref_to_llvm());

pass_manager.run(&mut module).unwrap();

assert!(module.as_operation().verify());

let engine = ExecutionEngine::new(&module, 2, &[], false);

let mut argument = 5;
let mut result = -1;

assert_eq!(
    unsafe {
        engine.invoke_packed(
            "fibonacci",
            &mut [
                &mut argument as *mut _ as *mut _,
                &mut result as *mut _ as *mut _,
            ],
        )
    },
    Ok(())
);

assert_eq!(result, fibonacci(argument));

支持的功能

语法

  • 算术/布尔/位运算符
  • 解引用运算符
  • 函数调用
  • let 绑定
  • = 赋值
    • 变量
    • struct 字段
    • 解引用指针
  • while 语句
  • loop 语句
  • if 表达式
  • struct 字段访问
  • 运算符赋值(例如 +=
  • impl 块和 self 接收器

类型

  • 布尔值
  • 整数
  • 浮点数
  • 引用
  • 结构体
  • 数组
  • 原子操作

字面量

  • 布尔值
  • 整数
  • 浮点数
  • 结构体
  • 数组

其他

  • HM 类型推断

许可证

双许可,MIT 和 Apache 2.0。

依赖

~1.8–8MB
~58K SLoC