Open6

LLVM

HidenoriHidenori
  • LLVMは開発当初はLow Level Virtual Machineの略だったが、現在では特に意味はないらしい
  • LLVMのコンパイルフローは大きく分けて以下
    • フロントエンド: 字句解析、構文解析後にLLVM IR(中間表現)を出力
    • 最適化: LLVM IRの状態で命令数の削減やスケジューリングなどの最適化
    • バックエンド: LLVM IRをターゲットアーキテクチャのアセンブリ言語、オブジェクトファイルなどに変換
  • ツール群
    • clang: C/C++/Objective-Cなどに対応したフロントエンド。ソースコードをLLVM IRに出力
    • opt: LLVM IRに対する最適化ツール
    • llc: バックエンドツール。LLVM IRをターゲットアーキテクチャのアセンブリやオブジェクトファイルを出力
    • lld: リンカ。llcが出力したオブジェクトファイルを実行可能なバイナリに出力
HidenoriHidenori

LLVM IRのファイル

.llファイル

プレーンテキストで人が読める形式

.bcファイル

.llファイルは人には優しいが、コンピュータが扱うには不向きなのでそれをバイナリ形式で管理するようにしたものが.bc (ビットコード) ファイル

HidenoriHidenori

clangで.bcファイルを出力する

.bcファイルを出力するには、clangコマンドに-emit-llvmオプションを追加する

.bcファイルを.llファイルに変換する

llvm-disコマンドを使う

llvm-dis hoge.bc

clangで.llファイルを出力する

-Sオプションを使う

clang hoge.c -emit-llvm -S
HidenoriHidenori

llcコマンド

ホストPCのアーキテクチャ向けのアセンブリコードを生成する

llc hoge.bc -filetype=asm

異なるアーキテクチャ向けのアセンブラファイルを生成

llc hoge.bc -filetype=asm -march=ターゲットのアーキテクチャ名

cppに変更する

llc -march=cpp -o hoge.cpp hoge.bc
HidenoriHidenori

LTO

リンク時最適化を行うならば、オブジェクトファイルがLLVM IRになり(ファイルサイズが増える)、ビルド時間が増えてしまうが、一方で複数ファイルに跨った最適化ができるようになる。

-fltoオプションを付ける。このオプションを使うと、.o (elf) ではなく、bitcode が中間ファイルとして生成されるようになる。

https://qiita.com/kaityo256/items/a822fc462a4de6ddd8e7