2013-05-07 71 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