我尝试使用以下命令从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代码?
答案 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 question和this 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 notes和this 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重新启用了它。