LLVM:获取函数参数位置(ABI)

LLVM:获取函数参数位置(ABI),llvm,clang,llvm-clang,Llvm,Clang,Llvm Clang,我想写一个LLVM插件来告诉我:对于每个函数声明,函数将有多少通用寄存器、XMM寄存器和堆栈参数。这只需要适用于x86 SYSV调用约定。目前是否可能?如果是这样的话,任何方向都是非常好的。这是可能的,但有点棘手,当您尝试操作IR时,LLVM似乎比处理特定于机器的代码时更友好。举例来说,没有简单的方法来增加传球。 还请注意,使用的寄存器的最终数量取决于虚拟寄存器最终如何分配到实x86逻辑寄存器中,在某些情况下可能会发生溢出,而在另一些情况下会消除一些变量。因此,您不仅不能在值为SSA形式的IR上

我想写一个LLVM插件来告诉我:对于每个函数声明,函数将有多少通用寄存器、XMM寄存器和堆栈参数。这只需要适用于x86 SYSV调用约定。目前是否可能?如果是这样的话,任何方向都是非常好的。

这是可能的,但有点棘手,当您尝试操作IR时,LLVM似乎比处理特定于机器的代码时更友好。举例来说,没有简单的方法来增加传球。 还请注意,使用的寄存器的最终数量取决于虚拟寄存器最终如何分配到实x86逻辑寄存器中,在某些情况下可能会发生溢出,而在另一些情况下会消除一些变量。因此,您不仅不能在值为SSA形式的IR上工作,实际上还需要在CodeGen的最后阶段工作。为了使事情更有趣,这还取决于您使用的优化级别。 签出-llvm/lib/CodeGen/passs.cpp,查看addOptimizedRegAlloc或addFastRegAlloc,签出内部调用的passed,并使用最后一个(在CodeGen中的单独文件中实现)来搭便车。内部循环应该非常简单,但您需要基于TargetRegisterInfo中枚举的X86目标reg运行簿记