如何查看llvm转换传递所做的更改

时间:2013-07-20 19:52:27

标签: llvm llvm-gcc llvm-clang llvm-3.0 llvm-ir

如何在c程序中查看转换过程所做的更改(如死代码消除)。如果我在终端上运行以下命令,则会创建一个.bc文件,通过它我可以看到IR。但是如何在c程序中看到-dce所做的更改。 命令:$ opt in.bc -o out.bc -dce

3 个答案:

答案 0 :(得分:2)

您无法看到在C代码中反映的IR中所做的更改 - 没有转换回来。(以前曾经是LLVM的C后端,但是(1)它不是更长的支持和(2)它只保留程序的语义,而不是它的形式。

可以做的是使用调试信息进行编译,并从LLVM端查询DCE之后的信息,以尝试推断传递如何影响您的源代码。

或者,如果能够直接对源代码进行转换很重要,那么你应该使用Clang的frontend actions之类的东西 - 但是你必须自己实现很多逻辑,并且你无法享受LLVM的优化传递。

答案 1 :(得分:1)

我认为你无法看到c程序的变化。

LLVM转换在LLVM IR上传递工作。因此,您可以生成与c程序对应的LLVM IR(.ll格式)。当您获得传递的.bc文件输出时,您可以将.bc文件转换为.ll格式。然后你可以比较两个.ll文件,你可以看到传递所做的更改(比如:dce)。

答案 2 :(得分:0)

如果您申请DCE并希望确定Pass所做的修改,我建议使用llvm-nm。 llvm-nm允许您查看bitcode文件中的符号,包括函数和数据对象。通过比较原始bitcode文件的llvm-nm输出和优化版本,您可以识别DCE Pass删除的功能