0

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

我需要实现以下堆栈布局:当调用函数时,我需要将“返回符号”(因为目标系统只能跳转到绝对地址)和“偏移”放到堆栈上,然后是所有函数参数。堆栈对齐是 1 字节,堆栈必须增长。

调用前的堆栈布局:

RetSymb <- SP
Offset
Arguments
Local Data

进入功能前的堆栈布局:

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

返回时,SP 会自动递减存储在“Offset”中的值。变量参数处理现在并不重要。

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

  • LowerFormalArguments(我猜从堆栈中插入负载作为参数)
  • 较低的呼叫结果
  • 低呼
  • 低回报

在此先感谢您提供任何为我指明正确方向的信息。

4

1 回答 1

4

据我所知,没有一个地方可以解释这一点。您必须选择一个现有的后端并按照它的代码来查看魔术在哪里完成。emitPrologue并且emitEpilogue是很好的起点,因为它们专门处理在函数中设置和拆除框架的代码。一个函数被降低到(粗略的近似,还有更多细节......):

func_label:
  prologue
  .. function code
  epilogue

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

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

于 2013-05-07T16:30:18.693 回答