2个版本
0.1.1 | 2023年6月5日 |
---|---|
0.1.0 | 2023年6月5日 |
15 #aot
在 3 个crate中使用了(通过 autophagy)
10KB
138 行
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协议约束。
依赖项
~295–750KB
~18K SLoC