Open7

LLVM

Hidenori@低レイヤHidenori@低レイヤ
  • 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が出力したオブジェクトファイルを実行可能なバイナリに出力
Hidenori@低レイヤHidenori@低レイヤ

LLVM IRのファイル

.llファイル

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

.bcファイル

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

Hidenori@低レイヤHidenori@低レイヤ

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

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

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

llvm-disコマンドを使う

llvm-dis hoge.bc

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

-Sオプションを使う

clang hoge.c -emit-llvm -S
Hidenori@低レイヤHidenori@低レイヤ

llcコマンド

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

llc hoge.bc -filetype=asm

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

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

cppに変更する

llc -march=cpp -o hoge.cpp hoge.bc
Hidenori@低レイヤHidenori@低レイヤ

LTO

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

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

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