2个版本

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

#433 in 过程宏


用于 2 crates

Apache-2.0

9KB
95 代码行

自噬

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双许可。

依赖

~295–760KB
~18K SLoC