2 个版本
0.1.1 | 2023 年 6 月 5 日 |
---|---|
0.1.0 | 2023 年 6 月 5 日 |
238 在 性能分析
33 每月下载量
13KB
110 行
Autophagy
又一款用于 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(®istry);
let context = Context::new();
context.append_dialect_registry(®istry);
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