問題タブ [lto]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - サイズ最適化オプション
開発者がすべての h および c ファイルを ac ファイルに含めるオプションを選択した組み込みプロジェクトを整理しようとしています。その後、-whole-program オプションを使用してその 1 つのファイルだけをコンパイルして、適切なサイズの最適化を得ることができます。
私はこれが嫌いで、これを LTO を使用して同じことを達成する従来のプログラムにすることを決意しています。
開発キットに含まれるバージョンは次のとおりです。aps-gcc (GCC) 4.7.3 20130524 (Cortus) GNU ld (GNU Binutils) 2.22
1 つの .o ファイルの .text は 0x1c7ac で、67 個の .o ファイルに分割されます。
--gc-sections を試し、リンカー プラグイン オプションを使用しましたが、それ以上の改善はありませんでした。
何か提案がありますか? LTO から適切な改善が見られますか?
cmake - clangによるcmakeリンク時間の最適化
私はclangでLTOを使用しようとしています(cmakeを使用):フラグ-emit-llvm
はコンパイル時に設定され、出力は-c
フラグで生成されるため、LLVMビットコードが結果になります。問題は、cmake が「.o」サフィックスの結果を返すことですが、「.bc」が必要です。this: を使用する他のコードを見つけましset(CMAKE_C_OUTPUT_EXTENSION .bc)
たが、機能しませんでした。
c - clang、lto、機能削除防止
リンク時最適化 ( lto ) とO2最適化レベルを使用して、変更されたバージョンのclangでプロジェクトをコンパイルしています。O0 と O1 は問題なく動作していますが、残念ながら O2は関数の呼び出しをいくつか削除しています。特定の関数を省略するように最適化に指示する方法はありますか? 私はすでに変数を使用しようとしましたが、成功しませんでした。volatile
__attribute__ ((optimize("0")))
llvm IR レベルで直接のみ利用可能なソリューションも歓迎します。
編集:状況をもう少し詳しく説明する必要があるかもしれません。変更された clang は、clang と共にビルドされるカスタム ランタイム ライブラリへの呼び出しを追加します。この挿入された呼び出しの一部は、最適化されて取り除かれます。
gcc - リンク時の最適化を使用する場合、GCC にセクションを強制的に保持させる
struct
GCC によって特別なセクションにコンパイルされ、リンカー スクリプトを介して出力バイナリの先頭に配置されるCがあります。先頭にマジック値を含むファイル メタデータが含まれます。
構造体として文字列のみを使用した簡単な例を次に示します。
でわかるように、GCC はこの値を独自のセクションに配置しますreadelf -S
。
(セクション 4 に注意してください。)
ここで、GCC 呼び出しに指定する-flto
と、このセクションは出力されなくなります。
リンカー スクリプトがセクションを見つけられず、.the_header
バイナリが破損します。
__attribute__((used))
ヘッダー変数を指定しようとしましたが、効果はありません。
リンカー スクリプトの関連部分は次のとおりです。
.the_header
リンク時の最適化と上記のリンカー スクリプト スニペットを使用する場合、GCC に最終的なバイナリを出力するように指示するにはどうすればよいですか?
c++ - LLVM と CMake による LTO
共有ライブラリを作成する CMake プロジェクトで LLVM を使用してリンク時の最適化を適用しようとしています。私の質問はこれとほとんど同じです:
CMake を使用して GCC と Clang/LLVM を切り替える。
llvm-ld
ただし、新しいバージョンには存在しないため、回答はもう適用できないようです。コマンド ラインで、次のコマンドを実行して LTO を取得します (.cpp
ファイルが 2 つしかない場合)。
バイトコードにコンパイル:
リンクバイトコード:
バイトコードを最適化:
バイト コードを共有オブジェクトに変換します。
CMake で追加の手順を実行する方法を教えてください。
c - GCC LTO が関数を削除できないようにする
GCC-ARM-Embedded と FreeRTOS を使用しています。FreeRTOS には、vTaskSwitchContext()
一部のインライン アセンブラ コードでのみ使用される機能があります。
問題は次のとおりです。LTO を使用すると、GCC はインライン アセンブラー コードを考慮せず、関数が使用されていないと判断して削除します。インライン アセンブラー コード内の関数呼び出しを解決できないため、リンカーは失敗します。
応募します__attribute__((used))
が、FreeRTOS コード (STM32CubeMX によって生成されます) には触れたくありません。
これをコードに入れてみましたが、実際にはGCCはこれが機能しないほどスマートです:
別のソース ファイルで、またはパラメーターを介して、この関数を削除しないことを GCC に伝える方法はありますか?
例