0

LLVM のバックエンドを実装しようとしています。現在、スタック フレームの低下に関する問題が発生しています。

私は次のスタック レイアウトを実装する必要があります。スタック アライメントは 1 バイトで、スタックは大きくなる必要があります。

呼び出し前のスタック レイアウト:

RetSymb <- SP
Offset
Arguments
Local Data

関数に入る前のスタック レイアウト:

RetSymb
Offset
Arguments
Local Data
RetSymb <- SP
Offset = SP - Old SP
Arguments
Local Data

戻ると、SP は「オフセット」に格納されている値だけ自動的に減分されます。可変引数の処理は、現時点では重要ではありません。

どこを見ればいいのか、その場所で何をすればいいのかわからない。XXXFrameLowering.cpp で emitPrologue および emitEpilogue 関数を見つけましたが、それらが何をすべきかよくわかりません (関数の最初と最後にコードを挿入すると思います)。また、XXXISelLowering.cpp ファイルでいくつかの関数を見つけました。さまざまな機能が何をすべきかを説明するリストはありますか? 例えば:

  • LowerFormalArguments (引数のスタックからの読み込みを挿入すると思います)
  • LowerCallResult
  • ローワーコール
  • ローワーリターン

私を正しい方向に向ける情報を事前にありがとう。

4

1 に答える 1

4

私の知る限り、これを説明する単一の場所はありません。既存のバックエンドの 1 つを選択し、そのコードに従って、魔法がどこで行われるかを確認する必要があります。emitPrologueこれらは、関数内でフレームを設定およびemitEpilogue破棄するコードを具体的に扱うため、開始するのに適した候補です。関数は(大まかな概算、詳細があります...)に下げられます:

func_label:
  prologue
  .. function code
  epilogue

したがって、カスタム スタック レイアウトを処理するには、必ずプロローグとエピローグのカスタム コードを記述する必要があります。呼び出し元がスタック レイアウトの一部を担当している場合、関数の呼び出しについても同じことが言えます。

まず、いくつかの既存のバックエンドのスタック フレーム レイアウトについて読んでから、LLVM で関連するコードを調べることをお勧めします。たとえば、ここでx86 (32 ビット) フレーム情報の一部を説明しました。

于 2013-05-07T16:30:18.693 に答える