Home

Awesome

llvm-cbe

This LLVM C backend has been resurrected by Julia Computing with various improvements.

Installation instructions

This version of the LLVM C backend works with LLVM 19, for older versions please check the tags.

Step 1: Installing LLVM

Either install the LLVM packages on your system:

On macOS, use pkgsrc and run the following commands:

    ~$ pkgin in llvm clang ninja-build

On CentOS, install the llvm-devel package:

    ~# dnf install llvm-devel clang ninja-build

On Debian and derivatives, install the llvm-dev package via:

    ~# apt install llvm-dev clang ninja-build

Note: this project uses LLVM 19, so make sure that the package manager is installing it and not some other version. At the time of writing, Ubuntu installs version 14.

Or compile LLVM yourself:

Note: to convert C to LLVM IR to run the tests, you will also need a C compiler using the LLVM infrastructure, such as clang.

The first step is to compile LLVM on your machine (this assumes an in-tree build, but out-of-tree will also work):

     ~$ git clone https://github.com/llvm/llvm-project.git
     ~$ cd llvm-project
     llvm-project$ git checkout tags/19.1.1
     llvm-project$ mkdir llvm/build
     llvm-project$ cd llvm/build
     build$ cmake .. -G "Ninja" -DCMAKE_BUILD_TYPE=Debug -DLLVM_PARALLEL_LINK_JOBS=1
     build$ ninja

To run tests, you need to build lli.

Step 2: Compiling LLVM-CBE

Now you can download and compile llvm-cbe.

If you built LLVM yourself, put it in the same folder you built LLVM in:

    ~$ cd llvm-project/llvm/projects
    projects$ git clone https://github.com/JuliaHubOSS/llvm-cbe
    projects$ cd ../build
    build$ cmake -S .. -G "Ninja"
    build$ ninja llvm-cbe

If you used your distribution's package, put it wherever you feel like:

    ~$ git clone https://github.com/JuliaHubOSS/llvm-cbe
    ~$ cd llvm-cbe && mkdir build && cd build
    build$ cmake -S .. -G "Ninja"
    build$ ninja llvm-cbe

Step 3: Usage Examples

If llvm-cbe compiles, you should be able to run it with the following commands.

    llvm-cbe$ cd test/selectionsort
    selectionsort$ ls
    main.c
    selectionsort$ clang-19 -S -emit-llvm -g main.c
    selectionsort$ ls
    main.c main.ll
    selectionsort$ ../../build/tools/llvm-cbe/llvm-cbe main.ll

You can find options to configure the C backend's output with llvm-cbe --help. Look for options beginning with --cbe-.

Compile Generated C Code and Run

    selectionsort$ gcc -o main.cbe main.cbe.c
    selectionsort$ ls
    main.c  main.cbe  main.cbe.c  main.ll
    selectionsort$ ./main.cbe

Running tests

Unit tests:

    llvm-project$ cd llvm/build
    build$ make CBEUnitTests && projects/llvm-cbe/unittests/CWriterTest

Note that you need to have passed -DLLVM_INCLUDE_TESTS=1 to cmake if you used your distribution's LLVM package. You also will need to install gtest (on Debian derivatives: apt install libgtest-dev).

Other tests:

First, compile llvm-cbe, and install pytest (e.g. pip install pytest). Then:

    llvm-cbe$ pytest

You might have to adjust the llvm-cbe and lli paths in that configuration.

If you want the tests to run faster, installing pytest-xdist will allow you to run the test suite in parallel, e.g. pytest -n 4 if you want to use 4 cores.

FAQ: Version Update Policy

The policy of this project is to only support latest released version of LLVM on the head of repo here. The rationale is that supporting multiple versions is additional work for a project which has no sponsors. Additionally, since there are very few changes, other than version compatibility maintenance, anyone using an older version of LLVM can just checkout the last commit to work on that branch. For discussion, see https://github.com/JuliaHubOSS/llvm-cbe/issues/60.