GCC LTOはクロスファイルのデッドコード削除を実行しますか?

StackOverflow https://stackoverflow.com//questions/12715286

  •  13-12-2019
  •  | 
  •  

質問

関数を持っていると言う

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
.

リンク時にそれを最適化するための方法はありますか?

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top