2017-08-11 14 views
1

Cortex-M4ベースのマイクロコントローラ用に実行可能ファイルをarm-none-eabi-gccでコンパイルしています。パフォーマンスクリティカルでないコードは-Os(実行可能なコードサイズに最適化されています)と別の最適化フラグを持つパフォーマンスクリティカルなパーツでコンパイルされます。 -Og/-O2など異なる最適化されたオブジェクトファイルでGCC LTOを使用するには?

このようなビルドで-fltoを使用することは安全ですか?もしそうなら、どの最適化フラグをリンカーに渡すべきですか?オプションの最適化に関するGCC documentationによると

答えて

1

このような文がかなり曖昧である

あなたが同じオプションと同じリンクに参加しているすべてのファイルをコンパイル

ことをお勧めします。

コマンドラインの最適化とターゲットのオプションは今関数単位でストリーミングし、リンク時オプティマイザにより表彰されていますrelease notes of GCC 5を掘り下げる際にもかかわらず、いくつかの追加の詳細があります。この変更により、リンク時の最適化がファイルごとの最適化のより透明な置き換えになります。異なる翻訳単位(-ffast-math、-mavx、-f​​inlineなど)に対して異なる最適化設定を必要とするプロジェクトを構築することが可能になりました。

もフラグは、このような制限の影響を受けているかについてとされていない情報:これは属性のみを最適化し、ターゲットに渡すことができ、これらのコマンドラインオプションに適用されることを

注意。グローバルコード生成(-fpicなど)、ワーニング(-Wodrなど)、静的変数の最適化方法(-fcommonなど)、デバッグ出力(-gなど)に影響を与える最適化、 paramパラメータは、リンク時最適化ユニット全体にのみ適用できます。このような場合は、コンパイル時とリンク時の両方で同じオプションを常に使用することをお勧めします。あなたのシナリオでは

、最適化フラグ-Og-O2-Osは、最適化の属性として渡すことができ、コンパイル時とリンク時のフラグが同じであるべきケースに分類されません。ですから、そのようなビルドでは-fltoを使用するのが安全です。最適化のリリースノートに記載されているように、リンク時に渡されるフラグ、について

:GCCは、以前のリリースへ

反しては、リンクコマンドラインに渡さ最適化し、ターゲットオプション は無視されます。

GCCは、どの最適化レベルを使用するかを自動的に決定します。これは、オブジェクトファイルのコンパイル時に使用される最高レベルです。したがって、-O最適化オプションをリンカーに渡す必要はありません。

+0

うわー、これは素晴らしいことです。それを見つけてここに投稿していただきありがとうございます。これはGCC 6と7にも当てはまりますか? – Venemo

+0

@Venemo GCC 6および7の変更ログやその他の関連文書で、この動作が変更されたとは言いませんでした。したがって、おそらくGCCの新しいバージョンにも当てはまります。 – Pyves

+1

ありがとうございました!私はあなたの答えを受け入れたとマークしました! – Venemo