レガシー ABI 互換性およびインターオペラビリティー
レガシー ABI 互換性およびインターオペラビリティー。
setjmp ()、 longjmp ()、 sigsetjmp ()、 siglongjmp ()、 _setjmp ()、 _longjmp () (_R)、 getcontext ()、 setcontext ()、 makecontext ()、および スワップ・コンテキスト ()などのインターフェースの性質により、不揮発性マシン状態を保存および復元する必要があるため、レガシー ABI モジュールとベクトル拡張 ABI モジュールの間の依存関係を考慮する際にリスクが生じます。 問題を複雑にするために、 libc の setjmp ファミリーの関数は、 libcの静的メンバーに常駐します。これは、既存のすべての AIX® バイナリーに、リンク先の AIX® のバージョンで存在していた setjmp の静的にバインドされたコピーがあることを意味します。 さらに、既存の AIX® バイナリーには、追加の不揮発性ベクトル・レジスター状態を格納するには不十分な jmpbufs および ucontext データ構造定義があります。
前のバージョンのモジュールと新規モジュールが呼び出しまたはコールバックをインターリーブする場合で、前のバージョンのモジュールが、ベクトル拡張モジュールの通常のリンケージ規約をバイパスする longjmp () または setcontext () を実行する可能性がある場合は、不揮発性 VR 状態になるリスクがあります。
このため、 AIX® ABI は不揮発性 VR を定義しますが、 AIX® コンパイラーでベクトル (AltiVec) を使用する場合のデフォルトのコンパイル・モードは、不揮発性 VR を使用しません。 これにより、デフォルトのコンパイル環境が安全にベクトル (AltiVec) を利用できるようになりますが、前のバージョンのバイナリーとのインターオペラビリティーに関するリスクは生じません。
インターオペラビリティーとモジュール依存性が完全に認識されているアプリケーションの場合、不揮発性 VR の使用を可能にする追加のコンパイル・オプションを使用可能にすることができます。 このモードを使用する必要があるのは、すべての従属する前のバージョンのモジュールおよび動作が完全に認識され、 setjmp ()、 sigsetjmp ()、 _setjmp ()、または getcontext ()などの関数に依存していないか、すべてのモジュール遷移が通常のサブルーチン・リンケージ規約によって実行され、アップストリームの前のバージョン・モジュールへのコールバックが使用されていないことを確認する場合のみです。
この方法により、完全に安全なベクトル・モード (AltiVec) を利用できます。これはデフォルト・モードですが、リスクが判明している場合には、不揮発性レジスターを使用して明示的な調整とさらなる最適化を行うこともできます。 また、将来のための柔軟な ABI とアーキテクチャーも提供します。
デフォルトの AltiVec コンパイル環境は、「 AltiVec プログラミング・インターフェース・マニュアル」で説明されているように、 __VEC__を事前定義します。
不揮発性 VR を使用するオプションが使用可能になっている場合は、コンパイル環境も __EXTABI__を事前定義する必要があります。 これは、不揮発性 VR を使用できるようになっているベクトル対応モジュールと対話する非ベクトル対応モジュールをコンパイルまたは再コンパイルするときにも定義する必要があります。