英語版
このページの英語版を見る

dmd.toir

バックエンドの中間表現(IR)に変換する。
Authors:

ソース toir.d

struct Label;
ラベルシンボル
struct IRState;
中間表現(IR)が必要とする状態変数を集める
bool arrayBoundsCheck();
Returns:
現在の関数の配列境界チェックを行う場合はtrueを指定する。
@safe bool isNothrow();
Returns:
コードのnothrowセクションにあればtrueを返す
elem* incUsageElem(ref IRState irs, const ref Loc loc);
特定の行の使用カウントをインクリメントするelemを生成する。 ビットマップm.covb[linnum] の対応するビットをセットする。 covスイッチ(カバレッジ解析)の実装に使用される。
Parameters:
IRState irs コンテキスト
Loc loc 使用法を表示する行とファイル。
Returns:
行数をインクリメントするエレメント
elem* getEthis(const ref Loc loc, ref IRState irs, Dsymbol fd, Dsymbol fdp = null, Dsymbol origSc = null);
関数fdのスタティックフレームポインタに評価されるelemを返す。 fdがメンバ関数の場合、返される式はfdの'this'変数の値を計算する。 の値を計算する。 フレームポインタが 'fd' を呼び出すのに使われる場合、'fdp' は 'fd' の親である。 origSc'はインライン化した元のスコープである。 このルーチンは、ネストした関数を実装するのに重要である。
elem* fixEthis2(elem* ethis, FuncDeclaration fd, bool ctxt2 = false);
デュアルコンテキスト配列から1つのコンテキストポインタを選択する
Returns:
*(ethis + offset)から1つのコンテキスト・ポインタを選択する;
elem* setEthis(const ref Loc loc, ref IRState irs, elem* ey, AggregateDeclaration ad, bool setthis2 = false);
非表示の集約メンバ vthis をコンテキスト・ポインタで初期化する。 を初期化する。
Returns:
*(ey + (ethis2 ? ad.vthis2 : ad.vthis).offset) = this;
int intrinsic_op(FuncDeclaration fd);
組込み関数を演算子に変換する。
Returns:
演算子をバックエンドの OPER に変換する、 組込み関数でない場合は NotIntrinsic、 フロントエンドのみの組込み関数の場合は OPtoPrec
elem* resolveLengthVar(VarDeclaration lengthVar, elem** pe, Type t1);
配列である式 e が与えられる、 変数 'length' を決定して設定する。

入力 lengthVar 変数 'length' のシンボル &e 配列である式 t1 配列の型

出力 eは副作用を避けるために書き換えられる

Returns:
length'を初期化する式
TYPE* getParentClosureType(Symbol* sthis, FuncDeclaration fd);
を初期化する式を返す。 を返す。関数がメンバ関数の場合、'this'型は'sthis.Sthis'に格納される。 this'型は'sthis.Sthis'に格納されることが期待される。 void ポインタでない場合は、常にこの型が返される。 buildClosure()は、以前に外部関数で呼ばれていなければならない。
Parameters:
Symbol* sthis fd.vthisから派生した現在の'this'のシンボル。
FuncDeclaration fd ネストされた関数。
uint setClosureVarOffset(FuncDeclaration fd);
関数fdの中でクロージャに割り当てる変数を調べ、.offsetフィールドを設定する。 .offsetフィールドを設定する。 フィールドを設定する。 に相対的な位置に設定する。 また、クロージャ変数のnrvoをオフにする。
Parameters:
FuncDeclaration fd 関数
Returns:
クロージャ全体のアライメント
void buildClosure(FuncDeclaration fd, ref IRState irs);
クロージャは、関数のスコープを維持する必要のあるローカル変数を取り出し、それをコピーすることで実装される。 クロージャは、関数のスコープから外れないローカル変数を取り出し、gcで割り当てられたメモリにコピーすることで実装される。 にコピーする。その塊は、ここでは 通常のスタック・フレームではなく、スタック・フレームのリンクリストに挿入される。 フレームに挿入される。
buildClosure()は、関数プロログが完了した直後にコードを挿入する。 が完了した直後にコードを挿入する。これは、クロージャ用のメモリを確保し、それを指すローカル変数(sclosure)を確保する。 ローカル変数(sclosure)を確保し、それを指すようにする。 囲むフレームへのリンクを挿入し、ネストした関数で参照されるパラメータをコピーする。 にコピーする。 VarExp::toElemとSymOffExp::toElemでは、クロージャの中にある変数を参照する場合、以下のようになる。 において、クロージャ内の変数を参照する場合、フレームポインタからではなく、クロージャからオフセットを取る。 からオフセットを取る。
getEthis()とNewExp::toElemは、設定されている場合、現在のフレームポインタではなく、sclosureを使用する必要がある。 を使用する必要がある。
void buildAlignSection(FuncDeclaration fd, ref IRState irs);
アライメントされたセクションは、スタック・ポインタよりも大きなアライメントが必要なローカル変数を取り出して実装される。 アラインメントセクションは、スタックアラインメントより大きなアラインメントを必要とするローカル変数を取り込むことによって実装される。 これらの変数は、スタック上のアライメントされたアライメント・セクションと呼ばれる別のメモリ・チャンクに割り当てられる。 アラインメント・セクション "と呼ばれる、スタック上の別個のメモリーの塊に割り当てられ、関数のエントリー時にアラインメントされる。
buildAlignSection()は、関数プロログが完了した直後にコードを挿入する。 が完了した直後にコードを挿入する。これは、アライン・クロージャ用のメモリを確保する。 ローカル・スタック変数にそのメモリーを格納する。 それを指すローカル変数(salignSection)を確保する。 VarExp::toElemとSymOffExp::toElemでは、アライン・クロージャーにある変数を参照する場合、その変数を指すためにローカル変数(salignSection)を確保する。 において、アライン・クロージャ内の変数を参照する場合、フレーム・ポインタからではなく、salignSectionからオフセットを取る。 からオフセットを取る。 変数をクロージャとアライン・セクションの両方に入れることはできない。変数はクロージャに入り、そのクロージャがアラインされる。 に入り、そのクロージャがアラインされる。
getEthis()とNewExp::toElemは、設定されている場合、現在のフレームポインタではなく、sclosureを使用する必要がある。 を使う必要がある。
buildClosureがinAlignSection変数を最初に取得するため、buildClosureの後に実行する。
Parameters:
FuncDeclaration fd 関数" で行われる。
IRState irs 中間コード生成の状態

参照 buildClosure()もよく似ている。

https://github.com/dlang/dmd/pull/9143は、この問題を解決するための不完全な試みだった。 マージされた。おそらく削除されるべきである。

void buildCapture(FuncDeclaration fd);
ネストされた関数によって取り込まれた変数のデバッグ情報構造体を構築する、 を構築する。 スタック・オフセットを埋める関数を生成した後に呼び出さなければならない。
Parameters:
FuncDeclaration fd 関数
RET retStyle(TypeFunction tf, bool needsThis);
関数の戻り値のスタイルを決定する。 呼び出し元のスタックへの隠されたポインタを通してか。
Parameters:
TypeFunction tf チェックする関数型
bool needsThis 関数型が非スタティックメンバ関数の場合、trueを返す。
Returns:
関数の戻り値がスタック上にある場合はRET.stack、そうでない場合はRET.regsを指定する。