Open7
LLVM
LLVMコマンドオプションの公式ドキュメント
- 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が出力したオブジェクトファイルを実行可能なバイナリに出力
LLVM IRのファイル
.llファイル
プレーンテキストで人が読める形式
.bcファイル
.llファイルは人には優しいが、コンピュータが扱うには不向きなのでそれをバイナリ形式で管理するようにしたものが.bc (ビットコード) ファイル
clangで.bcファイルを出力する
.bcファイルを出力するには、clangコマンドに-emit-llvm
オプションを追加する
.bcファイルを.llファイルに変換する
llvm-dis
コマンドを使う
llvm-dis hoge.bc
clangで.llファイルを出力する
-S
オプションを使う
clang hoge.c -emit-llvm -S
llcコマンド
ホストPCのアーキテクチャ向けのアセンブリコードを生成する
llc hoge.bc -filetype=asm
異なるアーキテクチャ向けのアセンブラファイルを生成
llc hoge.bc -filetype=asm -march=ターゲットのアーキテクチャ名
cppに変更する
llc -march=cpp -o hoge.cpp hoge.bc
LTO
リンク時最適化を行うならば、オブジェクトファイルがLLVM IRになり(ファイルサイズが増える)、ビルド時間が増えてしまうが、一方で複数ファイルに跨った最適化ができるようになる。
-flto
オプションを付ける。このオプションを使うと、.o (elf) ではなく、bitcode が中間ファイルとして生成されるようになる。
セキュリティ関連で Clang には CFI (Control Flow Integrity) という機能があるらしい
日本語で解説しているサイト↓