2个版本
0.1.1 | 2023年6月5日 |
---|---|
0.1.0 | 2023年6月5日 |
#433 in 过程宏
用于 2 crates
9KB
95 代码行
自噬
另一个用于实现真实同构的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–760KB
~18K SLoC