如何在当前版本中通过IR代码生成LLVM api代码



我正在尝试生成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中删除。

最新更新