#llvm #compiler #codegen

Ygen

类似于LLVM的另一个代码生成库

1个不稳定版本

0.1.1 2024年8月6日

#96 in FFI

Apache-2.0

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