【问题标题】:llvm ir back to human-readable source language?llvm ir 回到人类可读的源语言?
【发布时间】:2011-07-08 01:04:29
【问题描述】:

有没有从 llvm ir 到工作源代码的简单方法?

具体来说,我想从一些简单的 C++ 代码开始,这些代码仅修改 POD(主要是 int、float 等数组),将其转换为 llvm ir,对其执行一些简单的分析和翻译,然后将其转换回来转换成 C++ 代码?

它并不介意任何名称被破坏,我只是希望能够在进行与机器相关的优化之前对源代码进行破解。

【问题讨论】:

  • LLVM 程序集相对易读,前提是您熟悉底层细节。您可以指示 llc 输出 C 代码 (-march=c) - 但是,结果不会很漂亮。

标签: c++ programming-languages llvm clang


【解决方案1】:

CppBackend 已被移除。自 2016 年 5 月 5 日 r268631 以来,我们没有 -march=cpp 和 -march=c 选项。

【讨论】:

【解决方案2】:

实际上有很多选项。您可能会感兴趣的 2 个是 -march=c-march=cpp,它们是 llc 的选项。

运行:

llc -march=c -o code.c code.ll

这会将code.ll 中的LLVM 位码转换回C 并放入code.c

还有:

llc -march=cpp -o code.cpp code.ll

这与 C 输出引擎不同。它实际上会写出可以运行以重建 IR 的 C++ 代码。我使用这个人将 LLVM IR 嵌入到程序中,而无需处理解析位码文件或任何事情。

-march=cpp 有更多选项,您可以使用llc --help 查看,例如-cppgen=,它控制输出 C++ 重构的 IR 量。

【讨论】:

  • 在我自己(最近 - 即 4.0)构建的 LLVM 中,llc --version 列出了大约 30 个目标,但不包括 C 和 C++。我尝试使用 Ubuntu 的 apt-get 安装较旧的 LLVM (3.8),发现它确实包含 C++ 后端,但不包含 C 后端。 “使用 CMake 构建 LLVM”页面 (llvm.org/docs/CMake.html) 指示默认构建所有目标。最近是否删除了 C 和 C++ 目标?
  • 同样,4.0 SVN 构建缺少 c 和 cpp 后端
  • @aerkenemesis:对 C 和 C++ 后端的官方支持已被删除,因为它们落后并且对维护它们没有足够的兴趣,因此不再可能使用此选项:请参阅 releases.llvm.org/3.1/docs/ReleaseNotes.html#changes 。与此同时,Julia 团队在github.com/JuliaComputing/llvm-cbe 维护自己的非官方 C 后端。
【解决方案3】:

这里有一个问题...可能无法轻松地将 IR 表示回语言。

我的意思是,您可能能够获得 一些 表示,但它可能较少 可读。

问题在于 IR 不关心高级语义,没有它......

我宁愿建议您学习阅读 IR。我可以毫不费力地阅读它,而且我远非 llvm 专家。

否则,您可以从 IR 中编写 C 代码。它不会与您的 C++ 代码更相似,但如果没有 ssa 和 phi 节点,您可能会感觉更好。

【讨论】:

猜你喜欢
  • 2015-08-21
  • 1970-01-01
  • 1970-01-01
  • 2012-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-18
相关资源
最近更新 更多