GCC LTOはクロスファイルのデッドコード削除を実行しますか?
質問
関数を持っていると言う
void do_something() {
//....
#ifdef FEATURE_X
feature_x();
#endif
//....
}
.
私は問題なくコンパイルして実行することができます。私がフィーチャを渡すことができれば私は-D FEATURE_X
を渡すことができます。
しかし、do_something
を別のファイルに置きたいのであれば(オプションを変更するたびにそのファイルを再コンパイルする必要はありません)。同じファイルにあった場合は、
const int FEATURE_X=0;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
.
はデッドコードの削除を正しく使用し、呼び出しを排除します。LTOなしで、これを別のファイルに入れた場合、
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
.
コードを削除しません(知っていません)。そのため、リンク時最適化が有効になっている場合は、リンク時にFEATURE_X
の値を検出し、コードが使用されているかどうかを判断し、必要に応じて削除することができますか?
解決
GCCはクロスモジュール到達不能関数の取り外しを行いますが、Feature_xの定数値は遅すぎるため、最後のテストケースでコードが死んでいることはできません。
-D Wayを使用するか、const int FEATURE_X=0;
をすべてのモジュールに入れた場合は、YESでは除去されます。
他のヒント
参照コードの代わりに:
extern const int FEATURE_X;
void do_something() {
//....
if(FEATURE_X) {
feature_x();
}
//....
}
.
リンク時間変数がそのようなリンク時間変数で行われた場合はどうなります。
extern const int FEATURE_X;
void do_something() {
//....
if(NULL != &FEATURE_X) {
feature_x();
}
//....
}
.
その後、リンカ命令ファイルで、
を定義します。define exported symbol FEATURE_X = 0x0
.
リンク時にそれを最適化するための方法はありますか?
所属していません StackOverflow