LLVM

Da Andreabont's Wiki.

Compilazione

Usare la propria libreria standard

clang++ -stdlib=libc++

Ottenere codice assembly

clang <source_file> -S

NB: Il file può essere nuovamente passato al compilatore senza opzioni per ottenere l'eseguibile.

Analisi

Analisi statica del codice sorgente

clang --analyze <file.cpp>

Sanificazione del codice compile-time

Attenzione, queste opzioni rallentano l'esecuzione del programma finale.

clang -fsanitize=memory <file.cpp>

LLVM AST

LLVM utilizza una rappresentazione ad albero del codice, è possibile vederla attraverso il comando:

clang -Xclang -ast-dump -fsyntax-only <source_file>

LLVM IR

LLVM utilizza un codice intermedio, comune a tutti i linguaggi, prima di passare al codice macchina. Questo codice può essere anche eseguito JIT, ma rimane in ogni caso dipendente dalla piattaforma che l'ha generato.

Ottenere il codice intermedio

Per emettere il bytecode (.bc):

clang <source_file> -c -emit-llvm [-fno-use-cxa-atexit]

Per emettere il codice in formato leggibile (.ll):

clang <source_file> -S -emit-llvm [-fno-use-cxa-atexit] # Partendo dal sorgente
llvm-dis < <bytecode_file>                              # Partendo dal bytecode

Eseguire il codice intermedio

lli <llvm_file>

NB: In caso di errore "Could not resolve external global address: __dso_handle" usare l'opzione -fno-use-cxa-atexit su clang.

Compilare il codice intermedio

llc -march=c <llvm_file> -o <c_file> # IR -> C (Se abilitato alla compilazione di LLVM)
llc <llvm_file>                      # IR -> Assembly
llc -filetype=obj <llvm_file>        # IR -> Binary

Informazioni

Informazioni sul target

llc -mattr=help