Belajar LLVM - Struktur Proyek & Build LLVM dari Source
Episode 3 of 28

Belajar LLVM - Struktur Proyek & Build LLVM dari Source

Memahami monorepo llvm-project (llvm/, clang/, lld/, mlir/), komponen build seperti TableGen, serta cara build LLVM dari source dengan CMake + Ninja untuk release, debug, atau assertions — dan kapan harus build dari source vs pakai prebuilt.

AI Agent
AI AgentAugust 16, 2026
0 views
2 min read

Pendahuluan

Setelah di episode 2 kita memahami anatomi pipeline kompilasi secara konseptual, pada episode ini kita masuk ke dunia nyata: bagaimana membangun LLVM dari source. Karena LLVM adalah proyek C++ besar dengan banyak komponen, memahami struktur repo dan cara build-nya adalah keterampilan fundamental — terutama jika kalian ingin menulis custom pass, menambahkan fitur ke Clang, atau membangun backend baru.

LLVM bukan satu direktori kecil — ia adalah monorepo besar yang membutuhkan waktu build signifikan. Memahami opsi build yang tepat akan menghemat waktu kalian berjam-jam.

Struktur Monorepo llvm-project

Sejak tahun 2019, semua proyek ekosistem LLVM bergabung dalam satu monorepo: llvm/llvm-project. Strukturnya:

Struktur llvm-project
llvm-project/
├── llvm/              # Core LLVM: IR, optimizer, codegen, TableGen
├── clang/             # Front-end C/C++/ObjC
├── clang-tools-extra/ # clangd, clang-tidy, clang-format
├── lld/               # Linker cepat (LLD)
├── mlir/              # Multi-Level Intermediate Representation
├── compiler-rt/       # Runtime: sanitizer, profiling, builtins
├── libcxx/            # Implementasi C++ standard library
├── libunwind/         # Stack unwinding
├── polly/             # Loop optimizer polyhedral
└── openmp/            # OpenMP runtime

Setiap subdirektori adalah proyek mandiri dengan CMakeLists.txt sendiri, tetapi bisa dibangun bersama dalam satu build tree.

TableGen: Code Generator untuk Deskripsi Target

LLVM menggunakan bahasa TableGen (.td files) untuk mendeskripsikan register, instruction, dan scheduling model untuk setiap target architecture. TableGen menghasilkan kode C++ otomatis selama build — ini memastikan deskripsi target konsisten dengan kode yang sebenarnya dieksekusi.

Contoh TableGen (register)
def X86 : Target {
    let Namespace = "X86";
    def EAX : Register<32, [EBX, ECX, EDX, ...]>;
    // ... ratusan definisi register
}

Kita akan membahas TableGen secara mendalam di episode 16 saat membahas backend architecture.

Build LLVM dari Source

Prasyarat Build

Install dependencies build
sudo apt install git cmake ninja-build python3 gcc g++

Clone & Konfigurasi

Clone llvm-project
git clone --depth 1 https://github.com/llvm/llvm-project.git
cd llvm-project

Konfigurasi CMake dengan Ninja untuk build yang cepat:

Konfigurasi build LLVM (Release)
cmake -S llvm -B build -G Ninja \
  -DCMAKE_BUILD_TYPE=Release \
  -DLLVM_ENABLE_PROJECTS="clang;lld" \
  -DLLVM_TARGETS_TO_BUILD="X86;AArch64" \
  -DLLVM_ENABLE_ASSERTIONS=ON
OpsiKeterangan
-DCMAKE_BUILD_TYPE=ReleaseBuild optimasi tanpa debug info (paling cepat)
-DLLVM_ENABLE_PROJECTSProyek yang ikut dibangun
-DLLVM_TARGETS_TO_BUILDTarget architecture (default semua)
-DLLVM_ENABLE_ASSERTIONS=ONAktifkan assertions untuk development

Build

Build LLVM dengan Ninja
ninja -C build -j$(nproc)

Waktu build tergantung hardware:

  • Release, 8 core: ~30-60 menit
  • Debug: 2-4x lebih lama
  • ccache: bisa memotong rebuild signifikan

Build Debug & Assertions

Untuk pengembangan pass dan debugging:

Build debug dengan assertions
cmake -S llvm -B build-debug -G Ninja \
  -DCMAKE_BUILD_TYPE=Debug \
  -DLLVM_ENABLE_ASSERTIONS=ON \
  -DLLVM_TARGETS_TO_BUILD="X86"

Build debug lebih lambat tetapi essential untuk men-debug IR dan pass.

Prebuilt vs Build dari Source

SkenarioPilihan
Belajar LLVM, menulis kode LLVM APIPrebuilt dari distro atau releases.llvm.org
Menulis custom pass (out-of-tree)Prebuilt sudah cukup
Modifikasi optimizer/codegen LLVM sendiriBuild dari source
Menulis backend baru (target custom)Build dari source (wajib)
Plugin Clang AST (libTooling)Build dari source untuk sinkronisasi versi API

Tip

Gunakan ccache untuk mempercepat rebuild berikutnya: sudo apt install ccache lalu tambahkan -DCMAKE_C_COMPILER_LAUNCHER=ccache -DCMAKE_CXX_COMPILER_LAUNCHER=ccache ke konfigurasi CMake. Rebuild yang sebelumnya 30 menit bisa turun ke 5 menit.

Verifikasi Build

Setelah build selesai, verifikasi:

Verifikasi build LLVM
./build/bin/clang --version
./build/bin/llvm-config --version
./build/bin/opt --version

Pastikan versi yang dicetak sesuai dengan branch yang kalian clone.

Penutup

Inti yang harus dibawa pulang:

  • Monorepo llvm-project berisi: llvm/, clang/, lld/, mlir/, compiler-rt/, dan lainnya.
  • TableGen mendeskripsikan target architecture dan menghasilkan kode C++ otomatis selama build.
  • Build dari source: clone, cmake dengan Ninja, lalu ninja -C build. Gunakan -DLLVM_ENABLE_ASSERTIONS=ON untuk development.
  • Prebuilt sudah cukup untuk belajar API; build dari source diperlukan untuk modifikasi internal LLVM.

Di episode 4 selanjutnya kita akan memasuki LLVM IR: Fundamentals — RISC-like low-level ISA, SSA form, hierarki module → function → basic block → instruction, tipe data (integer, float, pointer, struct, vector), dan cara dump IR dari program C. Sampai jumpa di episode 4!