C compiler based on QBE (original) (raw)
(mirrored on GitHub and Codeberg)
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:
- If the code could be made portable with some small tweaks that do not affect performance or readability, then the code should be patched accordingly.
- Only when an extension is widely used and cannot be easily transformed into a portable equivalent is it considered for implementation. Ideally, it should also be accompanied with a proposal to WG14 so that its semantics are well specified.
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:
x86_64-linux-muslx86_64-linux-gnux86_64-freebsdaarch64-linux-muslaarch64-linux-gnuriscv64-linux-gnu
#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 *[]):
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.
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.
stage2: Build the compiler with the initial (stage1) output.stage3: Build the compiler with thestage2output.bootstrap: Build thestage2andstage3compilers, and verify that they are byte-wise identical.
#What's missing
- Digraph sequences (6.4.6p3, will not be implemented).
volatile-qualified types (#7, requires qbe support).long doubletype (#3, requires qbe support).- The preprocessor is not fully implemented (#6).
- Generation of position independent code (i.e. shared libraries, modules, PIEs).
#C11
- Complex types (optional).
- Atomic types (optional).
#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:
constexprauto#embed
#GNU C extensions
- Inline assembly (#5, requires qbe support).
- Statement expressions (#20, unlikely to be implemented without specification and WG14 acceptance).
#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.