Skip to content
/ slimcc Public

C11 compiler with GNU extensions for x86-64 Linux, working towards C23

License

Notifications You must be signed in to change notification settings

fuhsnn/slimcc

Repository files navigation

This is a fork of Rui Ueyama's chibicc with fixes and improvements, including:

  • C99 features: VLA parameters, VLA de-allocation, K&R old-style funtions.
  • C11 features: _Static_assert(), over-aligned locals, _Generic with qualifiers.
  • C23 features: constexpr, #embed, auto type-inferrence, etc.
  • GNU features: cleanup
  • Basic optimizations.

If you're just looking for "chibicc-with-only-fixes-to-build-stuff" checkout widcc.

Project goal

  • Compile correct code correctly.
  • Code readability.
  • Build real world projects, test with their suites.
  • Implement GNU extensions and C23 features if doable.
  • Match GCC / Clang's behavior when possible.

Building & Running

  • Should just work on recent glibc-based (2.28+) x86-64 Linux. Also see porting
  • Test script needs bash; depending on the distro, file and/or glibc-static packages may be required.
git clone --depth 1 https://github.com/fuhsnn/slimcc
cd slimcc
make test-stage2 -j

Run it in base directory like CC=~/slimcc/slimcc.

What can it build?

I regularly keep up with latest versions of Curl, Git, Python, PostgreSQL, Sqlite, Vim etc.

Check out widcc's list for detailed build scripts.

Can it pass csmith?

1M tests were run with --no-packed-struct flag, all issues found were fixed.

How optimized are the generated binaries?

The codegen strategy is matching AST nodes to hard-coded assembly snippets and glue them with data movements.

Some optimizations can be made with this by pattern-matching to smarter alternatives, I apply them when effective and don't mess up readability.

Compare size of chibicc binary built with several compilers:

      text       data        bss      total filename
    112363      43987        616     156966 gcc_O0_build
    113867      43156        504     157527 clang_O0_build
    131947      31913        456     164316 slimcc_build
    144896      29536        440     174872 tcc_build
    263659      41163        456     305278 chibicc_build

In general, code size is on par with TinyCC but execute 30% slower. Much work to be done!

Porting

musl linux and BSDs should be doable. Check hard-coded paths in main.c, and pre-defined macros in preprocessor.c. The biggest obstacle would be GNU inline assembly in some headers. Which is not supported yet.

The widcc branch is a less noisy codebase than slimcc that should be more appealing for developers to hack on.

About

C11 compiler with GNU extensions for x86-64 Linux, working towards C23

Topics

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published