英語版
このページの英語版を見る
dmd.toir
バックエンドの中間表現(IR)に変換する。
Authors:
License:
ソース toir.d
- struct
Label
; - ラベルシンボル
- struct
IRState
; - 中間表現(IR)が必要とする状態変数を集める
- bool
arrayBoundsCheck
(); - Returns:現在の関数の配列境界チェックを行う場合はtrueを指定する。
- @safe bool
isNothrow
(); - Returns:コードのnothrowセクションにあればtrueを返す
- elem*
incUsageElem
(ref IRStateirs
, const ref Locloc
); - 特定の行の使用カウントをインクリメントするelemを生成する。 ビットマップm.covb[linnum] の対応するビットをセットする。 covスイッチ(カバレッジ解析)の実装に使用される。Parameters:
IRState irs
コンテキスト Loc loc
使用法を表示する行とファイル。 Returns:行数をインクリメントするエレメント - elem*
getEthis
(const ref Locloc
, ref IRStateirs
, Dsymbolfd
, Dsymbolfdp
= null, DsymbolorigSc
= null); - 関数fdのスタティックフレームポインタに評価されるelemを返す。 fdがメンバ関数の場合、返される式はfdの'this'変数の値を計算する。 の値を計算する。 フレームポインタが 'fd' を呼び出すのに使われる場合、'fdp' は 'fd' の親である。 origSc'はインライン化した元のスコープである。 このルーチンは、ネストした関数を実装するのに重要である。
- elem*
fixEthis2
(elem*ethis
, FuncDeclarationfd
, boolctxt2
= false); - デュアルコンテキスト配列から1つのコンテキストポインタを選択するReturns:*(ethis + offset)から1つのコンテキスト・ポインタを選択する;
- elem*
setEthis
(const ref Locloc
, ref IRStateirs
, elem*ey
, AggregateDeclarationad
, boolsetthis2
= false); - 非表示の集約メンバ vthis をコンテキスト・ポインタで初期化する。 を初期化する。Returns:*(ey + (ethis2 ? ad.vthis2 : ad.vthis).offset) = this;
- int
intrinsic_op
(FuncDeclarationfd
); - 組込み関数を演算子に変換する。Returns:演算子をバックエンドの OPER に変換する、 組込み関数でない場合は NotIntrinsic、 フロントエンドのみの組込み関数の場合は OPtoPrec
- elem*
resolveLengthVar
(VarDeclarationlengthVar
, elem**pe
, Typet1
); - 配列である式 e が与えられる、 変数 'length' を決定して設定する。
入力 lengthVar 変数 'length' のシンボル &e 配列である式 t1 配列の型
出力 eは副作用を避けるために書き換えられる
Returns:length'を初期化する式 - TYPE*
getParentClosureType
(Symbol*sthis
, FuncDeclarationfd
); - を初期化する式を返す。 を返す。関数がメンバ関数の場合、'this'型は'sthis.Sthis'に格納される。 this'型は'sthis.Sthis'に格納されることが期待される。 void ポインタでない場合は、常にこの型が返される。 buildClosure()は、以前に外部関数で呼ばれていなければならない。Parameters:
Symbol* sthis
fd.vthisから派生した現在の'this'のシンボル。 FuncDeclaration fd
ネストされた関数。 - uint
setClosureVarOffset
(FuncDeclarationfd
); - 関数fdの中でクロージャに割り当てる変数を調べ、.offsetフィールドを設定する。 .offsetフィールドを設定する。 フィールドを設定する。 に相対的な位置に設定する。 また、クロージャ変数のnrvoをオフにする。Parameters:
FuncDeclaration fd
関数 Returns:クロージャ全体のアライメント - void
buildClosure
(FuncDeclarationfd
, ref IRStateirs
); - クロージャは、関数のスコープを維持する必要のあるローカル変数を取り出し、それをコピーすることで実装される。 クロージャは、関数のスコープから外れないローカル変数を取り出し、gcで割り当てられたメモリにコピーすることで実装される。 にコピーする。その塊は、ここでは 通常のスタック・フレームではなく、スタック・フレームのリンクリストに挿入される。 フレームに挿入される。buildClosure()は、関数プロログが完了した直後にコードを挿入する。 が完了した直後にコードを挿入する。これは、クロージャ用のメモリを確保し、それを指すローカル変数(sclosure)を確保する。 ローカル変数(sclosure)を確保し、それを指すようにする。 囲むフレームへのリンクを挿入し、ネストした関数で参照されるパラメータをコピーする。 にコピーする。 VarExp::toElemとSymOffExp::toElemでは、クロージャの中にある変数を参照する場合、以下のようになる。 において、クロージャ内の変数を参照する場合、フレームポインタからではなく、クロージャからオフセットを取る。 からオフセットを取る。 getEthis()とNewExp::toElemは、設定されている場合、現在のフレームポインタではなく、sclosureを使用する必要がある。 を使用する必要がある。
- void
buildAlignSection
(FuncDeclarationfd
, ref IRStateirs
); - アライメントされたセクションは、スタック・ポインタよりも大きなアライメントが必要なローカル変数を取り出して実装される。 アラインメントセクションは、スタックアラインメントより大きなアラインメントを必要とするローカル変数を取り込むことによって実装される。 これらの変数は、スタック上のアライメントされたアライメント・セクションと呼ばれる別のメモリ・チャンクに割り当てられる。 アラインメント・セクション "と呼ばれる、スタック上の別個のメモリーの塊に割り当てられ、関数のエントリー時にアラインメントされる。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
(FuncDeclarationfd
); - ネストされた関数によって取り込まれた変数のデバッグ情報構造体を構築する、 を構築する。 スタック・オフセットを埋める関数を生成した後に呼び出さなければならない。Parameters:
FuncDeclaration fd
関数 - RET
retStyle
(TypeFunctiontf
, boolneedsThis
); - 関数の戻り値のスタイルを決定する。 呼び出し元のスタックへの隠されたポインタを通してか。Parameters:
TypeFunction tf
チェックする関数型 bool needsThis
関数型が非スタティックメンバ関数の場合、trueを返す。 Returns:関数の戻り値がスタック上にある場合はRET.stack、そうでない場合はRET.regsを指定する。
Copyright © 1999-2024 by the D Language Foundation
DEEPL APIにより翻訳、ところどころ修正。
このページの最新版(英語)
このページの原文(英語)
翻訳時のdmdのバージョン: 2.108.0
ドキュメントのdmdのバージョン: 2.109.1
翻訳日付 :
HTML生成日時:
編集者: dokutoku