Menguasai CLI tools LLVM: clang (driver), opt (pass runner), llc (IR ke asm/object), lli (interpreter/JIT), llvm-objdump, llvm-nm, dan llvm-mca (machine code analyzer) — dengan praktik inspeksi per tahap kompilasi dan analisis throughput instruksi.

Setelah di episode 5 kita menulis .ll manual dan menggunakan tools dasar (llvm-as, llvm-dis, opt -verify), pada episode ini kita memperluas ke seluruh CLI tools inti LLVM. Tools ini adalah kepanjangan tangan kalian saat menganalisis pipeline kompilasi, membandingkan IR sebelum/sesudah optimasi, dan memahami kode assembly target.
Setiap tool LLVM memiliki peran spesifik dalam pipeline. Memahami kapan menggunakan opt vs llc vs lli vs clang adalah fondasi untuk debugging dan profiling yang efektif.
clang adalah driver yang mengkoordinasi seluruh pipeline. Di belakang layar, ia memanggil preprocessor, compiler proper, assembler, dan linker secara berurutan.
clang -S -emit-llvm -o - program.c # IR textual
clang -c -emit-llvm -o program.bc program.c # IR bitcode
clang -S -o - program.c # Assembly target
clang -c -o program.o program.c # Object file
clang -o program program.c # Binary finalopt menjalankan pass optimizer pada LLVM IR. Ini adalah tool utama untuk menjalankan custom pass dan optimasi.
opt -S -O2 -o optimized.ll program.bc # Optimasi dan hasilkan .ll
opt -S -passes=mem2reg -o mem2reg.ll program.bc # Jalankan pass spesifik
opt -S -passes=debug-pass-manager program.bc # Debug pass managerPerbandingan IR sebelum dan sesudah optimasi:
opt -S -O0 -o before.ll program.bc
opt -S -O3 -o after.ll program.bc
diff before.ll after.llllc mengonversi LLVM IR ke assembly target atau object file tanpa menjalankan optimizer (optimizer sudah selesai di tahap opt).
llc -mcpu=x86-64 -o - program.bc # Assembly x86-64 textual
llc -filetype=obj -o program.o program.bc # Object file
llc -mtriple=aarch64-linux-gnu -o - program.bc # Assembly ARM64lli mengeksekusi LLVM IR atau bitcode langsung tanpa codegen ke native binary.
lli program.bc # Jalankan bitcode
lli -load=pass_plugin.so program.bc # Jalankan dengan pass pluginllvm-objdump -d program.o # Disassemble
llvm-objdump -h program.o # Section headers
llvm-objdump -r program.o # Relocationsllvm-nm program.o
llvm-nm --defined-only program.ollvm-mca menganalisis throughput instruksi assembly tanpa menjalankan kode. Sangat berguna untuk memahami bagaimana instruction scheduling mempengaruhi performa.
llc -o - program.bc | llvm-mca -mcpu=x86-64-skylakeHasil menunjukkan throughput, latency, dan resource usage per instruksi — sangat berguna saat menulis optimized code atau menganalisis dampak optimasi.
# 1. Dump IR
clang -emit-llvm -S -o original.ll program.c
# 2. Optimasi
opt -S -O2 -o optimized.ll program.bc
# 3. Konversi ke assembly target
llc -o program.s optimized.ll
# 4. Assemble ke object
llvm-mc -filetype=obj -o program.o program.s
# 5. Inspeksi object
llvm-objdump -d program.o
llvm-nm program.o
# 6. Analisis throughput
llvm-mca -mcpu=x86-64-skylake program.sTip
Gunakan opt -passes=print<function>'*' untuk melihat pass tertentu dalam pipeline. Flag -debug-pass-manager memperlihatkan urutan pass yang dieksekusi — sangat berguna untuk memahami apa yang sebenarnya dilakukan optimizer di level IR.
Inti yang harus dibawa pulang:
clang driver universal untuk seluruh pipeline.opt pass runner untuk optimasi dan custom passes.llc konversi IR ke assembly/object tanpa optimizer tambahan.lli interpreter bitcode untuk testing cepat.llvm-objdump, llvm-nm untuk inspeksi object files.llvm-mca machine code analyzer untuk analisis throughput instruksi.Di episode 7 selanjutnya kita akan memasuki dunia menulis pass pertama dengan New Pass Manager — arsitektur New PM, analysis pass vs transform pass, out-of-tree plugin pass, dan praktik menulis pass penghitung fungsi/instruksi. Sampai jumpa di episode 7!