リンク時最適化(LTO)

Note

SOLID 3.3.0 以降で使用できます。

概要

LTOでは、リンク時に最適化を行うことで、モジュール間の解析に基づいた最適化を実行できます。 これによって、コンパイル単位(ソースファイル単位)の解析に基づいたコンパイル時最適化と比較し、パフォーマンスの向上やコードサイズの減少が期待できます。

最もわかりやすいのは、コンパイル時最適化では不可能な、コンパイル単位をまたいだインライン展開がLTOによって可能となります。ただし、LTO自体は不要となった関数や変数を削除はしないので、そのような不要コードを削減したい場合はリンカオプションに --gc-sections を指定してください。その際には -ffunction-sections-fdata-sections オプションを併用すると、より効果的な不要コードの削除が期待できます。

一般的に、大規模なソフトウェアに対してリンク時最適化を行う場合、非常に多くのメモリ資源と時間を消費する傾向があるため、 開発PCのスペックによっては、メモリ不足やビルド時間の大幅な増加が問題となる可能性があります。この問題を緩和するため、 Clang/LLVMでは、ThinLTO と呼ばれるリンク時最適化の手法をサポートしており、メモリや計算リソース消費の増加を抑えながらパフォーマンスの向上が期待できます。

SOLIDのツールチェーンでは、この ThinLTO を推奨しており、LTOのデフォルトに設定しています。
ThinLTO の詳細は、 ThinLTO: Scalable and Incremental LTO を参照してください。

注意

コンパイラの最適化を抑制するために変数や関数を別ファイルに分割するという手法が、LTO有効時には期待通り動作しなくなります。(ファイルを分けても、インライン展開などが発生し、不要と判断された関数呼び出しや変数へのアクセスが削除されてしまう可能性があります。) そのような場合にはvolatile修飾子やLTOを無効にするコンパイラオプション( -fno-lto )などを適切に使用するように修正してください。


使い方

プロジェクトのプロパティ ‣ プログラムの最適化 ‣ リンク時最適化 から選択してください。推奨は ThinLTO です。

Note

リンク時最適化を有効にすると、自動的にlldリンカが使用されるようになります。


制限事項

アプリケーション プロジェクト内のコードは最適化されません。