使用LLVM链接器生成C代码

时间:2015-08-12 08:48:04

标签: c++ c linker llvm

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

llvm-g++ -emit-llvm -c ./example.cpp -o example.o
llc -march=c example.o

我在运行Ubuntu (Linux 3.16.0-45-generic)的计算机上尝试了这些命令。

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

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

3 个答案:

答案 0 :(得分:3)

正如手册页所示:

The llc command compiles LLVM source inputs
into assembly language for a specified architecture.

它不会对目标文件进行反向工程以生成C文件(这是您要实现的目标),这对我来说毫无意义。

要知道您可以使用哪种架构(大致意味着哪种CPU):

 llc -version

(您会注意到' C'不是架构)。

如果您尝试将一段C ++代码重写为C,那么最好的办法就是手动执行。您需要在C中重写所有C ++特定的东西(类,异常,模板......),这将根据C ++代码的复杂性花费更多或更少的时间。

答案 1 :(得分:3)

不幸的是,在Ubuntu系统上发出LLVM bitcode可能会有点痛苦,因为他们将DragonEgg作为默认前端发送 - 请参阅this questionthis bugreport

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

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

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

$ clang -emit-llvm -c example.cpp -o example.o
$ file example.o
example.o: LLVM IR bitcode

也就是说,在LLVM 3.1中删除了C后端(参见release notesthis question)。从llc -version的输出可以看出它没有列出并尝试使用它在我的Ubuntu 14.04系统上出现以下错误:

llc-3.4: error: invalid target 'c'.

答案 2 :(得分:0)

原始的C后端(llvm-cbe)已在3.1(release notes)中删除,但是有一个Jula项目resurrected LLVM "C Backend", with improvements重新启用了它。