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
- ローワーコール
- ローワーリターン
私を正しい方向に向ける情報を事前にありがとう。