Mesa、LTOビルドを明示的に禁止
長年の課題に終止符を打つ決断。Mesaがついに、LTO(Link-Time Optimization)でのビルドを禁止した。性能向上の代償は、誰も追えないバグだった。
2026年2月上旬、Mesaプロジェクトに重要なマージリクエストが統合された。Mesonビルドシステムが、LTOフラグを検出すると明確にエラーを出すようになる。
メッセージは端的だ。「Building Mesa with LTO is not supported. Please disable LTO for building Mesa.」
これは「お願い」から「禁止」への格上げである。
デバッグ不可能なバグとの戦い
LTOは、リンク時に全体最適化を行うコンパイラ技術だ。通常のコンパイルでは、ソースファイルを一つずつ機械語に変換し、最後にリンカがそれらを結合する。最適化はファイル単位でしか行えない。
LTOは違う。コンパイル時に機械語ではなく、コンパイラの中間表現(Intermediate Representation、IR)を生成する。GCCならGIMPLEバイトコード、LLVMならLLVMビットコードだ。そしてリンク時に、プログラム全体を一つの巨大なモジュールとして扱い、ファイルを跨いだ最適化を行う。
関数のインライン化、未使用コードの削除、メモリレイアウトの最適化。通常では不可能な最適化が可能になる。
結果、5〜15%の性能向上と、4〜5%のサイズ削減が期待できる。数字だけ見れば魅力的だ。
しかし、Mesaにとってこれは悪夢だった。
中間表現という呪い
問題の核心は、LTOが生成するバイナリの性質にある。
通常のバイナリなら、デバッガで関数の呼び出しを追跡できる。変数の値を確認できる。ブレークポイントを設定できる。だがLTOで最適化されたバイナリは違う。
リンク時の最適化によって、関数は別の場所にインライン化され、変数は最適化で消え、コードの構造は大きく変形する。元のソースコードとの対応関係は失われ、デバッグ情報は意味をなさなくなる。
これが「LTO performs heavy memory optimizations that break debugging」と言われる理由だ。
マージリクエストの説明文はこう述べている。「LTOは長年にわたり、ランダムで、デバッグ不可能なバグを引き起こしてきた」
バグが出ても、どこで何が起きているのか特定できない。スタックトレースは崩れ、変数の値は追えず、再現性も不安定。開発者は暗闇の中で手探りするしかなかった。
2018年のGentooのバグレポートには、LTOビルドでglFlushへの未定義参照エラーが発生した記録が残る。2019年には「GDMが起動しない」というバグが報告された。いずれも原因の特定は困難を極めた。
Mesaの開発チームは、長年この問題と向き合ってきた。LTO関連のバグレポートが来るたびに、彼らは同じ対応を繰り返した。
「WONTFIX please disable LTO instead」
直さない。代わりにLTOを無効にしてくれ。
あるGitHubのコメントには、こう書かれている。「Do NOT use LTO with Mesa. We don't support it and it is very likely to cause inexplicable issues.」
明確さという選択
今回の決定は、その方針を仕様として固定したものだ。
「ユーザーとパッケージャーに明確にしよう。これ以上、追跡不可能なバグレポートに時間を使わせないために」
開発リソースは有限だ。再現不可能なバグの報告に時間を奪われるより、実際に修正できる問題に注力したい。LTOを禁止することで、少なくとも「LTOが原因かもしれない」という不確実性は排除できる。
興味深いのは、完全に道を閉ざしたわけではない点だ。
どうしてもLTOを使いたい人のために、「allow-broken-lto」というオプションが用意された。名前が雄弁だ。「壊れたLTO」を許可する。つまり、これを使う者は、自己責任で不安定な領域に足を踏み入れることになる。
このオプション名には、開発者の本音が滲む。
性能か、安定性か
LTOをめぐる議論は、古くからある。
コミュニティでは、「Mesaに-march=nativeと-fltoを付けたが、性能向上は見られなかった」という報告もあれば、「MIPS32のソフトウェアレンダリングで50%の性能向上が見られた」という報告もある。効果は環境によってまちまちだ。
2016年のメーリングリストには、「glxgearsで1%の性能向上」という報告がある。一方で「-fltoはデバッグを不可能にする」という警告も添えられていた。
確実なのは、LTOによる最適化の恩恵を受けるのは、主にCPU性能が低い環境だということ。ハイエンドのマシンでは、元から十分速い。
一方、デバッグの困難さは、環境を選ばない。
Mesaの開発チームは、全体を見て判断した。一部のユーザーの性能向上より、全体の安定性とメンテナンス性を選んだ。曖昧な「推奨しません」ではなく、明確な「禁止」という形で意思を示した。
ArchLinuxのAURパッケージ管理者は、「arch-mesonがデフォルトでLTOを有効にする設定に同意できない」と述べている。Mesaに関しては、彼らの懸念が正しかった。
将来への扉
マージリクエストの最後には、こんな一文が添えられている。
「GCCやLLVM/ClangのLTOサポートが改善されれば、いつかこのチェックを見直せるかもしれない」
扉は閉じられたが、鍵はかかっていない。
コンパイラの技術が進化し、LTOがデバッグ可能なものになれば、再び検討の余地はある。デバッグ情報を保持したまま最適化する技術、中間表現から元のソースへの正確なマッピング、より安定したリンク時最適化。
それまでは、明確さと安定性を優先する。
ソフトウェア開発には、こういう判断がつきまとう。理想を追うのか、現実を取るのか。
Mesaは、現実を選んだ。
参照元
https://www.phoronix.com/news/Mesa-No-Build-LTO Phoronixの報道
https://gitlab.freedesktop.org/mesa/mesa/-/merge_requests/39671 Mesaマージリクエスト
他参照
https://gist.github.com/Venemo/a9483106565df3a83fc67a411191edbd GitHub上のMesaビルドガイド
https://github.com/InBetweenNames/gentooLTO/issues/143 2018年のLTO関連バグ報告
https://bugs.freedesktop.org/show_bug.cgi?id=110884 2019年のGDM起動問題
いいなと思ったら応援しよう!
記事が役に立ったと感じていただけたら、チップで応援いただけると嬉しいです。いただいた支援は、より深い調査と分析のための時間に充てさせていただきます。灯台を灯し続けるための燃料になります。