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

15.4 RTL 式中のフラグ

RTL 式は、ある種の型の式で使われる色々なフラグ(一ビットのビットフィールド)と その他の値を含んでいる。ほとんどの場合、フラグは以下のマクロで 参照される。

MEM_VOLATILE_P (x)

mem 式において、揮発性のメモリ参照の場合に非 0 となる。 volatil フィールドに格納され、‘/v’ と出力される。

MEM_IN_STRUCT_P (x)

mem 式において、構造体や共用体、配列全体かそれらの成分を 参照するときに非0となる。スカラ変数への、あるいは ポインタを通してのスカラ変数への参照の場合は 0 となる。 in_struct フィールドに格納され、‘/s’ と出力される。 このフラグと MEM_SCALAR_P がどちらもクリアされていると、 この MEM が構造体の中にあるのかどうかがわからない。 両方のフラグが同時に設定されることがあってはならない。

MEM_SCALAR_P (x)

mem 式において、構造体や共用体、配列のメンバでないことが 知られているスカラに対する参照の場合はゼロでない値となる。 構造体や共用体、配列のメンバに対する参照や、ポインタを経由しての 間接参照に対しては、たとえそのポインタがスカラ型を指していても ゼロとなる。このフラグと MEM_STRUCT_P が両方ともクリアされていると、 この MEM が構造体の中にあるのかどうか分からない。 両方のフラグを同時にセットしてはならない。

MEM_ALIAS_SET (x)

mem 式において、x が属する別名のセットを表す。 これがゼロであれば、x どの別名のセットにも入っておらず、 任意のものの別名になりうる。ゼロでない場合は、x は、同じ 別名セットに入っているオブジェとの別名にしかならない。 この値は、言語フロントエンドにより(言語固有の方法で)設定される。 このフィールドはビットフィールドではない。整数であり、mem の 第二引数に現れるものである。

REG_LOOP_TEST_P

reg 式において、レジスタの生存期間がループの脱出条件の テストに含まれるなら、非0となる。 in_struct フィールドに格納され、‘/s’ と出力される。

REG_USERVAR_P (x)

reg 式において、ユーザのソースコード中に存在する変数に 対応するなら非0となる。コンパイラ内部で一時的に生成されたものなら 0となる。 volatil フィールドに格納され、‘/v’ と出力される。

REG_FUNCTION_VALUE_P (x)

reg 式において、このレジスタに現在の関数の戻り値が置かれるなら 非 0 である。(これは物理レジスタの場合にのみ発生する。) integrated フィールドに格納され、‘/i’ と出力される。

同じ物理レジスタが現在の関数が呼び出した関数の戻り値を置くのに 使われても良いが、そういう使い方の場合には REG_FUNCTION_VALUE_P は 0 である。

SUBREG_PROMOTED_VAR_P

subreg 式において、 それが、マシン記述マクロ PROMOTED_MODE (see section 記憶領域のレイアウト)に 従って、より幅の広いモードに拡張されたオブジェクトを参照した際に 作られたものなら、非ゼロである。この場合、subreg のモードは そのオブジェクトの宣言されたモードであり、SUBREG_REG のモードは そのオブジェクトを保持するレジスタのモードである。 拡張された変数は、それぞれの代入の際に、常に、より幅の広いモードへ 符号拡張またゼロ拡張される。 in_struct フィールドに格納され、‘/s’ として出力される。

SUBREG_PROMOTED_UNSIGNED_P

SUBREG_PROMOTED_VAR_P が、参照されているオブジェクトがゼロ拡張 され続ける場合はゼロでなく、符号拡張され続ける場合はゼロとなるような、 subreg の中では、非ゼロである。 unchanging フィールドに格納され、‘/u’ と出力される。

RTX_UNCHANGING_P (x)

reg または mem では、その値が変化しないのであれば、 非 0 である。 (このフラグは、ポインタを経由しての定数へのメモリ参照では設定されない。 そういうポインタは、現在の関数ではオブジェクトは明示的には変化しない ということを保証するだけである。オブジェクトは、他の関数やエイリアシング により変化し得るのである。) unchanging フィールドに格納され、‘/u’ と出力される。

RTX_INTEGRATED_P (insn)

インライン関数呼び出しの結果生じる insn 中では非 0 である。 integrated フィールドに格納され、‘/i’ と出力される。

RTX_FRAME_RELATED_P (x)

一個の insn また式で、関数プロローグの一部であり、かつ、スタックポインタを 設定しているか、フレームポインタを設定しているか、レジスタをセーブしている ものの中であれば、ゼロでない値となる。このフラグは、RTL プロローグを 持つターゲットで例外処理をサポートするのに必要となる。

SYMBOL_REF_USED (x)

symbol_ref 中で、x が使われていることを指示する。 通常は、x が external として一度だけ宣言されていることを保証する のに使われるだけである。used フィールドに格納される。

SYMBOL_REF_FLAG (x)

symbol_ref 中で、機種に固有な目的のためのフラグとして使われる。 volatil フィールドに格納され、‘/v’ として出力される。

LABEL_OUTSIDE_LOOP_P

label_ref 式の中で、ラベルへの参照がある場合、そのラベルが、 ラベルへの参照を含む最も内側のループの外側にあるなら、非ゼロとなる。 in_struct フィールドに格納され、‘/s’ として出力される。

INSN_DELETED_P (insn)

insn の中で、その insn が削除済であれば非 0 である。 volatil フィールドに格納され、‘/v’ と出力される。

INSN_ANNULLED_BRANCH_P (insn)

分岐 insn の遅延スロットにある insn の中で、無効化分岐を使うべきか どうかを指示する。以下の sequence の議論を参照のこと。 unchanging フィールドに格納され、‘/u’ と出力される。

INSN_FROM_TARGET_P (insn)

分岐命令の遅延スロット中の insn の中で、その insn が 分岐命令のターゲットから来たものであることを示す。 分岐 insn の INSN_ANNULLED_BRANCH_P ビットが立っていれば、 この insn は、分岐が成立したときにのみ実行される。 INSN_FROM_TARGET_Pビットが立っていない無効化された分岐命令の場合は、 insn は、分岐が成立しなかったときにのみ実行される。 INSN_ANNULLED_BRANCH_P が設定されていない場合は、 この insn は常に実行される。 in_struct フィールドに格納され、‘/s’ と出力される。

CONSTANT_POOL_ADDRESS_P (x)

symbol_ref の中で、現在の関数の「定数プール」の一部を参照 しているなら、非ゼロとなる。これらは、関数の先頭に近いアドレスであり、 GNU CC は、直接的にアクセスが可能であると仮定する(恐らく、ベースレジスタ の助けを借りて)。 unchanging フィールドに格納され、‘/u’ と出力される。

CONST_CALL_P (x)

call_insn の中で、insn が定数関数への呼び出しを表しているか どうかを示す。unchanging フィールドに格納され、‘/u’ と 出力される。

LABEL_PRESERVE_P (x)

code_label の中で、そのラベルが削除不可であることを示す。 非局所的 goto によるラベルの参照でこのビットがセットされる。 in_struct フィールドに格納され、‘/s’ と出力される。

SCHED_GROUP_P (insn)

命令スケジューリング中、ある insn において、直前の insn はこの insn と 同時にスケジューリングされなければならないことを示す。 これを使って、ある命令のグループが命令スケジューリングのパスによって、 分割されないことを保証する。例えば、call_insn の直前の use insn は、call_insn から分離されることはない。 in_struct フィールドに格納され、‘/s’ として出力される。

以下に、上述のマクロが参照するフィールドを挙げる。

used

通常は、このフラグは、関数の RTL 生成の最後で、ある式が insn の中に何回 現れたかを数えるために、一時的に使われるだけである。 二回以上現れた式は、共有構造の規則に従ってコピーされる(see section 構造の共有の前提)。

symbol_ref では、そのシンボルに対する外部宣言が既に書き込み済で あることを意味する。

reg では、リーフレジスタの番号付け替えのコード部分で、 各レジスタの番号付け替えが一回だけ行われることを保証するのに 使われる。

volatil

このフラグは、mem式、symbol_ref式、reg式および insn の中で使われる。RTL ダンプファイルでは、‘/v’ と表記される。

mem 式の中では、メモリ参照が揮発性(volatile)であれば 1 である。 揮発性メモリ参照は、削除や並べかえや結合は出来ない。

symbol_ref 式の中では、機種固有の目的で使われる。

reg 式の中では、その値がユーザレベルの変数であれば、1 である。 0 であれば、コンパイラが内部的に使う一時的なものであること示す。

insn の中では、1 であればその insn が既に削除された事を意味する。

in_struct

mem式の中では、その式が参照するメモリデータが、 構造体または配列の全体あるいは一部であれば、1 となる。 スカラ変数であれば、0 になる。 C 言語のポインタを通しての参照は 0 となる。ポインタはスカラ変数を 指すからである。この情報により、GCC が、エイリアシングが起こる場合に ついて何らかの決定を下すことができるようになる。

分岐命令の遅延スロットの insn の中では、1 であれば、この insn が 分岐先から来たものであることを意味する。

命令のスケジューリングの間では、insn の中では、1 であれば、 この insn は、直前の insn と共に構成するグループの一部として スケジュールされなければならないことを意味する。

reg 式の中では、その式が示すレジスタの生存範囲が、 あるループの条件式の中に完全に収まるのであれば、1 である。

subreg 式の中では、1 であれば、その subreg が、 より広いモードから格上げされたモードを持っていたオブジェクトを 参照していることを示す。

label_ref 式の中では、1 であれば、参照しているラベルが、 その label_ref 式のある insn を含む最も内側のループの 外にあることを示す。

code_label 式の中では、そのラベルが削除されることが決してありえない のなら、1 である。これは、非局所的な goto の目的先であるラベルで 使われる。

RTL ダンプの中では、このフラグは ‘/s’ と表記される。

unchanging

reg 式と mem 式の中では、1 であれば、その式の値が 決して変化しないことを意味する。

subreg 式の中では、その subreg 式が、より広いモードへ 格上げされたモードを持つ符号無しのオブジェクトを参照しているのであれば、 1 である。

insn の中では、1 であれば、無効化付きの分岐であることを意味する。

symbol_ref 式の中では、1 であれば、このシンボルが、関数毎の 定数プール中の何かを参照していることを示す。

call_insn の中では、1 であれば、この命令が定数関数への呼び出しで あることを意味する。

RTL ダンプ中では、このフラグは ‘/u’ と表示される。

integrated

insnを含む、ある種の式の中では、このフラグは、この RTL が手続き統合 (procedure integration)により生成されたことを意味する。

reg 式の中では、このフラグは、このレジスタが、現在の関数に より返されるはずの値を含んでいることを示す。 引数をレジスタで渡す機種では、同じ番号のレジスタが引数としても 使われるが、その様に使用される場合にはこのフラグはセットされない。


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

This document was generated using texi2html 1.78.