C compiler based on QBE (original) (raw)

(mirrored on GitHub and Codeberg)

builds.sr.ht status

cproc is a C compiler using QBE as a backend, released under theISC license. It implements most of C11 as well as many C23features. Additionally, it implements a few GNU C extensions.

It is currently able to build a lot of C software, though occasionally requires small patches to fix C conformance issues.

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

#Goals

cproc aims to closely follow the C standard, but also to be a practical tool able compile many real-world software packages. Sometimes, these goals can be at ends with each other, since there is a lot of non-conforming C code out there.

The main philosophy regarding C extensions is this:

By following these guidelines, hopefully cproc can help shrink the gap between what's required to implement the C specification and what's required to compile real C software.

cproc does not implement multiple versions of C. Instead, code affected by breaking changes in new C versions (such as the new keywords introduced in C23) must be updated or patched to be compatible with the new version.

#Requirements

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

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

At runtime, you will need QBE, an assembler, and a linker for the target system. Since the preprocessor is not fully implemented, an external one is currently required as well.

#Supported targets

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

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

#Building

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 *[]):

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

Once this is done, you can build with

make

#Bootstrap

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.

#What's missing

#C11

#C23

See C23 for a detailed breakdown of the language-level changes from C11 to C23 as well as their current status. Notably, the following are not yet implemented:

#GNU C extensions

#Mailing list

There is a mailing list at ~mcf/cproc@lists.sr.ht. Feel free to use it for general discussion, questions, patches, or bug reports (if you don't have an sr.ht account).

If you don't hear a response, please don't hesitate to bump your thread.

#Issue tracker

Please report any issues to ~mcf/cproc@todo.sr.ht.

#Contributing

Patches are greatly appreciated. Send them to the mailing list (preferred), or as pull-requests on the Codeberg mirror.