在LLVM后端实现堆栈布局

时间:2013-05-07 16:11:34

标签: stack llvm

我正在尝试为LLVM实现后端。 现在我遇到了堆栈帧降低的问题。

我需要实现以下堆栈布局: 当一个函数被调用时,我需要输入一个"返回符号"(因为目标系统只能跳转到绝对地址)和" Offset"进入堆栈,然后是所有函数参数。 堆栈对齐是1字节,堆栈必须长大。

通话前的堆叠布局:

RetSymb <- SP
Offset
Arguments
Local Data

进入功能前的堆栈布局:

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

返回时,SP会自动减少存储在&#34; Offset&#34;中的值。 变量参数处理现在不重要。

我目前不知道在哪些地方我需要查看以及我需要在这些地方做些什么。 我在XXXFrameLowering.cpp中找到了emitPrologue和emitEpilogue函数,但我不知道它们应该做什么(我想在函数的开头和结尾插入代码)。 我还在XXXISelLowering.cpp文件中找到了几个函数。是否有一个列表解释了不同的功能应该做什么? 例如:

  • LowerFormalArguments(我猜是从堆栈中为参数插入加载)
  • LowerCallResult
  • LowerCall
  • LowerReturn

提前感谢所有指出正确方向的信息。

1 个答案:

答案 0 :(得分:3)

据我所知,没有一个地方可以解释这一点。您必须选择一个现有的后端并按照其代码查看魔术的完成位置。 emitPrologueemitEpilogue是很好的候选者,因为它们专门处理在函数中设置和删除帧的代码。函数降低到(粗略近似,有更多细节...):

func_label:
  prologue
  .. function code
  epilogue

因此,要处理自定义堆栈布局,您肯定必须为序言和结尾编写自定义代码。如果调用者负责某些堆栈布局,则调用函数也是如此。

我建议你先阅读一些现有后端的堆栈框架布局,然后研究LLVM中的相关代码。我描述了一些x86(32位)帧信息here,例如。