(mirrored on GitHub and Codeberg)

cproc is a C compiler using QBE as a backend, released under the
ISC license. It implements most of C11 as well as many C23
features. 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 Makefile
requires 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-musl
x86_64-linux-gnu
x86_64-freebsd
aarch64-linux-musl
aarch64-linux-gnu
riscv64-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 the stage2 output.
bootstrap: Build the stage2 and stage3 compilers, 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 double type (#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:
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/[email protected]. 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/[email protected].
Contributing
Patches are greatly appreciated. Send them to the mailing list
(preferred), or as pull-requests on the Codeberg mirror.
评论