1个不稳定版本
0.1.1 | 2024年8月6日 |
---|
#96 in FFI
215KB
4.5K SLoC
Ygen - 另一个代码生成器
Ygen是一个用于构建编译器后端的库。
它的主要重点是拥有像LLVMSwift(ygen也很容易实现,因此每个人都可以添加自己的ir节点和编译后端)一样易于使用的API。
它相对于LLVM有一些优势,比如更安全的内存,因为它是用Rust编写的。但它也缺乏许多ir节点、可用的优化技术、工具和贡献者。
IR与LLVM的IR差异不大。
路线图
您可以在我们的Trello待办事项列表中查看我们的待办事项状态等。
路线图
简单示例
以下是一个如何使用Ygen构建简单加法函数的示例。
use std::error::Error;
use Ygen::prelude::*;
pub fn main() -> Result<(), Box<dyn Error>> {
let mut module = Module();
let mut builder = IRBuilder();
let ty = FnTy(vec![TypeMetadata::i32, TypeMetadata::i32], TypeMetadata::i32);
let func = module.add(
"add", &ty
);
func.extrn(); // make function externally visible
let entry = func.addBlock("entry");
builder.positionAtEnd(entry);
let val = builder.BuildAdd(ty.arg(0), ty.arg(1));
builder.BuildRet( val );
module.verify().print();
eprintln!("{}",
module.dumpColored()
);
Ok(())
}
当执行此简单程序时,它会构建一个加法函数并将其ir输出。
define i32 @add( i32 %0, i32 %1 ) {
entry:
%2 = add i32 %0, %1
ret i32 %2
}
您可以添加以下行(您需要包含 std::fs::Path
)来将IR编译到底层汇编。
module.emitToAsmFile(
Triple::host(),
&mut initializeAllTargets(),
Path::new("out.asm")
)?;
支持
Ygen目前支持以下架构
名称 | 完整ir | 完整isa |
---|---|---|
x64 | X | X |
版权
此项目归Cr0a3所有,并许可在Apache2许可证下使用。
依赖项
~3MB
~30K SLoC