Skip to content
/ xcc Public

Standalone C compiler/assembler/linker/libc for x86-64/aarch64/riscv64/wasm

License

Notifications You must be signed in to change notification settings

tyfkda/xcc

Repository files navigation

XCC

Action Status Open in Gitpod

C compiler running on Linux or MacOS.

  • Supporting architecture: x86-64, aarch64 (arm64), riscv64, wasm
  • Binary format: ELF64

Requirements

  • Linux (or MacOS)
  • C compiler (gcc or clang)
  • make

Build

$ make

Generated files:

  • xcc: Compiler entry
  • cpp: Preprocessor
  • cc1: C compiler
  • as: Assembler
  • ld: Linker

Usage

$ ./xcc -o hello examples/hello.c
$ ./hello
Hello, world!

Command line options

  • -o <filename>: Set output filename (default: a.out)
  • -I <path>: Add include path
  • -D <label>(=value): Define macro
  • -S: Output assembly code
  • -E: Preprocess only
  • -c: Output object file
  • -nodefaultlibs: Ignore libc
  • -nostdlib: Ignore libc and crt0

TODO

  • Optimization
  • Archiver

Reference


WebAssembly

Compile C to WebAssembly/WASI binary.

Online demo

Requirements

  • node.js, npm
  • llvm-ar

Set up

$ npm ci

Build

$ make wcc

Generated files:

  • wcc: C compiler (including preprocessor, and output .wasm directly)

Usage

Compile:

$ ./wcc -o hello.wasm examples/hello.c

Command line options:

  • -o <filename>: Set output filename (default: a.wasm)
  • -I <path>: Add include path
  • -D <label>(=value): Define macro
  • -E: Preprocess only
  • -c: Output object file
  • --entry-point=func_name: Specify entry point (default: _start)
  • -e func_name,...: Export function names (comma separated)
  • --stack-size=<size>: Set stack size (default: 8192)
  • -nodefaultlibs: Ignore libc
  • -nostdlib: Ignore libc and crt0
  • --verbose: Output debug information

Run

$ ./tool/runwasi hello.wasm
Hello, world!

You can also use WASM/WASI runtime (Wasmtime, Wasmer, etc.), too.

Missing features

  • goto statement