LLVM + clang で LLVM IR やアセンブリを出力する

clang は LLVM をバックエンドに使用しており, C言語で書かれたソースコードを LLVM IR に出力したり, 各アーキテクチャのアセンブリを出力することができます. コード生成や LLVM の勉強に利用できます.

LLVM と clang のインストール

ここでは割愛します. 今回は LLVM / clang 3.6.1 で動作確認しています.

C -> LLVM IR

C 言語のソースコードから LLVM IR を出力します. 1.ll というファイルに LLVM IR が出力されます.

clang -c -S -emit-llvm 1.c

C -> LLVM ビットコード

C 言語のソースコードから LLVM ビットコードを出力します. 1.bc というファイルにビットコードが出力されます.

# AT&T 形式
clang -c -S 1.c
# Intel 形式
clang -c -S -mllvm --x86-asm-syntax=intel 1.c

LLVM ビットコード -> LLVM IR

LLVM ビットコードから LLVM IR を出力します. 1.ll というファイルに LLVM IR が出力されます.

llvm-as 1.ll

LLVM IR / ビットコード -> アセンブリ

LLVM IR / ビットコードからアセンブリを出力します. 1.s というファイルにアセンブリが出力されます. こちらも Intel 形式で出力することができます.

# LLVM IR -> AT&T 形式
llc 1.ll
# LLVM IR -> Intel 形式
llc -x86-asm-syntax=intel 1.ll
# LLVM ビットコード -> AT&T 形式
llc 1.bc
# LLVM ビットコード -> Intel 形式
llc -x86-asm-syntax=intel 1.bc

参考