[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
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.