https://github.com/pku-minic/koopa
  
  
    Library for generating/parsing/optimizing Koopa IR. 
    https://github.com/pku-minic/koopa
  
compiler ir
        Last synced: 6 months ago 
        JSON representation
    
Library for generating/parsing/optimizing Koopa IR.
- Host: GitHub
 - URL: https://github.com/pku-minic/koopa
 - Owner: pku-minic
 - License: gpl-3.0
 - Created: 2021-07-28T02:57:50.000Z (over 4 years ago)
 - Default Branch: master
 - Last Pushed: 2024-03-24T02:55:53.000Z (over 1 year ago)
 - Last Synced: 2024-04-24T20:26:35.870Z (over 1 year ago)
 - Topics: compiler, ir
 - Language: Rust
 - Homepage:
 - Size: 766 KB
 - Stars: 83
 - Watchers: 1
 - Forks: 10
 - Open Issues: 0
 - 
            Metadata Files:
            
- Readme: README.md
 - Changelog: CHANGELOG.md
 - License: LICENSE
 
 
Awesome Lists containing this project
README
          # Koopa
[
](https://github.com/pku-minic/koopa)
[
](https://crates.io/crates/koopa)
[
](https://docs.rs/koopa)
[
](https://github.com/pku-minic/koopa/actions?query=branch%3Amaster)
Library for generating/parsing/optimizing Koopa IR.
Koopa IR is the next generation of education-oriented intermediate representation designed for compiler courses at Peking University.
## Usage
```
cargo add koopa
```
## Koopa IR
Here is a "Hello, world!" program in Koopa IR:
```koopa
// `putchar` function in libc.
decl @putchar(i32): i32
// A helper function for printing strings (integer arrays).
fun @putstr(@arr: *i32) {
%entry:
  jump %loop_entry(@arr)
%loop_entry(%ptr: *i32):
  %cur = load %ptr
  br %cur, %loop_body, %end
%loop_body:
  call @putchar(%cur)
  %next = getptr %ptr, 1
  jump %loop_entry(%next)
%end:
  ret
}
// String "Hello, world!\n\0".
global @str = alloc [i32, 15], {
  72, 101, 108, 108, 111, 44, 32, 119, 111, 114, 108, 100, 33, 10, 0
}
// `main` function, the entry point of the program.
fun @main(): i32 {
%entry:
  %str = getelemptr @str, 0
  call @putstr(%str)
  ret 0
}
```
Koopa IR is a strongly-typed, SSA form based intermediate representation. It's simple but powerful enough to support compilation of code into machine instructions, or some advanced optimizations of it.
For more details, see [the document of Koopa IR](https://pku-minic.github.io/online-doc/#/misc-app-ref/koopa) (Chinese).
## Examples
See the [`examples` directory](examples), which contains three examples:
* [`opt`](examples/opt): a simple Koopa IR optimizer.
* [`brainfuck`](examples/brainfuck): a brainfuck to Koopa IR compiler.
* [`interpreter`](examples/interpreter): a simple Koopa IR interpreter.
And there are some more complex examples:
* [`kira-rs`](https://github.com/pku-minic/kira-rs): The Kira compiler (Rust version), which compiles SysY language into Koopa IR and RISC-V assembly.
* [`kira-cpp`](https://github.com/pku-minic/kira-cpp): The Kira compiler (C++ version).
## References
Koopa IR library is heavily influenced by [LLVM](https://llvm.org/) and [Cranelift](https://wasmtime.dev/).
## Changelog
See [CHANGELOG.md](CHANGELOG.md).
## License
Copyright (C) 2010-2024 MaxXing. License GPLv3.