Michael Forney f0465801c1 Fix non-adjacent bit-fields 1 week ago
.builds Need doas to patch /usr/include/amd64/endian.h 2 weeks ago
doc Update sbase notes, fix was applied upstream 3 weeks ago
qbe @ 1f87c9c943 Sync qbe submodule 3 weeks ago
test Fix non-adjacent bit-fields 1 week ago
.gitignore Initial import 4 months ago
.gitmodules Add qbe submodule to make it easy to build 1 month ago
LICENSE Clarify origin of tree.c 1 month ago
Makefile Add qbe submodule to make it easy to build 1 month ago
README.md Mention GitHub mirror at the top of README 4 weeks ago
arg.h arg: Use (void *)0 instead of NULL in error case of conditional expression 2 months ago
cc.h Add __attribute__ keyword 3 weeks ago
configure configure: Add some defines necessary for OpenBSD 2 weeks ago
decl.c Fix non-adjacent bit-fields 1 week ago
driver.c driver: Avoid pipe2 for now, it is not yet standardized 4 weeks ago
eval.c eval: Collapse & and * operators in integer constant expressions 4 weeks ago
expr.c eval: Keep track of kind of constant expression we are evaluating 1 month ago
init.c init: Allow string literal initializers to be in braces 1 month ago
main.c Fix progname fallback 1 month ago
map.c map: Free old key and value arrays when resizing 1 month ago
ops.h Use instruction op for varargs call instead of "ellipsis" value 3 months ago
pp.c Add __attribute__ keyword 3 weeks ago
qbe.c Temporarily avoid %a when printing floating constants 2 weeks ago
runtests tests -> test 2 months ago
scan.c scan: Handle EOF in comments, character constants, and string literals 1 month ago
scope.c Merge map.h and tree.h into util.h 2 months ago
siphash.c Initial import 4 months ago
stmt.c stmt: continue in do-loop should evaluate controlling expression 1 month ago
token.c Add __asm__ keyword 1 month ago
tree.c Merge map.h and tree.h into util.h 2 months ago
type.c Remove incorrect type equality check in usual arithmetic conversions 1 month ago
util.c Fix nested arrays 4 months ago
util.h Merge map.h and tree.h into util.h 2 months ago


(mirrored on GitHub)

builds.sr.ht status

This is a C11 compiler using QBE as a backend. It is released under the ISC license.

Several GNU C extensions are also implemented.

There is still much to do, but it currently implements most of the language and is capable of building software including itself, mcpp, gcc 4.7, binutils, and more.

It was inspired by several other small C compilers including 8cc, c, lacc, and scc.


The compiler itself is written in standard C11 and can be built with any conforming C11 compiler.

The POSIX driver depends on POSIX.1-2008 interfaces, and the Makefile requires a POSIX-compatible make(1).

At runtime, you will need QBE, an assembler, and a linker for the target system. Currently, my personal QBE branch is recommended, since it may address some issues that have not yet made it upstream. Since the preprocessor is not yet implemented, an external one is currently required as well.

Supported targets

All architectures supported by QBE should work (currently x86_64 and aarch64).

The following targets are tested by the continuous build and known to bootstrap and pass all tests:

  • x86_64-linux-musl
  • x86_64-linux-gnu
  • x86_64-freebsd
  • aarch64-linux-musl
  • aarch64-linux-gnu


Run ./configure to create a config.h and config.mk appropriate for your system. If your system is not supported by the configure script, you can create these files manually. config.h should define several string arrays (static char *[]):

  • startfiles: Objects to pass to the linker at the beginning of the link command.
  • endfiles: Objects to pass to the linker at the end of the link command (including libc).
  • preprocesscmd: The preprocessor command, and any necessary flags for the target system.
  • codegencmd: The QBE command, and possibly explicit target flags.
  • assemblecmd: The assembler command.
  • linkcmd: The linker command.

You may also want to customize your environment or config.mk with the appropriate CC, CFLAGS and LDFLAGS.

If you don't have QBE installed, you can build it from the included submodule (NOTE: BSD users will need to use gmake here), then add it to your PATH so that the driver will be able to run it.

make qbe

Once this is done, you can build with



The Makefile includes several other targets that can be used for bootstrapping. These targets require the ability to run the tools specified in config.h.

  • stage2: Build the compiler with the initial (stage1) output.
  • stage3: Build the compiler with the stage2 output.
  • bootstrap: Build the stage2 and stage3 compilers, and verify that they are byte-wise identical.

What's missing

  • Digraph and trigraph sequences (6.4.6p3 and, will not be implemented).
  • Wide string literals and character constants (#35 and #36).
  • Variable-length arrays (#1).
  • volatile-qualified types (#7).
  • _Thread_local storage-class specifier (#5).
  • long double type (#3).
  • Inline assembly (#5).
  • Preprocessor (#6).
  • Generation of position independent code (i.e. shared libraries, modules, PIEs).

Issue tracker

Please report any issues to https://todo.sr.ht/~mcf/cc-issues.


Send patches to me (address in commit log), or pull-requests on the GitHub mirror. Once I decide on a project name, a mailing list will be created, which will then become the preferred form of contribution.