How to Enable LLVM JIT Support When Building bpftime: A Complete Guide
Set the CMake flag -DBPFTIME_LLVM_JIT=ON during configuration to enable the high-performance LLVM JIT backend, which serves as the default eBPF execution engine in bpftime.
The bpftime project provides a userspace eBPF runtime that supports multiple JIT compilation backends. Enabling LLVM JIT support when building bpftime unlocks the primary high-performance execution engine, which compiles eBPF bytecode to native machine code using the LLVM infrastructure. This guide explains the BPFTIME_LLVM_JIT configuration flag and the exact build steps required to compile bpftime with LLVM JIT support enabled.
Understanding the BPFTIME_LLVM_JIT Configuration Flag
The LLVM JIT backend is controlled by the BPFTIME_LLVM_JIT CMake option, which determines whether the build system compiles and links the LLVM-based VM or falls back to the uBPF interpreter.
Where the Flag is Defined
According to the bpftime source code, the flag is declared in cmake/StandardSettings.cmake at line 10 as a Boolean option that defaults to ON:
option(BPFTIME_LLVM_JIT "Enable LLVM JIT support" ON)
How the Flag Propagates Through the Build System
When BPFTIME_LLVM_JIT is enabled, the configuration cascades through multiple CMake files:
-
Runtime activation – In
runtime/CMakeLists.txtat line 127, the build system defines theBPFTIME_LLVM_JIT=1preprocessor macro and adds the LLVM VM target to the runtime dependencies. -
VM compilation – The actual LLVM-based VM implementation resides in
vm/compat/llvm-vm/CMakeLists.txt, which builds thebpftime_llvm_vmlibrary and links against thellvmbpfsubmodule. -
Static library handling – For static library builds, the root
CMakeLists.txtaround line 197 adds the LLVM VM objects to the static archive via thebpftime_add_static_lib_component_commandmacro.
Prerequisites for Building with LLVM JIT
Before configuring the build, ensure your system meets the following requirements:
- LLVM version 15 or higher – The JIT backend requires LLVM libraries and headers.
- Development tools – Install
clang,llvm-config, and LLVM development packages. - Standard build tools – CMake (3.15+), a C++17-compatible compiler, and
makeorninja.
On Ubuntu/Debian systems, install dependencies with:
sudo apt-get install clang llvm llvm-dev libboost-all-dev cmake make git
Step-by-Step Build Instructions
Basic Release Build with LLVM JIT
Since BPFTIME_LLVM_JIT defaults to ON, a standard configuration automatically enables LLVM JIT:
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DBPFTIME_LLVM_JIT=ON
cmake --build build --config Release --target install
To explicitly verify the configuration, check the CMake output for lines indicating LLVM VM compilation.
Custom LLVM Installation Paths
If LLVM is installed in a non-standard location, point CMake to the LLVM CMake configuration:
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DBPFTIME_LLVM_JIT=ON \
-DLLVM_DIR=/usr/local/lib/cmake/llvm
Building Static Libraries with LLVM JIT
To create a static library that includes the LLVM JIT components:
cmake -B build \
-DCMAKE_BUILD_TYPE=Release \
-DBPFTIME_LLVM_JIT=ON \
-DBPFTIME_BUILD_STATIC_LIB=ON
cmake --build build --target install
The root CMakeLists.txt handles embedding the LLVM VM objects into the static archive via bpftime_add_static_lib_component_command around line 197.
Disabling LLVM JIT (uBPF Fallback)
To explicitly disable LLVM JIT and use the uBPF interpreter instead:
cmake -B build -DBPFTIME_LLVM_JIT=OFF
When disabled, the build skips the vm/compat/llvm-vm directory and links only the uBPF backend.
Summary
- The
BPFTIME_LLVM_JITCMake option (defined incmake/StandardSettings.cmakeline 10) controls whether bpftime compiles with LLVM JIT support, defaulting toON. - Enabling the flag activates the LLVM VM target in
runtime/CMakeLists.txt(line 127), compiles thebpftime_llvm_vmlibrary fromvm/compat/llvm-vm/CMakeLists.txt, and links thellvmbpfsubmodule. - Build requirements include LLVM 15+, clang, and standard development tools.
- Configuration uses
-DBPFTIME_LLVM_JIT=ON(orYES), with optional-DLLVM_DIRfor custom LLVM paths and-DBPFTIME_BUILD_STATIC_LIB=ONfor static archives.
Frequently Asked Questions
What LLVM version is required for bpftime JIT support?
bpftime requires LLVM version 15 or higher to compile the LLVM JIT backend. The build system uses llvm-config to locate the necessary libraries and headers. Ensure you have the development packages installed (e.g., llvm-dev on Ubuntu) so that CMake can detect the LLVM CMake modules.
How do I verify that LLVM JIT is enabled in my bpftime build?
You can verify LLVM JIT support by checking the CMake configuration output for references to bpftime_llvm_vm or llvmbpf. Additionally, after building, check that the macro BPFTIME_LLVM_JIT is defined to 1 in the compiled runtime (visible in runtime/CMakeLists.txt line 127). If the build succeeds with -DBPFTIME_LLVM_JIT=ON but fails with OFF, this confirms the LLVM backend is active.
Can I use LLVM JIT with static linking in bpftime?
Yes, you can statically link the LLVM JIT components by enabling both BPFTIME_LLVM_JIT and BPFTIME_BUILD_STATIC_LIB. The root CMakeLists.txt (around line 197) uses bpftime_add_static_lib_component_command to embed the LLVM VM objects into the static archive. Use the following configuration:
cmake -B build -DBPFTIME_LLVM_JIT=ON -DBPFTIME_BUILD_STATIC_LIB=ON
What is the difference between the LLVM JIT and uBPF backends in bpftime?
The LLVM JIT (enabled via BPFTIME_LLVM_JIT=ON) is the primary high-performance execution engine that uses LLVM infrastructure to compile eBPF bytecode to native machine code. It resides in vm/compat/llvm-vm/ and links against the llvmbpf submodule. The uBPF backend is a fallback interpreter/JIT maintained for compatibility when LLVM is unavailable or when BPFTIME_LLVM_JIT=OFF is set. The LLVM backend generally offers better optimization and performance for complex eBPF programs.
Have a question about this repo?
These articles cover the highlights, but your codebase questions are specific. Give your agent direct access to the source. Share this with your agent to get started:
curl -s "https://instagit.com/install.md" Maintain an open-source project? Get it listed too →