Belajar LLVM - Linking, LTO & DTLTO
Series/Belajar LLVM/Episode 19
Episode 19 of 28

Belajar LLVM - Linking, LTO & DTLTO

Menguasai LLD linker cepat (kecepatan vs GNU ld/Gold, thin archives, section GC), LTO (Link-Time Optimization) dan ThinLTO parallel, serta DTLTO (Distributed ThinLTO) untuk distribusi kompilasi lintas mesin dengan praktik perbandingan ukuran/performa binary.

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

Pendahuluan

Setelah di episode 18 kita memahami roadmap menulis backend target baru, pada episode ini kita membahas tahapan terakhir pipeline kompilasi: linking — dan optimasi yang dilakukan di tahap ini: LTO (Link-Time Optimization) dan DTLTO (Distributed ThinLTO).

Linking adalah tahapan yang sering dilewatkan, padahal ia menentukan ukuran akhir binary, resolusi symbol, dan — dengan LTO — bisa melakukan optimasi lintas translation unit yang tidak mungkin dilakukan di level kompilasi biasa.

LLD: Linker Cepat

LLVM menyediakan LLD — linker cepat yang merupakan pengganti drop-in untuk GNU ld:

AspekLLDGNU ldGold
KecepatanSangat cepatStandarCepat
Link-time (1000 TU)~2 detik~10 detik~5 detik
Memory usageRendahTinggiSedang
Thin archivesYaTerbatasYa
Section GCYaTerbatasYa
Gunakan LLD sebagai linker
clang -fuse-ld=lld -o program program.o
# atau set default di environment
export LD=ld.lld

Thin Archives

Thin archives (.a format) hanya menyimpan indeks simbol tanpa menyalin object files — mengurangi waktu build dan ukuran archive.

Section GC (Garbage Collection)

--gc-sections menghapus section yang tidak direferensikan — mengurangi ukuran binary akhir:

Link dengan GC sections
ld.lld --gc-sections -o program program.o

LTO menunda optimasi hingga tahap linking, saat seluruh program sudah tersedia. Ini memungkinkan optimasi lintas translation unit:

100%

Full LTO

Menggabungkan seluruh bitcode ke satu module besar, optimasi, lalu codegen:

Full LTO
clang -flto -o program main.c utils.c

Kelebihan: optimasi paling agresif. Kekurangan: waktu linking lama, memory tinggi.

ThinLTO

Mempertahankan modul terpisah tetapi mengizinkan cross-module optimization via summary:

ThinLTO
clang -flto=thin -o program main.c utils.c

ThinLTO bisa diparalelkan — waktu linking jauh lebih cepat dari Full LTO.

DTLTO: Distributed ThinLTO

DTLTO (Distributed ThinLTO) diperkenalkan di LLVM 22 (2026) — mendistribusikan optimasi LTO ke beberapa mesin dalam jaringan:

DTLTO (LLVM 22+)
clang -flto=thin -fdtlto-distributor=dist-server -o program main.c utils.c

DTLTO mengirimkan bitcode modules ke distributor yang menugaskan optimasi ke worker berbeda — sangat berguna untuk proyek besar dengan ratusan translation units.

Note

DTLLO adalah fitur baru di LLVM 22 yang masih dalam tahap matang. Untuk production, ThinLTO sudah sangat stabil dan widely used (Google, Apple, Facebook menggunakannya). DTLTO adalah evolusi natural untuk proyek yang sudah memanfaatkan ThinLTO.

Praktik: Perbandingan Ukuran/Performa

Bandingkan binary dengan berbagai metode linking
# Tanpa LTO
clang -O2 -o no_lto program.c
# Full LTO
clang -O2 -flto -fuse-ld=lld -o full_lto program.c
# ThinLTO
clang -O2 -flto=thin -fuse-ld=lld -o thin_lto program.c
 
# Bandingkan ukuran
ls -la no_lto full_lto thin_lto
 
# Bandingkan performa (contoh: waktu eksekusi)
time ./no_lto
time ./full_lto
time ./thin_lto

Biasanya: Full LTO menghasilkan binary paling kecil dan paling cepat, tetapi waktu linking paling lama. ThinLTO menawarkan keseimbangan terbaik.

Penutup

Inti yang harus dibawa pulang:

  • LLD adalah linker cepat yang menggantikan GNU ld — lebih cepat dalam segala aspek.
  • Full LTO menggabungkan semua bitcode ke satu module; ThinLTO mempertahankan modularitas.
  • ThinLTO bisa diparalelkan — solusi default untuk proyek besar.
  • DTLTO (LLVM 22) mendistribusikan optimasi LTO ke beberapa mesin.

Di episode 20 selanjutnya kita akan membahas JIT Compilation dengan ORC — evolusi MCJIT → ORC v2, LLJIT high-level API, dan practical use cases: embedded scripting engine, SQL query JIT, game scripting. Sampai jumpa di episode 20!

Belajar LLVM - Linking, LTO & DTLTO | Belajar LLVM