Crates.io | Ygen |
lib.rs | Ygen |
version | 0.1.2 |
source | src |
created_at | 2024-08-06 12:38:38.477584 |
updated_at | 2024-10-03 17:53:29.25636 |
description | Yet another code generation libary like LLVM |
homepage | https://ygen.vercel.app/ |
repository | https://github.com/Toni-Graphics/ygen |
max_upload_size | |
id | 1327231 |
size | 659,339 |
Welcome to Ygen! This repository contains the source code of the ygen project.
Ygen is a toolkit for building fast and clean compilers using a memory safe api.
You are probably wondering: why would I choose ygen and not llvm or cranelift?? Here are a few reasons:
IRBuilder
to be very similar to the Builder
from LLVMBuild...
functions from the IRBuilder
to build ir nodes[!WARNING] This project is still early in its developement. Bugs and miscompilations are expected.
ONLY USE YGEN FOR TOY COMPILERS
Here is a simple example on how to use Ygen to build an add function:
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(())
}
When executed this simple program builds an add function and dumps it's ir:
define i32 @add( i32 %0, i32 %1 ) {
entry:
%2 = add i32 %0, %1
ret i32 %2
}
You can add following lines (you need to include std::fs::Path
) to compile the IR down to assembly:
module.emitToAsmFile(
Triple::host(),
&mut initializeAllTargets(Triple::host())?,
Path::new("out.asm")
)?;
Ygen currently supports following architectures
Name | Full ir | Full isa |
---|---|---|
x64 | Yes | No |
This project is owned by Cr0a3 and licensed under the Apache2 License