【发布时间】:2013-07-20 19:52:27
【问题描述】:
如何在 c 程序中查看转换传递(如死代码消除)所做的更改。就像我在终端上运行以下命令一样,它会创建一个 .bc 文件,通过该文件我可以看到 IR。但是如何在 c 程序中查看 -dce 所做的更改。 命令:$opt in.bc -o out.bc -dce
【问题讨论】:
标签: llvm llvm-gcc llvm-clang llvm-3.0 llvm-ir
如何在 c 程序中查看转换传递(如死代码消除)所做的更改。就像我在终端上运行以下命令一样,它会创建一个 .bc 文件,通过该文件我可以看到 IR。但是如何在 c 程序中查看 -dce 所做的更改。 命令:$opt in.bc -o out.bc -dce
【问题讨论】:
标签: llvm llvm-gcc llvm-clang llvm-3.0 llvm-ir
您看不到 IR 中所做的更改反映在您的 C 代码中 - 没有转换回来。 (曾经有一个用于 LLVM 的 C 后端,但是 (1) 它不是更长时间的支持,并且 (2) 它只保留程序的语义,而不是它的形式)。
您可以做的是使用调试信息进行编译,并在 DCE 之后从 LLVM 端查询该信息,以尝试推断通行证如何影响您的源代码。
或者,如果能够直接在源代码上进行转换对您很重要,您应该使用 Clang 的 frontend actions 之类的东西 - 但您必须自己在那里实现很多逻辑,而且您可以不享受 LLVM 的优化通道。
【讨论】:
我觉得你看不到c程序的变化。
LLVM 转换传递 LLVM IR 上的工作。这样就可以生成c程序对应的LLVM IR(.ll格式)了。当您获得 pass 的 .bc 文件输出时,您可以将 .bc 文件转换为 .ll 格式。然后可以对比两个.ll文件,可以看到pass所做的改动(如:dce)。
【讨论】:
如果您应用 DCE 通行证并想识别通行证所做的修改,我建议使用 llvm-nm。 llvm-nm 允许您查看位码文件中的符号,包括函数和数据对象。通过比较原始 bitcode 文件的 llvm-nm 输出和优化版本,您可以识别出被 DCE Pass 删除的函数
【讨论】: