是否有LLVM IR的调试器?

orm*_*orm 13 llvm llvm-ir

我想介绍一下我生成的一些LLVM IR代码.就llc和lli而言,代码在语法和类型上是有效的,但结果不是我所期望的.

这些块足够大,以至于我只是简单地读出了这个bug,而且我很难用相同的bug生成一个更小的例子.

我认为我可以使用类似调试器的东西,但是对于LLVM IR.换句话说,我希望能够逐步执行llvm代码,检查"无限"寄存器(给定LLVM IR文件中的名称)和内存位置,设置断点,直到找到我的代码出错的地方.

我看着llilldb,但也好像是我要寻找的工具.lli将运行我的代码,但不要让我一步一步走.lldb似乎假设代码是由C前端生成的.

我错了约lldblli?有谁知道一个工具甚至可以达到我想要的50%?

Vla*_*hin 8

我不知道这样的事情(我怀疑它不存在).虽然我很乐意分享我对llvm生成的代码调试的观点.

  1. 调试生成的代码本身(在gdb中逐步执行).
  2. 利用debugtrap内在(简单地生成int3或在您的架构上等效).你可以用这个东西做断言,看看哪个失败了.
  3. 提供您的说明名称(因此它们不是%0,%1但有意义%names) - 它们在llc输出中显示为注释.
  4. 为您的函数构建CFG(控制流图): opt --dot-cfg 1.ll; dot cfg.funcname.dot -Tpng > 1.png
  5. 不要忘记禁用llvm优化(你可以拥有后端-O3优化级别,但IR转换通道会使调试更加困难).

所以我建议的工作流程如下.建立CFG(4​​.)和汇编(通过llc).打破gdb中生成的代码并逐步执行它(或让它在你的一个asserions上陷阱).将您在gdb中停止的点与llc输出相关联,读取注释,与CFG相关联.神交.

您还可以从生成的代码中构建CFG表示.我知道IDA Pro(一种非常昂贵的CFG构建方式)和Saga提供此类功能的工具.

PS:这最初是一个评论,但它变得太长了.


小智 8

曾经有一个 LLVM pass 可以-debug-ir做到这一点。看这个答案。

人们曾尝试过恢复它,包括发布补丁

我需要一个像这样的实用程序来调试我生成的一些代码。因此,我将上面的补丁改编成一个独立的工具,可以将行号信息附加到输入 LLVM-IR 文件中,并生成输出 LLVM-IR,其调试信息引用输入文件。https://github.com/vaivaswatha/debugir