我想写一个 LLVM 插件来告诉我:对于每个函数声明,函数将有多少个通用寄存器、XMM 寄存器和堆栈参数。这只需要适用于 x86 SYSV 调用约定。这目前可能吗?如果是这样,任何方向将不胜感激。
问问题
225 次
1 回答
0
这是可能的,但有点棘手,当您尝试操作 IR 时,LLVM 似乎比使用机器特定代码时更友好。一方面,没有简单的方法可以添加通行证。另请注意,最终使用的寄存器数量取决于虚拟寄存器最终如何分配到实际 x86 逻辑寄存器中,在某些情况下可能会发生溢出,而在其他情况下会消除某些变量。因此,您不仅无法处理值采用 SSA 形式的 IR,实际上还需要处理 CodeGen 的最后阶段。为了让事情变得更有趣,它还取决于您使用的优化级别。查看 - llvm/lib/CodeGen/Passes.cpp,查看 addOptimizedRegAlloc 或 addFastRegAlloc,查看内部调用的传递并使用最后一个(在 CodeGen 中的单独文件中实现),搭便车。内部循环应该非常简单,但是您需要根据 TargetRegisterInfo 中枚举的 X86 目标 reg 运行您的簿记
于 2013-06-21T13:19:21.990 回答