【问题标题】:How to see the changes made by llvm transformation passes如何查看 llvm 转换过程所做的更改
【发布时间】: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


    【解决方案1】:

    您看不到 IR 中所做的更改反映在您的 C 代码中 - 没有转换回来。 (曾经有一个用于 LLVM 的 C 后端,但是 (1) 它不是更长时间的支持,并且 (2) 它只保留程序的语义,而不是它的形式)。

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

    或者,如果能够直接在源代码上进行转换对您很重要,您应该使用 Clang 的 frontend actions 之类的东西 - 但您必须自己在那里实现很多逻辑,而且您可以不享受 LLVM 的优化通道。

    【讨论】:

    • 我想制作一个样本传递来提取循环信息,如循环感应变量名称它们的边界。那么应该如何开始编写通行证,因为循环中有很多文件,如 LoopPass、LoopInfo、LoopExtractor 等,我只是想知道如何使用哪个函数或哪个文件对我有用。我已经浏览过这个链接:llvm.org/docs/…
    • @user2167322 为了获得最佳结果,请在 stackoverflow 上提出一个新问题,看看是否有人可以帮助您。
    【解决方案2】:

    我觉得你看不到c程序的变化。

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

    【讨论】:

      【解决方案3】:

      如果您应用 DCE 通行证并想识别通行证所做的修改,我建议使用 llvm-nm。 llvm-nm 允许您查看位码文件中的符号,包括函数和数据对象。通过比较原始 bitcode 文件的 llvm-nm 输出和优化版本,您可以识别出被 DCE Pass 删除的函数

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-23
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多