使用 LLVM 链接器生成 C 代码

edi*_*ion 5 c c++ linker llvm

我尝试llvm-g++使用以下命令从编译的 C++ 代码生成 C 代码:

llvm-g++ -emit-llvm -c ./example.cpp -o example.o
llc -march=c example.o
Run Code Online (Sandbox Code Playgroud)

我在运行Ubuntu (Linux 3.16.0-45-generic).

但是,LLVM 静态链接器并没有将 C 代码写入标准输出,而是报告编译后的文件无效:error: expected top-level entity.

如何使用 LLVM 链接器生成 C 代码?

mjt*_*ner 5

不幸的是,在 Ubuntu 系统上发出 LLVM 位代码可能有点痛苦,因为它们将 DragonEgg 作为默认前端发送 - 请参阅此问题此错误报告

如果您file example.o对上面生成的文件执行 a操作,您会发现它实际上不是 LLVM IR 位码(它解释了错误):

$ file example.o
example.o: ELF 64-bit LSB  relocatable, x86-64, version 1 (SYSV), not stripped
Run Code Online (Sandbox Code Playgroud)

在 Ubuntu 系统上获取 LLVM IR 位码的最简单方法是使用 clang:

$ clang -emit-llvm -c example.cpp -o example.o
$ file example.o
example.o: LLVM IR bitcode
Run Code Online (Sandbox Code Playgroud)

也就是说,在 LLVM 3.1 中删除了 C 后端(请参阅发行说明这个问题)。正如您从llc -version它的输出中看到的那样,它未列出,尝试使用它在我的 Ubuntu 14.04 系统上出现以下错误:

llc-3.4: error: invalid target 'c'.
Run Code Online (Sandbox Code Playgroud)


Alb*_*ert 5

最初的 C 后端 (llvm-cbe) 在 3.1(发行说明)中被删除,但是有这个 Julia 项目,复活了 LLVM“C 后端”,并进行了改进,使其复活。