2013-05-21 112 views
1

我想编写一个LLVM插件来告诉我:对于每个函数声明,该函数将具有多少个通用寄存器,XMM寄存器和堆栈参数。这只需要适用于x86 SYSV调用约定。目前这可能吗?如果是这样,任何方向将不胜感激。LLVM:获取函数参数位置(ABI)

回答

0

这是可能的,但稍微有些棘手,当你尝试操纵IR时,LLVM似乎比用特定机器代码搞乱更友好。对于其中一种,添加通行证没有简单的方法。 另请注意,最终使用的寄存器数量取决于虚拟寄存器如何最终分配到真正的x86逻辑寄存器(在某些情况下可能会出现溢出)以及其他变量的消除。因此,您不仅可以避免在值为SSA形式的IR上工作,而且您实际上需要在CodeGen的最后阶段开展工作。为了让事情更有趣,它还取决于您使用的优化级别。 检出 - llvm/lib/CodeGen/Passes.cpp,看看addOptimizedRegAlloc或addFastRegAlloc,检查传入的内部调用并使用最后的(在CodeGen中的单独文件中实现),搭便车。内部循环应该非常简单,但您需要根据TargetRegisterInfo中枚举的X86目标代码运行簿记。