Skip to content
Please note that GitHub no longer supports Internet Explorer.

We recommend upgrading to the latest Microsoft Edge, Google Chrome, or Firefox.

Learn more
A minimalist C compiler with x86_64 code generation
C C++ Shell Makefile
Branch: master
Clone or download
wywh0917 and jserv Introduce GCC style -o option and allow source from stdin (#19)
After this change, the user does not need to redirect the stdin and
stdout. That is, the original usage looks like:

              ./mzcc < input.c > output.S

After this change, we can pass -o option as gcc does:

              ./mzcc -o output.S input.c

Also, we can use option '-' to use standard input.
Latest commit b3b85c6 Jan 22, 2020
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
sample Initial import of MazuCC Apr 21, 2019
tests Introduce GCC style -o option and allow source from stdin (#19) Jan 22, 2020
.clang-format Add foreachMacro support into clang-format Jun 28, 2019
.gitignore
LICENSE Initial import of MazuCC Apr 21, 2019
Makefile
README.md Introduce GCC style -o option and allow source from stdin (#19) Jan 22, 2020
codegen_x64.c Introduce GCC style -o option and allow source from stdin (#19) Jan 22, 2020
dict.h Remove free_imple Jun 17, 2019
lexer.c Deal with memory leak for list iterator and string Jun 15, 2019
list.h
main.c Introduce GCC style -o option and allow source from stdin (#19) Jan 22, 2020
mzcc.h
parser.c Remove free_imple Jun 17, 2019
util.h Fix cstring record point Jun 16, 2019
verbose.c Deal with memory leak for list iterator and string Jun 15, 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

Alternatively, MazuCC accepts the stream from standard input. The equivalent form for the above command is:

$ cat sample/nqueen.c | ./mzcc -

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

$ ./mzcc -o sample/nqueen.s sample/nqueen.c
$ 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.