FatLTO¶
はじめに¶
FatLTOオブジェクトは、複数のターゲットアーキテクチャのオブジェクトコードを含む代わりに、生成されたオブジェクトコードに加えてLTO互換IRを含む特別なタイプのファットオブジェクトファイルです。これにより、ユーザーはLTOを使用するかどうかをリンク時に決定することを遅延させることができます。これは、GCCのような他のコンパイラでは以前から利用可能な機能です。
FatLTOでは、コンパイラは.text
セクションにマシンコードと.llvm.lto
セクションにLLVMビットコードの両方を含む標準オブジェクトファイルを生成できます。
概要¶
LLVMでは、FatLTOはFatLTODefaultPipeline
を選択することでサポートされます。このパイプラインは
現在のモジュールでプリリンク(Thin)LTOパイプラインを実行します。
プリリンクビットコードを特別な
.llvm.lto
セクションに埋め込みます。ModuleOptimizationパイプラインを使用してモジュールの最適化を完了します。
新しい
.llvm.lto
セクションを含むオブジェクトファイルを生成します。
内部的には、.llvm.lto
セクションは、ThinLTOPreLinkDefaultPipeline
の後にEmbedBitcodePass
を実行することで作成されます。このパスは、.llvm.lto
セクションの生成を担当します。その後、ThinLTODefaultPipeline
が実行され、コンパイラはファットオブジェクトファイルを生成できます。
制限事項¶
リンカ¶
現在、LLVMファットLTOオブジェクトを使用したLTOは、LLDとLLVM goldプラグインを介したGNUリンカによってサポートされています。これは将来的に変更される可能性がありますが、他のリンカへのサポート拡張は今のところ計画されていません。
サポートされているファイル形式¶
現在の実装では、ELFファイルのみがサポートされています。COFF
やMach-O
のような他のオブジェクトファイル形式をサポートすることが有用かどうかは、執筆時点では不明です。
使用方法¶
Clangユーザーは、-flto
または-flto=thin
と共に-ffat-lto-objects
を指定できます。-flto
オプションがない場合、-ffat-lto-objects
は無効です。
FatLTOを使用してオブジェクトファイルをコンパイルする
$ clang -flto -ffat-lto-objects example.c -c -o example.o
LTOを使用せずに、ファットオブジェクトのオブジェクトコードを使用してリンクします。 -fno-lto
が指定されている場合、これは-ffat-lto-objects
を無操作にします
$ clang -fno-lto -ffat-lto-objects -fuse-ld=lld example.o
あるいは、ファットオブジェクトでLTOへの参照をすべて省略し、標準のリンカの動作を維持することもできます
$ clang -fuse-ld=lld example.o
フルLTOでファットオブジェクトのLLVMビットコードを使用してリンクする
$ clang -flto -ffat-lto-objects -fuse-ld=lld example.o # clang will pass --lto=full --fat-lto-objects to ld.lld
シンLTOでファットオブジェクトのLLVMビットコードを使用してリンクする
$ clang -flto=thin -ffat-lto-objects -fuse-ld=lld example.o # clang will pass --lto=thin --fat-lto-objects to ld.lld