[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

17.3 記憶領域のレイアウト

以下に示すテーブルでは、データのサイズやアラインメントをビット単位で 表すマクロの定義を示している。注意して欲しいのは、 これらのマクロは定数である必要はないということである。 target_flags のような静的変数を参照する C の式でもかまわないのである。 See section 実行時ターゲット指定.

BITS_BIG_ENDIAN

バイトの中で最上位のビットが最下位の数を保持しているなら、このマクロを 1 に定義する。そうでなければ、0 に定義する。 1 に定義した場合は、ビットフィールド命令はビットを最上位ビットから 数える。 ビットフィールド命令がない場合でも、このマクロは定義しなければ ならない。その場合は、どんな値に定義してもかまわない。 このマクロは定数である必要はない。

このマクロは、構造体のフィールドがバイトまたはワードにどのように 詰め込まれるかには影響しない。それは、BYTES_BIG_ENDIAN に より制御される。

BYTES_BIG_ENDIAN

ワードの中の最下位バイトが最下位の数を保持しているなら、このマクロを 1 に 定義する。このマクロは定数である必要はない。

WORDS_BIG_ENDIAN

複数のワードからなるデータ中で最上位のワードが最下位の数を保持しているなら、 このマクロを 1 に定義する。 これは、メモリとレジスタの両方に適用される。GNU CC は基本的に、 メモリ中のワードの順番とレジスタ中のワードの順番が同じであると 仮定している。 このマクロは定数である必要はない。

LIBGCC2_WORDS_BIG_ENDIAN

WORDS_BIG_ENDIAN が定数でない場合はこのマクロを定義する。 これは WORDS_BIG_ENDIAN と同じ意味を持つ定数値でなければならない。 この値は、CPP マクロに基づいて設定されることが多い。

FLOAT_WORDS_BIG_ENDIAN

DFmode または XFmodeTFmode の浮動小数点数が メモリ中に格納されるときに、符号ビットを含むワードが最下位アドレスに 置かれる場合は、このマクロを値 1 として定義する。 このマクロが定数である必要はない。

メモリ中に格納されるワードの順序が、複数ワードの整数の場合と同じなら、 このマクロを定義する必要はない。

BITS_PER_UNIT

アドレス可能な格納単位(バイト)中のビット数を定義するマクロである。 通常は 8 になる。

BITS_PER_WORD

ワードのビット数。普通は 32 である。

MAX_BITS_PER_WORD

ワード中の最大ビット数。定義されていない場合は、デフォルトで BITS_PER_WORD になる。定義する場合は、 BITS_PER_WORD が実行時に取りうる最大値である定数値とする。

UNITS_PER_WORD

ワード中の格納単位数。普通は 4 である。

MIN_UNITS_PER_WORD

ワード中の格納単位の最小数。定義されていない場合は、デフォルトで UNITS_PER_WORD になる。定義する場合は、 UNITS_PER_WORD が実行時に取りうる最小値となる定数値とする。

POINTER_SIZE

ポインタの幅をビット数で表す。Pmode の幅よりも大きな値を 指定してはならない。Pmode の幅と同じでない場合は、 POINTERS_EXTEND_UNSIGNED を定義しなければならない。

POINTERS_EXTEND_UNSIGNED

C の式で、その値は、POINTER_SIZE ビット幅から Pmode に 拡張する必要があるポインタがゼロ拡張されるならゼロでない値とし、 符号拡張されるなら 0 とする。

POINTER_SIZEPmode の幅に同じならこのマクロを定義する 必要はない。

PROMOTE_MODE (m, unsignedp, type)

あるオブジェクトが、型が type であり、指定されたモード m と 符号 unsignedp を持ち、レジスタに格納されることになっているなら、 このマクロは munsignedp を更新する。

多くの RISC マシンでは、全ワードに対して操作を行なう演算しか持っていないので、 mBITS_PER_WORD よりも幅の狭い整数モードなら このマクロで mword_mode に設定するように定義する。 大部分の場合、整数モードの場合だけ拡幅すべきである。 何故なら、精度の高い浮動小数点演算は、普通は精度の低いものより高くつく からである。

多くの機種では、このマクロの定義で unsignedp を変えることはしていない。 だが、機種によっては特定のモードについては符号付きか符号なしかのどちらかの 量を優遇する命令を持っている。 例えば、DEC Alpha では、メモリからの 32ビットのロードと 32ビットの加算命令は 結果を 64 ビットに符号拡張する。 そういう機種では、どちらの拡張が効率が良いかにしたがって unsignedp を 設定するようにする。

m を更新することが絶対にないのであればこのマクロは定義しないこと。

PROMOTE_FUNCTION_ARGS

PROMOTE_MODE で記述される格上げを関数の出力(?)引数に対しても 行なうべきなら、このマクロを定義する。

PROMOTE_FUNCTION_RETURN

PROMOTE_MODE で記述される格上げを関数の戻り値に対しても 行なうべきなら、このマクロを定義する。

このマクロが定義されるなら、FUNCTION_VALUEPROMOTE_MODE によりなされるのと同じ格上げを実行しなければならない。

PROMOTE_FOR_CALL_ONLY

PROMOTE_MODE で記述される格上げを、 関数の出力引数か関数の戻り値に対してのみPROMOTE_FUNCTION_ARGSPROMOTE_FUNCTION_RETURN で 指定されているように、行なうべきなら、このマクロを定義する。

PARM_BOUNDARY

スタック上の関数のパラメータに通常必要とされるアラインメントを ビット数で表す。 スタックに置かれるパラメータは全て、データ型によらず、少なくともこの 量だけのアラインメントが取られる。 多くのマシンでは、この大きさは整数の大きさと同じである。

STACK_BOUNDARY

スタックポインタに保証されているアラインメントがあるなら、このマクロを 定義する。定義は、望まれるアラインメントをビット単位で表す C の式とする。 この値は、PREFERRED_STACK_BOUNDARY が定義されていない場合の デフォルトとして使われる。

PREFERRED_STACK_BOUNDARY

スタックポインタについて一定のアラインメントを保持したいのであれば このマクロを定義する。 定義は、望ましいアラインメントをビット数で表す C の式とする。 STACK_BOUNDARY も定義されている場合は、このマクロを評価したなら、 STACK_BOUNDARY 以上の値になるようにしなければならない。

PUSH_ROUNDING が定義されていなければ、スタックは常に指定された 境界に整合される。 PUSH_ROUNDING が定義されていて、アラインメントの制限の指定が PREFERRED_STACK_BOUNDARY より緩ければ、スタックは引数をプッシュして いる間一時的に整合が取られないことがある。

FUNCTION_BOUNDARY

関数の入り口点で必要とされるアラインメントをビット数で表す。

BIGGEST_ALIGNMENT

対象機種で任意のデータ型が要求するうちで最大のアラインメントを ビット数で表したもの。

MINIMUM_ATOMIC_ALIGNMENT

定義されていれば、最小のアラインメントをビット数で表したものである。 これは、隣り合うオブジェクトを煩わせることなく、一回の操作で 参照可能なオブジェクトに与えることができるものである。 通常、BITS_PER_UNIT になるが、 バイト単位あるいはハーフワード単位のストア演算がないマシンではもっと 大きくなりうる。

BIGGEST_FIELD_ALIGNMENT

この機種で任意の構造体のフィールドが要求するアラインメントを ビット数で表したもの。 これが定義されていると、構造体のフィールドに関しては BIGGEST_ALIGNMENT に優先する。

ADJUST_FIELD_ALIGN (field, computed)

通常の方法で計算したアラインメントが computed である場合の、 ある構造体フィールド field のアラインメントを表す式。 GNU CC は、これが定義されていれば、構造体のフィールドに限って、 BIGGEST_ALIGNMENTBIGGEST_FIELD_ALIGNMENT の値の 代わりにこの値を使う。

MAX_OFILE_ALIGNMENT

対象機種向けのオブジェクトファイル形式でサポートされている 最大のアラインメント。 このマクロで、__attribute__ ((aligned (n))) という構文を使って 指定できるアラインメントを制限する。 これが定義されていない場合は、デフォルト値は BIGGEST_ALIGNMENT に なる。

DATA_ALIGNMENT (type, basic-align)

定義するなら、静的メモリ領域に置かれる変数のアラインメントを 計算する C の式とする。 type はデータの型であり、basic-align はそのオブジェクトが 通常持つであろうアラインメントである。通常のアラインメントの 代わりに、このマクロの値を使ってそのオブジェクトのアラインメントを取る。

このマクロが定義されなければ、basic-align が使われる。

このマクロの使い道は、一つには、 より少ないキャッシュラインに収まるように、 中間の大きさのデータのアラインメントを大きくすることにある。 もう一つの使い方は、文字の配列をワード境界に整合することを 強制することで、定数を文字配列にコピーするような strcpy の呼び出し をインライン展開可能にすることにある。

CONSTANT_ALIGNMENT (constant, basic-align)

メモリに置かれる定数に与えるべきアラインメントを計算する C の式を 定義する。constant が定数で、basic-align が そのオブジェクトの通常のアライメントである。 このマクロの値が、上記のアラインメントの代わりに、このオブジェクトを 整合境界に置くのに使われる。

このマクロが定義されていなければ、basic-align が使われる。

このマクロの典型的な使い方は、文字列定数をワード境界に整合することを 強制することで、定数をコピーする strcpy の呼び出し をインライン展開可能にすることにある。

LOCAL_ALIGNMENT (type, basic-align)

定義されていれば、一個の C の式であり、局所的なメモリ領域に置かれる 変数のアラインメントを計算する。type はデータ型であり、 basic-align はそのオブジェクトが通常取るであろうアラインメントである。 このマクロの値が、上記のアラインメントの代わりに、このオブジェクトを 整合境界に置くのに使われる。

このマクロが定義されていない場合は、basic-align が使われる。

このマクロの使い道の一つは、中間の大きさのデータのアラインメントを より少ないキャッシュ・ラインに全て収まるように大きくすることである。

EMPTY_FIELD_BOUNDARY

int : 0; のような空のビットフィールの後に続くビットフィールドに 指定すべきビット単位のアラインメントである。

PCC_BITFIELD_TYPE_MATTERSもまた、空のビットフィールドから生じる アラインメントに影響を及ぼすことに注意してほしい。

STRUCTURE_SIZE_BOUNDARY

構造体や共用体の大きさが、その倍数になるべきビット数。 各構造体や共用体の大きさは、この定数の倍数に切り上げられる。

このマクロを定義しない場合は、デフォルトは BITS_PER_UNIT と 同じになる。

STRICT_ALIGNMENT

指定されたデータが満足すべきアラインメントにあっていない場合、 命令が正しく動作しないなら、このマクロの値を 1 に定義する。 命令が単に遅くなるだけなら、0 に定義する。

PCC_BITFIELD_TYPE_MATTERS

ビットフィールドとビットフィールド含む構造体のアラインメントの扱いを、 他の多くの C コンパイラが取っている方法に合わせる場合は、このマクロを 定義する。

この場合の動作は、ビットフィールドに指定した型(intshort、 またはその他の整数型)が、構造体全体のアライメントに制約を課す。 これは、その構造体が、その型の普通の(ビットフィールドではない)フィールドを 持っているかのようになる。 さらに、このビットフィールドは、その普通のフィールド内に収まるように 構造体内で配置される。普通のフィールドの境界を越えることはない。

つまり、多くの機種では型が int のビットフィールドは4バイト境界を 越えることはないし、構造体全体のアライメントは4バイトに強制される。 (実際に使われる場合、このアライメントは 4 バイトでないこともある。 他のアラインメント関係のパラメータにより制御される。)

このマクロは、C の式として定義する。 この式の値が 0 でなければ上記の動作を有効にする。

このマクロが定義されていなかったり、値がゼロの場合は、 ビットフィールドの中にはアラインメント境界を越えるものもありうる。 メモリを直接参照できる、‘insv’ や ‘extv’、‘extzv’ insn が あれば、コンパイラはそのような参照をサポート出来る。

ビットフィールドを使えるようにするもう一つの有名な方法は、 STRUCTURE_SIZE_BOUNDARYBIGGEST_ALIGNMENT と 同じ大きさに定義することである。 そうすると、どの構造体もワード単位でアクセスできる。

対象の機種がビットフィールドを持っていないか、 STRUCTURE_SIZE_BOUNDARY を上記のように定義しない限り、 PCC_BITFIELD_TYPE_MATTERS が 0 でない値を持つように しなければならない。

目的が、何か別のコンパイラで使われているビットフィールドの 配置規約と同じ規約を GNU CC に使わせることにあるなら、 以下に示す方法で、他のコンパイラがどうなっているかを調べることができる。 このプログラムをコンパイルして実行すれば良い。

 
struct foo1
{
  char x;
  char :0;
  char y;
};

struct foo2
{
  char x;
  int :0;
  char y;
};

main ()
{
  printf ("Size of foo1 is %d\n",
          sizeof (struct foo1));
  printf ("Size of foo2 is %d\n",
          sizeof (struct foo2));
  exit (0);
}

これが 2 と 5 を出力するなら、コンパイラの動作は PCC_BITFIELD_TYPE_MATTERS から得られるものである。

BITFIELD_NBYTES_LIMITED

PCC_BITFIELD_TYPE_MATTERS と同様だが、その効果は 構造体内のビットフィールドの整合に限られる。

ROUND_TYPE_SIZE (type, computed, specified)

このマクロは、一個の型(type により木ノードとして与えられる) 全体の大きさを表す式を定義する。 これを定義するのは、普通の方法で計算した大きさが computed であり、アラインメントがspecified と なっている場合である。

デフォルトは、computedspecified の倍数に切り上げる。

ROUND_TYPE_ALIGN (type, computed, specified)

このマクロは、一個の型(type により木ノードとして与えられる) のアラインメントを表す式を定義する。 これを定義するのは、通常の方法で計算したアラインメントが computed であり、明示的に指定されたアラインメントが specified となっている場合である。

デフォルトでは、specified の方が大きければそれを使う。 さもなければ、computedBIGGEST_ALIGNMENT の小さいほうを 使う。

MAX_FIXED_MODE_SIZE

実際に使われるべき最大整数のマシンモードの大きさをビット数で 表す整数式。 この大きさ以下の全ての整数マシンモードは、適切な大きさの構造体と 共用体に使うことができる。 このマクロが定義されていない場合は、GET_MODE_BITSIZE (DImode) が 仮定される。

STACK_SAVEAREA_MODE (save_level)

定義されていれば、enum machine_mode 型の式であり、 save_stack_level という名前付きパターン (see section RTL生成用標準パターン名) のセーブ領域オペランドのモードを指定する。 save_level は、SAVE_BLOCKSAVE_FUNCTIONSAVE_NONLOCAL のどれかであり、三つの名前付きパターンのうち、 どれのモードが指定されているかを選択する。

必ず Pmode を返すのであれば、このマクロを定義する必要はない。 このマクロを定義するのは、save_stack_level パターンが 32 ビットモードと 64 ビットモードの両方をサポートする必要がある場合が 一番多いだろう。

STACK_SIZE_MODE

定義されていれば、enum machine_mode 型の式であり、 allocate_stack という名前付きパターン(see section RTL生成用標準パターン名) のサイズ・インクリメント・オペランドのモードを指定する。

必ず word_mode を返すのであれば、このマクロを定義する必要はない。 このマクロを定義するのは、allocate_stack パターンが 32 ビットモードと 64 ビットモードの両方をサポートする必要がある場合が 一番多いだろう。

CHECK_FLOAT_VALUE (mode, value, overflow)

(double 型の)値 value がモード mode として有効か どうかを検査する C の式である。 対象とするターゲット機種のモード mode で表せる範囲の値に、 value が収まるかどうかを検査するということを意味する。 モード mode のクラスは常に MODE_FLOAT である。 overflow は、その値が既に範囲からはみでていることが わかっている場合は、ゼロでない値になる。

value が有効でないか、overflow がゼロでなければ、 overflow を 1 に設定し、何らかの有効な値を value に 割り当てるべきである。 無効な値をそのままにしておくと、コンパイラが不正なアセンブラコードを 出力し、Unix のアセンブラを異常終了させる可能性がある。

なすべき処理がなければこのマクロを定義する必要はない。

TARGET_FLOAT_FORMAT

ターゲットマシンの浮動小数点数形式を識別するためのコード。 定義済の値が三つある。

IEEE_FLOAT_FORMAT

IEEE 形式の浮動小数点数であることを示す。 これがデフォルトになるので、IEEE 形式を使っている時は このマクロを定義する必要はない。

VAX_FLOAT_FORMAT

VAX で使用されている固有の形式であることを示す。

UNKNOWN_FLOAT_FORMAT

このコードは、何か他の形式であることを示す。

このマクロの値を HOST_FLOAT_FORMAT(see section コンフィギュレーションファイル)と比べて、 ターゲットマシンのフォーマットがホストマシンと同じかどうかを 決める。何か他の形式が、サポートされている機種で実際に使われているのなら、 そのための新しいコードで定義する必要がある。

メモリ中に格納された浮動小数点数のワードの並び方は、 ターゲットマシンについては FLOAT_WORDS_BIG_ENDIAN で、 ホストマシンについては HOST_FLOAT_WORDS_BIG_ENDIAN で 制御される。

DEFAULT_VTABLE_THUNKS

GNU CC は、C++ の仮想関数テーブル(vtable)の実装方法を二種類サポートしている。 伝統的な方法と「thunks」と呼ばれる方法である。 ‘-fvtable-thunk’ オプションでどちらかの方法を選択する。 このオプションのデフォルト値を表す C の式としてこのマクロを定義する。 DEFAULT_VTABLE_THUNKS が 0 なら、GNU CC はデフォルトでは 伝統的な実装方法を取る。 「thunk」の実装の方が効率が良い(特に、ASM_OUTPUT_MI_THUNK を 実装している場合。関数の入口と出口 を参照)。 だが、伝統的な実装でコンパイルされたコードとのバイナリ互換性がない。 新規に移植を行うなら、DEFAULT_VTABLE_THUNKS を 1 に定義しよう。

このマクロを定義しなければ、‘-fvtable-thunk’ のデフォルトは 0 になる。


[ < ] [ > ]   [ << ] [ Up ] [ >> ]         [Top] [Contents] [Index] [ ? ]

This document was generated using texi2html 1.78.