我试图在 LLVM 优化期间保留 DWARF 调试信息,我的问题是:我可以以某种方式插入 LLVM 中每条指令的调试信息吗?在进行所有优化传递时,LLVM 会保留这些信息,然后将 DWARF 注释的 LLVM 优化 IR 转储给我吗?
我相信如果这可行,我可以有一个后端(当然支持那些调试信息)生成最终的最终代码(或多或少由于优化)可以用源代码调试,对吗?
我试图在 LLVM 优化期间保留 DWARF 调试信息,我的问题是:我可以以某种方式插入 LLVM 中每条指令的调试信息吗?在进行所有优化传递时,LLVM 会保留这些信息,然后将 DWARF 注释的 LLVM 优化 IR 转储给我吗?
我相信如果这可行,我可以有一个后端(当然支持那些调试信息)生成最终的最终代码(或多或少由于优化)可以用源代码调试,对吗?
优化的调试信息对于 llvm 来说仍然是一个相当新的领域。它正在积极开发中,但很大程度上取决于您要寻找的内容。精确的变量跟踪实际上并不存在,因为它经历了转换——变量信息偶尔会丢失。SROA 通行证目前特别糟糕。
也就是说,如果您正在寻找线路信息和类型信息,您应该没问题。参数应该是相当好的,所以你不会有太多的参数被传球“优化”出来。
至于如何注释您的源代码,最简单的事情是查看 clang 为 IR 和调试元数据发出的内容。确保使用 DIBuilder 类来处理大多数事情,并注意位置如何附加到 IR 级别指令。大部分代码都在 clang/lib/CodeGen/CGDebugInfo.cpp 中。
希望这会有所帮助,如果您有任何问题,请随时在 llvm-dev 或 cfe-dev 邮件列表中提问。
LLVM已经在 IR中支持类似 dwarf 的注释,在编译时,这些注释在二进制文件中生成为 dwarf 部分。所有优化都试图保留此信息,但并不总是保证。