Skip to content
A minimalist C compiler with x86_64 code generation
Branch: master
Clone or download
jserv Merge pull request #5 from lecopzer/master
Makefile: silent compiling message for test
Latest commit 7a3f4b7 May 10, 2019
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
sample
tests Add left/right shift operator support (#3) May 8, 2019
.clang-format Initial import of MazuCC Apr 21, 2019
.gitignore Exclude generated configuration file May 8, 2019
LICENSE Initial import of MazuCC Apr 21, 2019
Makefile Merge pull request #5 from lecopzer/master May 10, 2019
README.md Improve AST example Apr 23, 2019
codegen_x64.c Add left/right shift operator support (#3) May 8, 2019
dict.h
lexer.c Indent with clang-format May 8, 2019
list.h Remove unused code Apr 23, 2019
main.c Initial import of MazuCC Apr 21, 2019
mzcc.h Indent with clang-format May 8, 2019
parser.c Add left/right shift operator support (#3) May 8, 2019
util.h Remove unused code Apr 23, 2019
verbose.c Add helper function for private data in Token Apr 26, 2019

README.md

MazuCC

MazuCC is a minimalist C compiler with x86_64 code generation. It is intended to support partial C99 language features while keeping the code as small and simple as possible.

Build

Run make to build:

$ make

MazuCC comes with unit tests. To run the tests, give "check" as an argument:

$ make check

MazuCC is known to work on both GNU/Linux and macOS.

Use MazuCC to compile C source:

$ ./mzcc < sample/nqueen.c

You will get the generated x86_64 assembly in AT&T syntax. The output can be assembled and linked into a valid executable:

$ ./mzcc < sample/nqueen.c > sample/nqueen.s
$ gcc -no-pie -o sample/nqueen sample/nqueen.s

If MazuCC is compiled and executed on macOS, the above argument -no-pie should be eliminated.

Reference output of MazuCC-compiled sample/nqueen:

Q . . . . . . .
. . . . Q . . .
. . . . . . . Q
. . . . . Q . .
. . Q . . . . .
. . . . . . Q .
. Q . . . . . .
. . . Q . . . .

Alternatively, you can dump internal abstract syntax tree:

echo 'struct {int x; char y; struct { int t; } z; } a;' | ./mzcc --dump-ast

The expected output in S-expression form:

(decl (struct (int)
              (char)
              ((struct (int)))) a)

Acknowledge

MazuCC is heavily inspired by 8cc.

License

MazuCC is freely redistributable under the BSD 2 clause license. Use of this source code is governed by a BSD-style license that can be found in the LICENSE file.

You can’t perform that action at this time.