Sun Studio 12: C ユーザーズガイド

B.2.93.2 -xipo=2 による内部手続き解析を行うべきでないケース

内部手続き解析では、コンパイラは、リンクステップでオブジェクトファイル群を操作しながら、プログラム全体の解析と最適化を試みます。このとき、コンパイラは、このオブジェクトファイル群に定義されているすべての foo() 関数 (またはサブルーチン) に関して次の 2 つのことを仮定します。

仮定 2. が当てはまらない場合は、コンパイルで -xipo=1 および -xipo=2 を使わないでください。

1 つの例として、独自のバージョンの malloc() で関数 malloc() に割り込むケースを考えてみましょう。-xipo=2 を使ってコンパイルする場合、その独自のコードとリンクされる malloc() を参照する、あらゆるライブラリのあらゆる関数のコンパイルで -xipo=2 を使用する必要があるとともに、リンクステップでそれらのオブジェクトファイルが必要になります。システムライブラリでは、このことが不可能な場合があるため、独自のバージョンの malloc は、-xipo=2 を使用してコンパイルしないでください。

もう 1 つの例として、別々のソースファイルにある foo() および bar() という 2 つの外部呼び出しを含む共有ライブラリを構築するケースを考えてみましょう。bar() は foo() を呼び出すと仮定します。foo() が実行時に割り込みを受ける可能性がある場合、foo() および bar() のソースファイルのコンパイルで -xipo=1-xipo=2 を使ってはいけません。foo() が bar() 内にインライン化され、不正な結果になる可能性があります。