-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
1 changed file
with
79 additions
and
6 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,12 +1,85 @@ | ||
http://vxcc.vxcc.dev/ | ||
# VXCC | ||
optimizing, small, simple, compiler backend. | ||
|
||
# building | ||
use the `./build.sh` | ||
VXCC uses SSA IR with block arguments instead of the commonly used phi-nodes. | ||
|
||
## deps | ||
## compilation stages | ||
- frontend generates non-SSA IR | ||
- backend converts it to SSA | ||
- backend applies optimizations | ||
- backend converts it to "LL IR" (non-SSA + labels) and performs some more optimizations | ||
- simple code generation | ||
|
||
## goals | ||
- easily modifyable and readable code | ||
- not much special knowladge required | ||
- easy to implement code generation for any architecture | ||
- make it easy for people to learn about compiler backends | ||
- good-ish optimizations | ||
- beat QBE | ||
|
||
## **non**-goals | ||
- reach complexity of GCC or even LLVM | ||
- beat GCC or LLVM | ||
|
||
## frontends | ||
- [C3](https://c3-lang.org/) compiler [fork](https://github.com/alex-s168/c3c) | ||
|
||
## current status | ||
| goal | | progress | | ||
| --------------------------------------- | - | -------- | | ||
| x86 codegen | ![#33cc33](https://placehold.co/15x15/33cc33/33cc33.png) | done but will be re-made | | ||
| codegen of basic code involving loops | ![#33cc33](https://placehold.co/15x15/33cc33/33cc33.png) | done | | ||
| basic optimizations | ![#33cc33](https://placehold.co/15x15/33cc33/33cc33.png) | done | | ||
| struct support | ![#ff9900](https://placehold.co/15x15/ff9900/ff9900.png) | soon | | ||
| proper register allocator & ISEL rework | ![#ff9900](https://placehold.co/15x15/ff9900/ff9900.png) | soon | | ||
| floating point numbers | ![#cc0000](https://placehold.co/15x15/cc0000/cc0000.png) | planned | | ||
|
||
## building | ||
use the `./build.sh build` | ||
|
||
## compile dependencies | ||
`clang`: different C compiler can be used by doing `CC=someothercc ./build.sh [build|test]` (`test` can be executed after `build` to run all tests) | ||
|
||
`python3`: it is recommended to create a venv in the repository root using `python -m venv venv` | ||
|
||
## include into projects | ||
Link with `build/lib.a` and `build/x86.a` | ||
## including into projects | ||
Link with all files returned by `./build.sh libfiles` (at time of writing, `build/lib.a` and `allib/build/all.a`) | ||
|
||
## using VXCC in a compiler | ||
this is meant to be extremely easy to do (for the frontend developer) | ||
|
||
currently there is no documentation, but you can look at the [C3C fork](https://github.com/alex-s168/c3c) in the `src/compiler/vxcc_*` files. | ||
|
||
If you have any questions, you can ask me on Discord (`alex_s168`) or send me an [E-Mail](mailto:[email protected]) | ||
|
||
## contributing | ||
all contributions are welcome! Don't hesitate to ask me if you have any questions. | ||
|
||
## current optimizations | ||
|
||
|
||
## code-gen example | ||
input: | ||
```c | ||
fn void strcpy(char* dest, char* src) @export | ||
{ | ||
for (usz i = 0; src[i] != '\0'; i ++) | ||
dest[i] = src[i]; | ||
} | ||
``` | ||
output: | ||
```asm | ||
strcpy: | ||
xor r11d, r11d | ||
.l0: | ||
mov r9b, byte [rsi + 1 * r11] | ||
test r9b, r9b | ||
je .l1 | ||
mov byte [rdi + 1 * r11], r9b | ||
lea r8, [r11 + 1] | ||
mov r11, r8 | ||
jmp .l0 | ||
.l1: | ||
ret | ||
``` |