2013-05-07 72 views
0

我試圖爲LLVM實現後端。 現在我遇到了堆棧幀降低的問題。在LLVM後端實現堆棧佈局

我需要實現以下堆棧佈局: 當一個函數被調用時,我需要將一個「返回符號」(因爲目標系統只能跳轉到絕對地址)和「偏移」到堆棧中,然後是所有函數參數。 堆棧對齊是1字節,堆棧必須長大。

堆棧佈局呼叫前:

RetSymb <- SP 
Offset 
Arguments 
Local Data 

堆棧佈局進入函數之前:

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

在返回的SP被自動保存在「偏移」的值遞減。 變量參數處理現在不重要。

我目前不知道在哪些地方我必須看,以及我需要在這些地方做什麼。 我發現了XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX發佈emitPrologue和emitEpilogue函數在XXXFrameLowering.cpp但我真的不知道他們應該做什麼(我猜插入代碼在函數的開始和結束) 我還在XXXISelLowering.cpp文件中找到了一些函數。有沒有一個列表解釋不同的功能應該做什麼? 例如:

  • LowerFormalArguments(我猜插入負荷棧參數)
  • LowerCallResult
  • LowerCall
  • LowerReturn提前任何信息

感謝指向我的正確的方向。

回答

3

據我所知,沒有一個地方可以解釋這一點。您必須選擇現有的後端之一併按照其代碼查看魔術的完成情況。 emitPrologueemitEpilogue是開始的好選擇,因爲這些專門處理在函數中設置和拆除幀的代碼。的功能被降低到(粗略估計,還有更多詳情...):

func_label: 
    prologue 
    .. function code 
    epilogue 

因此處理自定義堆棧佈局,你肯定是要編寫自定義代碼的序幕和尾聲。如果調用者負責某些堆棧佈局,則對函數調用也是如此。

我建議你先閱讀一些現有後端的堆棧幀佈局,然後研究LLVM中的相關代碼。例如,我描述了一些x86(32位)幀信息here