使用LLVM链接器生成C代码

5

我尝试使用以下命令从由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)的机器上尝试了这些命令。

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

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

3个回答

6

5

很不幸,在Ubuntu系统上发出LLVM位代码可能会有些痛苦,因为它们将DragonEgg作为默认前端 - 请参见this questionthis bugreport

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

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

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

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

话虽如此,C后端在LLVM 3.1中已被删除(请参见发行说明此问题)。从llc -version的输出中可以看出,它没有列出,并且在我的Ubuntu 14.04系统上尝试使用它会导致以下错误:

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

2

正如手册页面所述:

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

它不会将目标文件进行逆向工程处理,以产生一个C文件(这正是您想要实现的),但这对我来说没有多大意义。

要了解支持哪些体系结构(大致指支持哪些CPU),您可以使用以下命令:

 llc -version

(您会注意到,“C”不是一种架构。)

如果您尝试将一段C++代码重写为C,最好的选择是手动完成。您需要在C中重新编写所有C++特定的内容(如类、异常、模板等),这需要根据您的C++代码的复杂程度而花费更多或更少的时间。


3
OP希望将LLVM IR位码转换为C语言(请注意-emit-llvm选项,该选项应该生成位码而不是目标文件)。在早期版本中支持这一功能(例如,请参阅此FAQ),但C后端已在3.1版中删除(请参阅发布说明)。 - mjturner

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接