我已经构建了一个LLVM目标前端,它可以产生一些IR.随后并且完全预期,在某些情况下IR输出是不正确的(因为,它看起来是正确的,但是在执行时结果程序崩溃).但是,我还没有找到很多有用的工具来解决这个问题.
我已经尝试过使用lli,但错误信息输出非常无用(当你假设一个解释器可以提供非常精确的错误细节时).
我研究了将IR转换为C代码,然后使用Visual Studio进行调试,但似乎从LLVM中删除了此功能.
我还研究了处理GDB.但是,DWARF调试信息格式对于它看起来的几种现有语言来说非常具体,另外,我正在使用我的前端进行翻译的源是正确的,它是生成的IR,这是错误的,因此原始源的调试符号不会没有用 - 例如,我需要查看一堆中间寄存器值的值,这些值与任何源变量或编译器生成的函数中的断点都不对应.
调试LLVM IR输出有哪些工具和技术?
我不确定我是否完全理解你的问题。您是说您的编译器(从语言 X 到 LLVM IR)产生了不正确的输出(不正确的 LLVM IR)并且您不确定如何调试它?换句话说,有两种可能:
我假设它是 (1) 你在谈论(因为这就是问题所说的,在你更新之前)
那么,这不会是 LLVM 特定的问题。假设您正在编写从 X 语言到本机代码的编译器。生成的本机代码不正确 - 您如何调试问题?好吧,很明显,您调试了编译器。您尝试找到编译器对输入的理解是正确的最后一个地方,或者它变得不正确的第一个地方。如何做到这一点在很大程度上取决于编译器的体系结构。但是,在编译器中具有其他中间层的可打印表示是很有帮助的。
例如,Clang(从 C、C++ 和 Objective C 生成 LLVM IR)可以转储其完整的 AST。因此,查看 AST 中的错误代码可以将编译器减半,帮助确定问题出在前端(C 源代码 -> AST)还是代码生成(AST -> LLVM IR)。LLVM 后端(将 LLVM IR 编译为本机代码)也有一些中间层(最显着的是 SelectionDAG 和 MI),为了调试可以检查它们。这些只是其他现有编译器的示例,您的 YMMV。