Saltwater
saltwater: the part of the sea causing lots of rust
A C compiler written in Rust, with a focus on good error messages.
Running
swcc
reads from standard in by default, so you can type in code directly.
It's not interactive though, you have to hit Ctrl+D to indicate end of file (Ctrl+Z on Windows).
Use swcc --help
for all options (or see below).
Running on Windows
You need to have cc
on your PATH. You can either install mingw + gcc or MSVC.
Other than that, it should work exactly the same as on Linux.
Homebrew
brew install saltwater
Unimplemented features
- Defining functions taking variadic arguments. Note that calling variadic functions (like
printf
) is already supported. - Variable-length arrays (
int a[n]
) - Multiple translation units (files)
- Bitfields
- Compiling on non-x86 platforms
- Cross-compilation
Examples
$ cat tests/runner-tests/readme.c
// output: j is 6
int ;
typedef struct s *sp;
int i = 1;
int a = ;
float f = 2.5;
my_struct;
int ;
int
int
$ swcc tests/runner-tests/readme.c
$️ ./a.out
j is 6
Debug output
$ cat tests/runner-tests/cpp/if/defined.c
// code: 2
int i = 2;
syntax
int
$ swcc -E tests/runner-tests/cpp/if/defined.c
int i = 2 ; int
$ echo 'int i = 1 + 2 ^ 3 % 5 / 2 & 1; int main(){}' | swcc --debug-ast
ast: int i = ^ ;
ast: int
$ cat tests/runner-tests/hello_world.c
int
$ swcc --debug-ir tests/runner-tests/hello_world.c
function u0:0 -> i32 system_v
$ ./a.out
Hello, world!
All options
$ swcc --help
swcc 0.9.0
Joshua Nelson <jyn514@gmail.com>
A C compiler written in Rust, with a focus on good error messages.
Homepage: https://github.com/jyn514/rcc/
usage: swcc [FLAGS] [OPTIONS] [<file>]
FLAGS:
--debug-ast If set, print the parsed abstract syntax tree (AST) in addition to compiling.
The AST does no type checking or validation, it only parses.
--debug-hir If set, print the high intermediate representation (HIR) in addition to compiling.
This does type checking and validation and also desugars various expressions.
--debug-ir If set, print the intermediate representation (IR) of the program in addition to compiling.
--debug-lex If set, print all tokens found by the lexer in addition to compiling.
--jit If set, will use JIT compilation for C code and instantly run compiled code (No files produced).
NOTE: this option only works if swcc was compiled with the `jit` feature.
-h, --help Prints help information
-c, --no-link If set, compile and assemble but do not link. Object file is machine-dependent.
-E, --preprocess-only If set, preprocess only, but do not do anything else.
Note that preprocessing discards whitespace and comments.
There is not currently a way to disable this behavior.
-V, --version Prints version information
OPTIONS:
--color <when> When to use color. May be "never", "auto", or "always". [default: auto]
-o, --output <output> The output file to use. [default: a.out]
--max-errors <max> The maximum number of errors to allow before giving up.
Use 0 to allow unlimited errors. [default: 10]
-I, --include <dir> Add a directory to the local include path (`#include "file.h"`).
Can be specified multiple times to add multiple directories.
-D, --define <id[=val]> Define an object-like macro.
Can be specified multiple times to add multiple macros.
`val` defaults to `1`.
ARGS:
<file> The file to read C source from. "-" means stdin (use ./- to read a file called '-').
Only one file at a time is currently accepted. [default: -]
Testing
# optionally, you can fuzz the compiler
# it may be more helpful to just `grep -R unimplemented src`, though
# libFuzzer/AFL
# Honggfuzz:
# Running Honggfuzz locally requires some parameters to use it at its full potential,
# so it is probably a good idea to have a look here: https://github.com/rust-fuzz/honggfuzz-rs/blob/master/README.md
# and here: https://github.com/google/honggfuzz/blob/master/docs/USAGE.md
# we suggest the following:
HFUZZ_RUN_ARGS="--tmout_sigvtalrm --exit_upon_crash"
FAQ
See FAQ.md
Implementation Defined Behavior
Contributing
See CONTRIBUTING.md. This also includes reporting bugs.