The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, "LLVM" is not a single program — it is a monorepo that builds a complete, production-grade compiler ecosystem: the Clang C/C++/Objective-C compiler, the LLD linker, the LLDB debugger, the libc++ standard library, MLIR, Flang (Fortran), and dozens of standalone command-line tools for assembling, optimizing, analyzing, and transforming code.
This guide shows you how to get LLVM, how to build it from source, and
how to use its compilers and tools day-to-day. It is written against the
source tree at commit 53cbf88b6 and reflects what the code in this repository
actually does.
Note
"LLVM" means three different things depending on context: (1) the umbrella project, (2) the core libraries for IR processing and code generation, and (3) the intermediate representation (IR) itself. This guide always says "the LLVM Project" for the umbrella and "LLVM Core" for the libraries.
Table of Contents
- Quick Start
- What Is the LLVM Project?
- Installation
- Building LLVM from Source
- Compiling Code with Clang
- The LLVM Core Tool Suite
- Developer Tooling (clang-format, clang-tidy, clangd)
- Linking with LLD
- Debugging with LLDB
- Finding Bugs with Sanitizers
- Working with LLVM IR
- Advanced Workflows
- How LLVM Works (Concepts)
- Troubleshooting
- Frequently Asked Questions
- Reference
1. Quick Start
The fastest way to start using LLVM is to install a prebuilt Clang toolchain, then compile a program.
Linux (apt)
sudo apt-get update
sudo apt-get install -y clang lld lldb
clang --version
macOS (Homebrew)
brew install llvm
# Homebrew keeps LLVM keg-only; add it to PATH for this shell:
export PATH="$(brew --prefix llvm)/bin:$PATH"
clang --version
Windows (winget)
winget install LLVM.LLVM
clang --version
Compile and run a first program:
cat > hello.c <<'EOF'
#include <stdio.h>
int main(void) { puts("Hello from Clang!"); return 0; }
EOF
clang -O2 hello.c -o hello
./hello
Hello from Clang!
Tip
If you only need a compiler, use the prebuilt packages above. Build from source (Section 4) only when you need a specific version, custom targets, experimental features, or you are developing LLVM itself.
2. What Is the LLVM Project?
The repository is a monorepo containing several top-level components. They
fall into two groups based on how they are enabled at build time: projects
(built with LLVM_ENABLE_PROJECTS) and runtimes (built with
LLVM_ENABLE_RUNTIMES).
Core and projects
| Component | What it is | Typical user-facing tools |
|---|---|---|
LLVM Core (llvm/) |
The libraries, IR, optimizer, and code generators that everything else builds on | opt, llc, lli, llvm-as, llvm-dis, plus ~80 llvm-* utilities |
Clang (clang/) |
C, C++, Objective-C, and Objective-C++ frontend and compiler driver | clang, clang++ |
Clang Tools Extra (clang-tools-extra/) |
Standalone developer tools built on Clang's libraries | clang-tidy, clangd, clang-doc, clang-include-fixer |
LLD (lld/) |
A fast, drop-in linker for ELF, COFF, Mach-O, and WebAssembly | lld, ld.lld, lld-link, wasm-ld |
LLDB (lldb/) |
A modern, scriptable source-level debugger | lldb, lldb-server, lldb-dap |
MLIR (mlir/) |
Multi-Level Intermediate Representation — a framework for building domain-specific compilers and IRs | mlir-opt, mlir-translate |
Flang (flang/) |
A Fortran frontend and compiler | flang |
BOLT (bolt/) |
Post-link binary optimizer that improves layout using profile data | llvm-bolt |
Polly (polly/) |
Polyhedral loop optimizer (cache locality, auto-parallelization) | (integrated into opt/clang) |
Note
The set of "all" projects in this revision is exactly:
bolt,clang,clang-tools-extra,cross-project-tests,lld,lldb,mlir,polly.flang,libc, andcompiler-rtare extra projects that are preferably enabled as runtimes instead (see below).
Runtimes
Runtime libraries are compiled by the just-built compiler so they match the
target you are producing code for. The default set is libcxx, libcxxabi,
libunwind, libclc, compiler-rt, and openmp.
| Runtime | What it provides |
|---|---|
libc++ (libcxx/) |
LLVM's implementation of the C++ standard library |
libc++abi (libcxxabi/) |
The low-level C++ ABI support library (exceptions, RTTI, demangling) |
libunwind (libunwind/) |
An implementation of the stack unwinder used for exceptions |
compiler-rt (compiler-rt/) |
Compiler runtime: builtins, profiling, and the sanitizers (ASan, TSan, MSan, UBSan) |
OpenMP (openmp/) |
The OpenMP runtime for parallel and offloaded code |
libc (libc/) |
LLVM's C standard library implementation |
libclc (libclc/) |
OpenCL C library |
offload (offload/) |
GPU/accelerator offload runtime |
flang-rt (flang-rt/) |
The Fortran runtime library |
| libsycl, orc-rt, llvm-libgcc | SYCL support, ORC JIT runtime, and a libgcc-compatible runtime |
The complete list of supported runtimes in this revision is: libc,
libunwind, libcxxabi, libcxx, compiler-rt, openmp, llvm-libgcc,
offload, flang-rt, libclc, libsycl, orc-rt.
Important
You do not have to build everything. Most users enable only the projects and runtimes they need. Building Clang alone is far faster than building the entire monorepo.
3. Installation
You have three options, in increasing order of effort: prebuilt packages, official release binaries, or building from source (Section 4).
Option A — System package manager (recommended)
Ubuntu / Debian
# Distro packages:
sudo apt-get install -y clang lld lldb llvm
# Or the official LLVM apt repository for the latest release:
bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"
Fedora / RHEL
sudo dnf install -y clang lld lldb llvm
Arch Linux
sudo pacman -S llvm clang lld lldb
macOS
brew install llvm
export PATH="$(brew --prefix llvm)/bin:$PATH"
Windows
winget install LLVM.LLVM
# or: choco install llvm
Option B — Official release binaries
Prebuilt binaries for every release are published on the project's GitHub
releases page, linked from llvm.org. Download the archive
for your platform, extract it, and add its bin/ directory to your PATH.
# Example shape (replace with the version/platform you downloaded):
tar xf clang+llvm-*-x86_64-linux-gnu.tar.xz
export PATH="$PWD/clang+llvm-*/bin:$PATH"
clang --version
Verify your installation
clang --version
llvm-config --version # prints the LLVM version of your toolchain
lld --version
clang version 21.x.x
...
Tip
llvm-configis the canonical way to discover where headers, libraries, and the version of an installed LLVM live. Tools and build systems use it to link against LLVM.
4. Building LLVM from Source
Building from source is a first-class workflow for LLVM users. Everything in
this section is grounded in the repository's llvm/CMakeLists.txt.
Prerequisites
| Requirement | Minimum | Notes |
|---|---|---|
| CMake | 3.20.0 |
Declared by cmake_minimum_required(VERSION 3.20.0) |
| C++ host compiler | C++17 capable | LLVM_REQUIRED_CXX_STANDARD is 17; configuration fails if you force a lower CMAKE_CXX_STANDARD |
| Build tool | Ninja (recommended) or Make | Ninja gives the fastest incremental builds |
| Python | 3.x | Required to run the test suites and many helper scripts |
| Disk | 20–100+ GB | A full monorepo build with debug info is very large |
| RAM | 16+ GB recommended | Linking debug binaries is memory-hungry; see the link-jobs tip below |
Caution
A full, debug build of the entire monorepo can consume tens of gigabytes of RAM during linking and 100+ GB of disk. If you hit out-of-memory errors while linking, reduce parallel link jobs (see Troubleshooting).
Get the source
git clone https://github.com/llvm/llvm-project.git
cd llvm-project
Tip
For a faster, smaller checkout when you do not need full history, use a shallow clone:
git clone --depth=1 https://github.com/llvm/llvm-project.git.
Configure, build, and install
The build is always rooted at the llvm subdirectory. Select components
with -DLLVM_ENABLE_PROJECTS and -DLLVM_ENABLE_RUNTIMES.
cmake -S llvm -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DCMAKE_INSTALL_PREFIX="$HOME/llvm-install"
ninja -C build
ninja -C build install
[1/4231] Building CXX object ...
...
[4231/4231] Linking CXX executable bin/clang-21
Note
LLVM_TARGETS_TO_BUILD="host"builds only the backend for your current machine, which is dramatically faster than the default"all". Use"all"only when you need cross-compilation to other architectures.
Selecting components
# Just the C/C++ compiler:
-DLLVM_ENABLE_PROJECTS="clang"
# A self-hosting C++ toolchain (compiler + linker + standard library):
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_ENABLE_RUNTIMES="libcxx;libcxxabi;libunwind;compiler-rt"
# Everything (slow, large):
-DLLVM_ENABLE_PROJECTS="all"
Warning
LLVM_ENABLE_PROJECTS=openmphas been removed. OpenMP must be enabled as a runtime (-DLLVM_ENABLE_RUNTIMES="openmp"), not a project. Configuration aborts with a fatal error if you try the old form.
Build types
CMAKE_BUILD_TYPE controls optimization and debug info, and indirectly
controls assertions:
CMAKE_BUILD_TYPE |
Speed | Size | Assertions default |
|---|---|---|---|
Release |
Fast | Small | OFF |
Debug |
Slow | Huge | ON |
RelWithDebInfo |
Fast + debuggable | Large | ON |
MinSizeRel |
Optimized for size | Smallest | OFF |
Tip
Assertions are controlled by
LLVM_ENABLE_ASSERTIONS, which defaults toONfor non-Releasebuilds andOFFforRelease. Keep assertions on while developing LLVM — they catch invariant violations early.
Faster builds
# Use ccache to cache compilation results across rebuilds:
-DLLVM_CCACHE_BUILD=ON
# Build TableGen with optimization even in Debug builds (speeds up codegen):
-DLLVM_OPTIMIZED_TABLEGEN=ON
# Use lld to link (much faster than the system linker):
-DLLVM_ENABLE_LLD=ON
# Limit parallel link jobs to avoid running out of RAM:
-DLLVM_PARALLEL_LINK_JOBS=2
A common, fast developer configuration:
cmake -S llvm -B build -G Ninja \
-DCMAKE_BUILD_TYPE=Release \
-DLLVM_ENABLE_PROJECTS="clang;lld" \
-DLLVM_TARGETS_TO_BUILD="host" \
-DLLVM_ENABLE_ASSERTIONS=ON \
-DLLVM_OPTIMIZED_TABLEGEN=ON \
-DLLVM_CCACHE_BUILD=ON \
-DLLVM_USE_LINKER=lld
Run the tests
# Run LLVM's lit-based regression tests:
ninja -C build check-llvm
# Run only Clang's tests:
ninja -C build check-clang
Tip
Each project exposes a
check-<project>target (check-llvm,check-clang,check-lld,check-mlir, …). These run thelittest runner over the project's test suite.
See the full Getting Started with LLVM page for platform-specific notes and bootstrap builds.
5. Compiling Code with Clang
Clang is a drop-in replacement for GCC's command-line interface, so most flags you already know work unchanged.
Everyday compilation
# Compile a C program with optimization:
clang -O2 main.c -o main
# Compile C++ to a named binary, choosing a language standard:
clang++ -std=c++20 -O2 app.cpp -o app
# Compile to an object file only (no link):
clang -c module.c -o module.o
# Emit warnings aggressively:
clang -Wall -Wextra -Werror -O2 main.c -o main
Common driver flags
| Flag | Purpose |
|---|---|
-O0 / -O1 / -O2 / -O3 |
Optimization level (none → aggressive) |
-Os / -Oz |
Optimize for size / aggressively for size |
-g |
Emit debug information |
-c |
Compile only; do not link |
-S |
Emit assembly instead of an object file |
-emit-llvm |
Emit LLVM IR (.ll with -S, .bc with -c) |
-std=<std> |
Language standard (c11, c17, c++17, c++20, c++23, …) |
-target <triple> |
Cross-compile for the given target triple |
-fsanitize=<check> |
Enable a sanitizer (see Section 10) |
-I<dir> / -L<dir> / -l<lib> |
Add include dir / library dir / link a library |
Note
clangandclang++are the same binary; the++form turns on C++ mode and links the C++ standard library automatically. Useclang++for C++ sources.
Choosing the standard library (C++)
# Use LLVM's libc++ instead of the system libstdc++:
clang++ -stdlib=libc++ -std=c++20 app.cpp -o app
Tip
Pair
-stdlib=libc++with a libc++ you built or installed (Section 4) to get a fully LLVM-based C++ toolchain independent of the system GCC runtime.
6. The LLVM Core Tool Suite
LLVM Core ships roughly eighty standalone command-line tools. The most
important ones for everyday work are below; all are built into the bin/
directory of your build or install tree.
The essential tools
| Tool | What it does |
|---|---|
opt |
Run LLVM IR through optimization and analysis passes |
llc |
Compile LLVM IR (.ll/.bc) to native assembly or object code |
lli |
Directly execute LLVM IR using the interpreter/JIT |
llvm-as |
Assemble textual IR (.ll) into bitcode (.bc) |
llvm-dis |
Disassemble bitcode (.bc) back into textual IR (.ll) |
llvm-link |
Link multiple IR/bitcode modules into one |
llvm-mc |
Standalone machine-code assembler/disassembler |
llvm-config |
Report version, paths, and flags for an LLVM installation |
Inspection and binary-utility tools
| Tool | GNU analog | Purpose |
|---|---|---|
llvm-objdump |
objdump |
Disassemble and inspect object files |
llvm-nm |
nm |
List symbols in object files |
llvm-readobj / llvm-readelf |
readelf |
Dump object-file structure |
llvm-ar |
ar |
Create and manage static archives |
llvm-objcopy |
objcopy |
Copy and transform object files |
llvm-size |
size |
Report section sizes |
llvm-strings |
strings |
Extract printable strings |
llvm-cxxfilt |
c++filt |
Demangle C++ symbol names |
llvm-dwarfdump |
— | Dump DWARF debug information |
Profiling, coverage, and performance tools
| Tool | Purpose |
|---|---|
llvm-profdata |
Merge and inspect profile data (for PGO) |
llvm-cov |
Generate source-level code-coverage reports |
llvm-mca |
Machine-code analyzer: model instruction throughput/latency |
llvm-exegesis |
Measure instruction latency/throughput on real hardware |
llvm-reduce |
Automatically shrink a failing IR test case |
Tip
Run any tool with
--helpto see its full, version-accurate option list, and--versionto confirm which build you are invoking. The flag set for these tools is defined in the source and is the authoritative reference.
7. Developer Tooling
Clang's libraries power a suite of source-level tools used directly in editors, CI, and the command line.
clang-format — code formatting
# Format in place using the project's .clang-format file:
clang-format -i src/*.cpp
# Preview a specific style without editing:
clang-format --style=LLVM src/main.cpp
Tip
Drop a
.clang-formatfile at your repository root to define a house style.clang-formatwalks up from each file to find it.
clang-tidy — linting and static analysis
# Run the default checks on a file (needs a compilation database):
clang-tidy src/main.cpp -- -std=c++20
# Enable a specific set of checks and auto-apply fixes:
clang-tidy --checks='-*,modernize-*,bugprone-*' --fix src/main.cpp
Note
clang-tidyworks best with acompile_commands.jsoncompilation database. Generate one withcmake -DCMAKE_EXPORT_COMPILE_COMMANDS=ONor withclang-scan-deps/bear.
clangd — the language server
clangd provides code completion, go-to-definition, diagnostics, and refactors
to any editor that speaks the Language Server Protocol (VS Code, Neovim, Emacs,
and others).
# clangd is typically launched by your editor; verify it is found:
clangd --version
Tip
Like
clang-tidy,clangdneeds acompile_commands.jsonto understand how your files are compiled. Point your editor's clangd plugin at it.
Other tools in clang-tools-extra
| Tool | Purpose |
|---|---|
clang-doc |
Generate API documentation from sources |
clang-include-fixer |
Add missing #include directives automatically |
clang-move |
Move C++ class/function definitions between files |
clang-reorder-fields |
Reorder struct/class fields safely |
clang-query |
Interactively explore the Clang AST with matchers |
pp-trace |
Trace preprocessor activity |
Standalone Clang tools (in clang/tools)
| Tool | Purpose |
|---|---|
clang-scan-deps |
Fast dependency scanning for build systems and modules |
clang-refactor |
Command-line refactoring engine |
clang-repl |
Interactive C++ interpreter (REPL) |
clang-check |
Run syntax checks and AST dumps |
scan-build / scan-view |
Drive and view the Clang Static Analyzer |
8. Linking with LLD
LLD is a fast linker that can replace the system linker. It exposes several front-ends that mirror the platform linkers they replace.
| Driver | Replaces | Format |
|---|---|---|
ld.lld |
ld / ld.gold |
ELF (Linux, BSD) |
lld-link |
link.exe |
COFF (Windows) |
ld64.lld |
ld |
Mach-O (macOS) |
wasm-ld |
— | WebAssembly |
Use LLD through the Clang driver — this is the recommended way:
# Tell clang to use lld as the linker:
clang -fuse-ld=lld -O2 main.c -o main
Tip
LLD is often several times faster than
ld.bfdorgoldon large links. Adding-fuse-ld=lldto your build's link flags is a cheap, drop-in speedup.
9. Debugging with LLDB
LLDB is the project's source-level debugger. Its command interface is similar to GDB but with its own command grammar and a full Python scripting API.
# Start debugging a program:
lldb ./myprogram
(lldb) breakpoint set --name main
(lldb) run
(lldb) frame variable
(lldb) step
(lldb) continue
Common LLDB commands:
| Command | Short form | Purpose |
|---|---|---|
breakpoint set --name <fn> |
b <fn> |
Set a breakpoint |
run |
r |
Start the program |
next / step |
n / s |
Step over / into |
continue |
c |
Resume execution |
frame variable |
fr v |
Print local variables |
bt |
— | Print the call stack |
Note
lldb-dapimplements the Debug Adapter Protocol, which is how editors like VS Code talk to LLDB.lldb-serverenables remote debugging.
Tip
Compile with
-g(and ideally-O0for faithful stepping) to get full debug information for LLDB.
10. Finding Bugs with Sanitizers
The sanitizers are runtime bug detectors built from compiler-rt and
enabled through Clang with -fsanitize=. They instrument your program to catch
errors that would otherwise be silent corruption.
| Sanitizer | Flag | Catches |
|---|---|---|
| AddressSanitizer | -fsanitize=address |
Buffer overflows, use-after-free, leaks |
| UndefinedBehaviorSanitizer | -fsanitize=undefined |
Integer overflow, bad casts, null derefs |
| ThreadSanitizer | -fsanitize=thread |
Data races |
| MemorySanitizer | -fsanitize=memory |
Use of uninitialized memory |
# Build with AddressSanitizer and run:
clang -fsanitize=address -g -O1 buggy.c -o buggy
./buggy
==12345==ERROR: AddressSanitizer: heap-buffer-overflow on address 0x...
#0 0x... in main buggy.c:7
...
Important
Sanitizers add runtime and memory overhead and are meant for testing, not production. Do not ship sanitizer-instrumented binaries.
Warning
Most sanitizers cannot be combined (e.g. you cannot use
addressandmemorytogether). UBSan is the main exception and composes with others.
11. Working with LLVM IR
LLVM IR is the common language that connects frontends (like Clang) to the optimizer and backends. Being able to read and manipulate it is a superpower.
See the IR your code produces
# Emit human-readable LLVM IR:
clang -O2 -S -emit-llvm hello.c -o hello.ll
cat hello.ll
The IR pipeline by hand
# 1. C source -> textual IR
clang -O0 -S -emit-llvm hello.c -o hello.ll
# 2. Optimize the IR with opt
opt -O2 hello.ll -S -o hello.opt.ll
# 3. IR -> native assembly with llc
llc hello.opt.ll -o hello.s
# 4. Or run the IR directly with the interpreter/JIT
lli hello.ll
Hello from Clang!
Bitcode round-trips
llvm-as hello.ll -o hello.bc # text IR -> bitcode
llvm-dis hello.bc -o roundtrip.ll # bitcode -> text IR
Tip
When reporting an optimizer or backend bug, attach the
.llfile and the exactopt/llccommand. Usellvm-reduceto shrink it to a minimal reproducer first.
12. Advanced Workflows
Cross-compilation
# Compile for a different architecture using a target triple:
clang --target=aarch64-linux-gnu -O2 main.c -o main-arm64
Note
Cross-compilation requires the target's backend to be built into your LLVM (
-DLLVM_TARGETS_TO_BUILDmust include it) and a sysroot/headers for the target. The 20 stable backends are listed in the Reference.
Link-Time Optimization (LTO)
# Whole-program optimization across translation units:
clang -flto -O2 a.c b.c -o app
Profile-Guided Optimization (PGO)
# 1. Build instrumented:
clang -fprofile-instr-generate -O2 app.c -o app-inst
# 2. Run representative workloads to collect raw profiles:
LLVM_PROFILE_FILE="app-%p.profraw" ./app-inst < workload
# 3. Merge the raw profiles:
llvm-profdata merge -output=app.profdata app-*.profraw
# 4. Rebuild using the profile:
clang -fprofile-instr-use=app.profdata -O2 app.c -o app-optimized
Tip
PGO commonly yields 5–20% performance improvements on real workloads because the optimizer learns which branches and functions are hot.
13. How LLVM Works (Concepts)
You can use the tools above without this section, but understanding the pipeline makes everything click.
The three-phase design
Source code LLVM IR Machine code
(C/C++/Fortran/...) (target-independent) (x86/ARM/RISCV/...)
│ │ │
┌────▼─────┐ ┌─────▼──────┐ ┌──────▼──────┐
│ Frontend │ ──────▶ │ Optimizer │ ──────▶ │ Backend │
│ (Clang) │ │ (opt) │ │ (llc) │
└──────────┘ └────────────┘ └─────────────┘
- Frontend (e.g. Clang) parses a source language and lowers it to LLVM IR.
- Optimizer runs target-independent passes over the IR. Each pass analyzes or transforms the IR (inlining, dead-code elimination, vectorization — Polly adds polyhedral loop optimizations here).
- Backend (code generator) lowers optimized IR to machine code for a specific target architecture.
Because the IR sits in the middle, any frontend can reuse all of LLVM's optimizations and all of its backends. That reuse is the entire point of LLVM.
Where each component fits
- Clang / Flang are frontends — they produce IR.
- LLVM Core is the optimizer + the 20 backends.
- MLIR is a more general IR framework that can model higher-level, domain-specific abstractions and progressively lower them, often feeding into LLVM IR.
- LLD links the resulting object files into executables and libraries.
- The runtimes (libc++, compiler-rt, etc.) are linked into your final program to provide standard-library and runtime support.
Note
This is why "LLVM is a compiler toolkit, not a compiler." It is the reusable machinery from which compilers are built.
14. Troubleshooting
Error: Requested CMAKE_CXX_STANDARD=... which is less than the required 17
Cause: You passed a CMAKE_CXX_STANDARD lower than 17, but LLVM requires a
C++17 host compiler (LLVM_REQUIRED_CXX_STANDARD is 17).
Solution: Remove the override, or set -DCMAKE_CXX_STANDARD=17 (or higher).
Prevention: Do not pin an old C++ standard for the LLVM build; LLVM controls
this itself.
Error: Support for the LLVM_ENABLE_PROJECTS=openmp build mode has been removed
Cause: You listed openmp in LLVM_ENABLE_PROJECTS.
Solution: Move it to runtimes: -DLLVM_ENABLE_RUNTIMES="openmp".
Prevention: OpenMP, libc, and compiler-rt are runtimes, not projects.
Error: <name> isn't a known project
Cause: A typo or a component that is actually a runtime appears in
LLVM_ENABLE_PROJECTS.
Solution: Use a name from the known-projects list (bolt, clang,
clang-tools-extra, cross-project-tests, lld, lldb, mlir, polly,
flang, libc, compiler-rt) or move it to LLVM_ENABLE_RUNTIMES.
Error: Runtime "<name>" is not a supported runtime
Cause: An unsupported name in LLVM_ENABLE_RUNTIMES.
Solution: Choose from: libc, libunwind, libcxxabi, libcxx,
compiler-rt, openmp, llvm-libgcc, offload, flang-rt, libclc,
libsycl, orc-rt.
Problem: The build runs out of memory while linking
Cause: Many large debug binaries link in parallel. Solution: Cap parallel link jobs and use a faster linker:
cmake -S llvm -B build -G Ninja \
-DLLVM_PARALLEL_LINK_JOBS=1 \
-DLLVM_USE_LINKER=lld \
-DCMAKE_BUILD_TYPE=Release
Prevention: Prefer Release or RelWithDebInfo over Debug; debug info
multiplies link memory.
Problem: The build takes forever
Cause: Building all targets and all projects.
Solution: Set -DLLVM_TARGETS_TO_BUILD="host" and enable only the projects
you need. Add -DLLVM_CCACHE_BUILD=ON and -DLLVM_OPTIMIZED_TABLEGEN=ON.
Problem: clang-tidy / clangd report nonsense or "file not found"
Cause: No compilation database, so the tool guesses the wrong flags.
Solution: Generate compile_commands.json with
-DCMAKE_EXPORT_COMPILE_COMMANDS=ON and point the tool at it.
Problem: [lldb] Misleading error message when re-importing command script
Cause: A known, community-reported LLDB diagnostic issue (upstream issue #206508) where re-importing a command script produces a confusing message. Solution: Treat the message as informational; the import generally still behaves as expected. Track the upstream issue for the fix.
Tip
For runtime issues with the compiler itself, re-run with
-vto see the exact sub-commands Clang invokes; this usually reveals a missing sysroot, header, or library path.
15. Frequently Asked Questions
Q: Is "LLVM" a compiler? Not by itself. The LLVM Project is a toolkit for building compilers. Clang is the C/C++ compiler built on it. "LLVM Core" is the optimizer and backends.
Q: Do I need to build the whole monorepo?
No. Enable only the projects/runtimes you need. Building just clang is far
faster than building everything.
Q: What is the difference between a "project" and a "runtime"?
Projects (LLVM_ENABLE_PROJECTS) are tools built by your host compiler.
Runtimes (LLVM_ENABLE_RUNTIMES) are libraries built by the freshly built
Clang so they match your target. libc++, compiler-rt, and OpenMP are runtimes.
Q: Which architectures can LLVM target? The 20 stable backends include AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, LoongArch, Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SPIRV, SystemZ, VE, WebAssembly, X86, and XCore. Five more are experimental (see Reference).
Q: How do I use libc++ instead of libstdc++?
Compile with clang++ -stdlib=libc++.
Q: What language standards does Clang support?
Use -std= with values like c11, c17, c2x, c++17, c++20, c++23.
Run clang -std=help (or check the version's release notes) for the exact set.
Q: Why is my Clang version 21 when I expected something else?
The LLVM Project uses a single rolling version for the whole monorepo, bumped
each major release. clang --version and llvm-config --version report it.
Q: How do I report a bug or contribute? File issues and pull requests on the project's GitHub repository. See the Contributing to LLVM guide and join the LLVM Discourse forums.
Q: Where is the authoritative flag reference for each tool?
Run the tool with --help. The tools' option definitions in the source are the
source of truth; the rendered docs live at llvm.org/docs.
16. Reference
Build component lists (from llvm/CMakeLists.txt)
Projects (LLVM_ENABLE_PROJECTS, "all" expands to):
bolt, clang, clang-tools-extra, cross-project-tests, lld, lldb,
mlir, polly. Extra projects: flang, libc, compiler-rt.
Runtimes (LLVM_ENABLE_RUNTIMES):
- Default:
libcxx,libcxxabi,libunwind,libclc,compiler-rt,openmp - Supported:
libc,libunwind,libcxxabi,libcxx,compiler-rt,openmp,llvm-libgcc,offload,flang-rt,libclc,libsycl,orc-rt
Stable backend targets (LLVM_TARGETS_TO_BUILD)
AArch64, AMDGPU, ARM, AVR, BPF, Hexagon, Lanai, LoongArch,
Mips, MSP430, NVPTX, PowerPC, RISCV, Sparc, SPIRV, SystemZ,
VE, WebAssembly, X86, XCore.
Experimental targets: ARC, CSKY, DirectX, M68k, Xtensa.
Targets with JIT support: X86, PowerPC, AArch64, ARM, Mips, SystemZ.
Frequently used CMake options
| Option | Default | Purpose |
|---|---|---|
CMAKE_BUILD_TYPE |
(none) | Release / Debug / RelWithDebInfo / MinSizeRel |
LLVM_ENABLE_PROJECTS |
"" |
Semicolon-separated projects, or "all" |
LLVM_ENABLE_RUNTIMES |
"" |
Semicolon-separated runtimes, or "all" |
LLVM_TARGETS_TO_BUILD |
"all" |
Backends to build; use "host" for speed |
LLVM_ENABLE_ASSERTIONS |
ON (Debug) / OFF (Release) | Enable internal assertions |
LLVM_CCACHE_BUILD |
OFF |
Cache compiles with ccache |
LLVM_OPTIMIZED_TABLEGEN |
OFF |
Optimize TableGen even in Debug |
LLVM_ENABLE_LLD |
OFF |
Link LLVM itself with lld |
LLVM_USE_LINKER |
(system) | Choose the linker (e.g. lld) |
LLVM_PARALLEL_LINK_JOBS |
(unbounded) | Cap concurrent link jobs |
BUILD_SHARED_LIBS |
OFF |
Build component libs as shared (developer convenience) |
LLVM_BUILD_TESTS |
OFF |
Build unit tests |
LLVM_BUILD_EXAMPLES |
OFF |
Build example programs |
LLVM_INCLUDE_BENCHMARKS |
ON |
Generate benchmark targets |
CMAKE_INSTALL_PREFIX |
(platform) | Install location |
Key tools by component
| Component | Tools |
|---|---|
| LLVM Core | opt, llc, lli, llvm-as, llvm-dis, llvm-link, llvm-mc, llvm-objdump, llvm-nm, llvm-readobj, llvm-ar, llvm-objcopy, llvm-config, llvm-profdata, llvm-cov, llvm-mca, llvm-dwarfdump, llvm-reduce, … (~80 total) |
| Clang | clang, clang++, clang-format, clang-scan-deps, clang-refactor, clang-repl, clang-check, scan-build |
| Clang Tools Extra | clang-tidy, clangd, clang-doc, clang-include-fixer, clang-move, clang-query, pp-trace |
| LLD | ld.lld, lld-link, ld64.lld, wasm-ld |
| LLDB | lldb, lldb-server, lldb-dap |
| MLIR | mlir-opt, mlir-translate |
| Flang | flang |
| BOLT | llvm-bolt |
Official documentation
| Resource | URL |
|---|---|
| Getting Started / Building | https://llvm.org/docs/GettingStarted.html |
| Clang documentation | https://clang.llvm.org |
| LLD linker | https://lld.llvm.org |
| libc++ | https://libcxx.llvm.org |
| Contributing | https://llvm.org/docs/Contributing.html |
| Community forums | https://discourse.llvm.org |
Note
This guide intentionally points to the official
llvm.orgdocumentation for the complete, per-flag references ofclang,opt,llc, and the other tools. Those flag sets are large, change between releases, and are defined in the source; always confirm with--helpfor the exact version you run.