(SPARC) データの境界整列についてコンパイラが使用する想定を制御するには、-xmemalign オプションを使用します。境界整列が潜在的に正しくないメモリーアクセスにつながる生成コードを制御し、境界整列が正しくないアクセスが発生したときのプログラム動作を制御すれば、より簡単に SPARC にコードを移植できます。
想定するメモリー境界整列の最大値と、境界整列に失敗したデータがアクセスされた際の動作を指定します。a (境界整列) と b (動作) の両方の値が必要です。a は、想定する最大メモリー境界整列です。b は、境界整列に失敗したメモリーへのアクセスに対する動作です。
コンパイル時に境界整列が判別できるメモリーへのアクセスの場合、コンパイラはそのデータの境界整列に適したロードおよびストア命令を生成します。
境界整列がコンパイル時に決定できないメモリーアクセスの場合、コンパイラは、境界整列を想定して、必要なロード/ストア命令のシーケンスを生成します。
実行時の実際のデータ境界整列が指定された整列に達しない場合、境界整列に失敗したアクセス (メモリー読み取りまたは書き込み) が行われると、トラップが発生します。このトラップに対して可能な応答は 2 つあります。
OS がトラップを SIGBUS シグナルに変換します。プログラムがこのシグナルを捕捉しなかった場合、プログラムは異常終了します。プログラムがシグナルを捕捉しても、境界整列に失敗したアクセスが成功するわけではありません。
境界整列に失敗したアクセスが正常に成功したかのように OS がアクセスを解釈し、プログラムに制御を戻すことによってトラップを処理します。
次に、-memalign の境界整列と動作の値を示します。
表 A–38 -xmemalign の境界整列と動作の値
a |
b | ||
---|---|---|---|
1 |
最大 1 バイトの境界整列 |
i |
アクセスを解釈し、実行を継続する |
2 |
最大 2 バイトの境界整列 |
-s |
シグナル SIGBUS を発生させる |
4 |
最大 4 バイトの境界整列 |
f |
-xarch=v9 の不変式の場合にのみ、 4 バイト以下の境界整列に対してシグナル SIGBUS を発生させ、それ以外ではアクセスを解釈して実行を継続する。そのほかすべての -xarch 値では、f フラグは i と同じです。 |
8 |
最大 8 バイトの境界整列 | ||
16 |
最大 16 バイトの境界整列 |
b を i か f のいずれかに設定してコンパイルしたオブジェクトファイルにリンクする場合は、必ず、-xmemalign を指定する必要があります。「3.3.3 コンパイル時とリンク時のオプション」に、コンパイル時とリンク時の両方に指定する必要があるコンパイラオプションの全一覧をまとめています。
次のデフォルトの値は、-xmemalign オプションがまったく指定されていない場合にのみ適用されます。
-xmemalign=8i すべての v8 アーキテクチャーに適用される。
-xmemalign=8s すべての v9 アーキテクチャーに適用される。
次に、-xmemalign オプションが指定されているが値を持たない場合のデフォルト値を示します。
-xmemalign=1i すべての -xarch 値に適用される。
次の表は、-xmemalign で処理できるさまざまな境界整列の状況とそれに適した -xmemalign 指定を示しています。
表 A–39 -xmemalign の例
コマンド |
状況 |
---|---|
-xmemalign=1s |
すべてのメモリーアクセスの整列が正しくないため、トラップ処理が遅すぎる。 |
-xmemalign=8i |
コード内に境界整列されていないデータへのアクセスが意図的にいくつか含まれているが、それ以外は正しい |
-xmemalign=8s |
プログラム内に境界整列されていないデータへのアクセスは存在しないと思われる |
-xmemalign=2s |
奇数バイトへのアクセスが存在しないか検査したい |
-xmemalign=2i |
奇数バイトへのアクセスが存在しないか検査し、プログラムを実行したい |