Everything

 

-whole_program


コンパイル・オプション / 最適化オプション

[指定形式]

-whole_program

[詳細説明]

-

コンパイル対象ファイルがプログラム全体であることを仮定し、コンパイル対象ファイル全てをマージして大域最適化を実施します。

[備考]

-

本オプションを指定した場合は、C++言語ソースファイルを入力ファイルに含めないでください。

-

本オプションを指定した場合は、-lang=cpp および -lang=ecppを指定しないでください。

-

本オプションを指定した場合、ip_optimizeオプションが有効になります。さらに複数のソースファイルを入力した場合は、merge_filesオプションが有効になります。

-

本オプションを指定した場合、コンパイラは以下の条件を満たすことを前提にコンパイルを行います。条件を満たさない場合の動作は保証しません。

- コンパイル対象ファイル内で定義されたextern変数の内容及びアドレスが、コンパイル対象ファイル以外で設定及び参照されることはない

-コンパイル対象ファイル内からコンパイル対象ファイル以外の関数を呼び出したとしても、呼び出された関数からコンパイル対象ファイル内の関数が呼ばれることはない

[例]

 
[wp.c]
extern void g(void);
int func(void)
{
    static int a = 0;
    a++;      // (1) aに値を書き込む。
    g();      // (2) g()を呼び出す。
    return a; // (3) aを読み出す。
}
 
[whole_program指定なし]
関数g()は関数func()を呼び出す可能性があるので、(2)の実行で変数aは書き換わるとみなし、(3)ではaの値を読み出すコードを生成します。
_func:
        PUSH.L R6
        MOV.L  #__$a$1,R6
        MOV.L  [R6],R14
        ADD    #1,R14
        MOV.L  R14,[R6]     ; (1)
        BSR    _g           ; (2)
        MOV.L  [R6],R1      ; (3)
        RTSD   #4,R6-R6
 
[whole_program指定あり]
関数g()は関数func()呼び出さないとみなすため、(2)の実行で変数aは不変と判断します。これを利用し、(3)ではaの値を読み出さず、代わりに(1)でaに書き込んだ値を使用するコードを生成します。
_func:
        PUSH.L R6
        MOV.L  #__$a$1,R14
        MOV.L  [R14],R6
        ADD    #1,R6
        MOV.L  R6,[R14]     ; (1)
        BSR    _g           ; (2)
        MOV.L  R6,R1        ; (3)
        RTSD   #4,R6-R6