A toy C compiler written in Rust.
LLVM should be installed in your system.
The version of LLVM to be used can be specified by changing features
of inkwell
crate in Cargo.toml
.
$ cargo run -- help
Usage: rcc <COMMAND>
Commands:
preprocess View the preprocessing result of a source file
lex View the lexical analysis result of a source file
syntax View the syntax analysis result of a source file
semantic View the semantic analysis result of a source file
compile-binary Generate binary from a source file
compile-assembly Generate assembly from a source file
help Print this message or the help of the given subcommand(s)
Options:
-h, --help Print help
-V, --version Print version
Let's generate some fibonacci numbers!
int fib(int n) {
if (n == 1) return 1;
if (n == 2) return 1;
return fib(n - 1) fib(n - 2);
}
We will use rcc
to compile assets/fib.c
(which contains a simple fibonacci function)
to out/fib.o
, and then use clang
to compile assets/fib_main.c
(which reads
an integer n
, then print the result of our fib(n)
and a reference fib_ref(n)
) ,
then link out/fib.o
, and finally produce out/fib_main
.
mkdir -p out
cargo run -r -- compile-binary assets/fib.c out/fib.o
clang assets/fib_main.c out/fib.o -o out/fib_main
Try some n
:
$ ./out/fib_main
Calculate fibonacci sequence to: 42
Reference Fib(42) = 267914296
rcc Fib(42) = 267914296