我正在尝试生成LLVM API代码,该代码可以重新生成输入其中的IR代码。正如我通过各种问题(如这个问题)发现的那样,在某个时候可以执行以下操作来实现这一目标:
clang++ -S -O0 -emit-llvm MyFile.cpp -o MyIR.ll
llc -march=cpp MyIR.ll -o MyIR_Maker.cpp
然而,我得到了以下错误:llc:错误:无效的目标"cpp"。进一步的研究告诉我,当在3.1版本中删除c后端时,LLVM的早期版本也出现了同样的问题。然而,我使用的是cpp,这让我相信,由于某种原因,cpp后端在我的llvm版本中不存在。
因此,我真正想知道的是:如果到目前为止我的分析是正确的,我如何启用cpp后端,或者以其他方式使我的llc达到可以按我想要的方式使用它的状态?当然,如果我错了,或者有其他方法,我会接受的
我们选择使用的版本是LLVM 3.6,它是通过brew在OS X上安装的。提前谢谢。
编辑:这个问题已经被指出可能是一个类似的问题。然而,这个问题是在LLVM 3.2的特定背景下提出的,因为我的问题涉及3.6版本中的当前情况,因为此时可能有一个真正的解决方案。这个问题的唯一答案指向一个通用的外部资源,并没有非常彻底地解释实际的解决方案是什么。
启用cpp后端的正确方法似乎是下载LLVM源代码并自行构建,以下是该过程的工作原理:
- 转到此页面并找到您想要使用的版本,下载标题为"LLVM源代码"的相应链接
- 提取文件
- 打开命令行
cd
到您刚刚提取的文件夹,它的格式应该是"llvm-x.x.src",其中x.x.x是您的版本号mkdir build
cd build
brew install cmake
(如果您还没有cmake)cmake -G Xcode ..
(这会生成一个可以构建LLVM的Xcode项目)open LLVM.xcodeproj
- 如果Xcode打开时出现提示,请单击"自动创建方案"
- 等待Xcode完成索引,这将需要一段时间
- 运行Xcode项目来编译LLVM,这也需要一段时间
- 完成此操作后,所有生成的llvm CLI工具都将位于"构建"文件夹中名为Debug/bin的目录中
- 将此文件夹放在您想要的位置,然后将其导出到您的路径
现在,假设您使用的是clang的适当版本,并且您的路径不包括一组不同的llvm二进制文件,那么您应该能够按照预期运行以下命令:
clang++ -S -O0 -emit-llvm MyFile.cpp -o MyIR.ll
llc -march=cpp MyIR.ll -o MyIR_Maker.cpp
如生成LLVM C++API代码作为后端所述,此功能(-march=cpp
)似乎已于2016年5月左右从LLVM中删除。