diff --git a/README.md b/README.md index 077013b9..3e9491f1 100644 --- a/README.md +++ b/README.md @@ -6,16 +6,16 @@ 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. +Ygen is a toolkit for building modern compilers, using a llvm like api. ## Why ygen? -You are probably wondering: why would I choose ygen and not llvm or cranelift?? +You are probably wondering: Why would I choose ygen and not llvm? Here are a few reasons: - **Simplicity**: One of ygens main focus is simplicity which means to us that as much code as possible is readable and shared -- **Similare API**: Ygens API is very similar to LLVMs API for example i designed the `IRBuilder` to be very similar to the `Builder` from LLVM -- **Traits**: Ygen uses a lot of traits to overload functions. Great examples are the `Build...` functions from the `IRBuilder` to build ir nodes +- **Similare API**: Ygens API is very similar to LLVMs API. For example all function names for building ir are nearly the safe as llvms. +- **Simple start**: You can easily start with ygen. You do not need to install any dlls, or build it. Ygen also has many simple examples. > [!WARNING] > This project is still early in its developement. Bugs and miscompilations are expected.
@@ -35,26 +35,44 @@ use Ygen::prelude::*; pub fn main() -> Result<(), Box> { 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 + func.extrn(); - let entry = func.addBlock("entry"); - builder.positionAtEnd(entry); + func.addBlock("entry"); - let val = builder.BuildAdd(ty.arg(0), ty.arg(1)); - builder.BuildRet( val ); + let val = func.BuildAdd(ty.arg(0), ty.arg(1)); + + func.BuildRet( val ); - module.verify().print(); + module.verify()?; - eprintln!("{}", - module.dumpColored() - ); + // prints out the ir of the module + println!("{}", module.dump()); + + let triple = Triple::host(); + + // compiles the module in the host assembly and saves it in the specified path + module.emitToAsmFile( + triple, + &mut initializeAllTargets(triple)?, + Path::new("out.asm") + )?; + + // compiles the module to a host object file + module + .emitMachineCode( + triple, + &mut initializeAllTargets(triple)?, + false // is debugging metadata enabled + )?.0.emit( + OpenOptions::new().write(true).create(true).open("out.o")?, + None // if debugging metadata is enabled here is the outputed metadata + )?; Ok(()) } @@ -68,20 +86,10 @@ define i32 @add( i32 %0, i32 %1 ) { } ``` -You can add following lines (you need to include `std::fs::Path`) to compile the IR down to assembly: -```Rust -module.emitToAsmFile( - Triple::host(), - &mut initializeAllTargets(Triple::host())?, - Path::new("out.asm") -)?; -``` - ### Support -Ygen currently supports following architectures -|Name |Full ir |Full isa| -|--------|--------|--------| -| x64 | Yes | No| +Ygen currently supports following architectures: + - `x86-64` + - `wasm` [WIP] ### Copyright This project is owned by Cr0a3 and licensed under the Apache2 License