llvm ir回到人类可读的源语言?

Dan*_*Dan 16 c++ programming-languages llvm clang

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

具体来说,我想从一些简单的C++代码开始,它只修改POD(主要是整数,浮点数等),将其转换为llvm ir,对其执行一些简单的分析和转换,然后将其转换回C++代码?

它并不介意任何名称被破坏,我只是希望能够在进行依赖于机器的优化之前对源进行破解.

小智 31

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

跑:

llc -march=c -o code.c code.ll
Run Code Online (Sandbox Code Playgroud)

这会将LLVM bitcode转换code.ll回C并将其放入code.c.

也:

llc -march=cpp -o code.cpp code.ll
Run Code Online (Sandbox Code Playgroud)

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

-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++目标? (3认同)
  • @aerkenemesis:对 C 和 C++ 后端的官方支持已被删除,因为它们落后并且没有足够的兴趣维护它们,因此此选项不再可能:请参阅 http://releases.llvm.org/3.1/docs /ReleaseNotes.html#changes 。与此同时,Julia 团队在 https://github.com/JuliaComputing/llvm-cbe 维护自己的非官方 C 后端。 (2认同)

小智 15

CppBackend被删除了.自2016-05-05,r268631以来,我们没有-march = cpp和-march = c选项.

  • 更多信息,例如原因或实际的弃用通知? (6认同)
  • http://releases.llvm.org/3.1/docs/ReleaseNotes.html#changes"C后端已被删除.它有很多问题,无法编译任何重要的程序." (3认同)

Mat*_* M. 8

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

我的意思是,你可能会得到一些表示,但它可能不太可读.

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

我宁愿建议你学习阅读IR.我可以毫不费力地阅读它,我远不是一个专家.

否则,你可以从IR获得C代码.它与你的C++代码没有太大的相似之处,但如果没有ssa和phi节点,你可能会感觉更好.