将Haskell程序编译为LLVM IR

4
根据这篇SO文章,Haskell程序编译成C的方式不再被官方支持。因此,我想尝试将Haskell程序编译成LLVM IR。我选择了与提到的文章相同的程序:
quicksort [] = []
quicksort (p:xs) = (quicksort lesser) ++ [p] ++ (quicksort greater)
  where
    lesser  = filter (<  p) xs
    greater = filter (>= p) xs

main = print(quicksort([5,2,1,0,8,3]))

然后尝试使用以下命令将其编译为LLVM IR:

$ ghc -fllvm main.hs

然后我遇到了有关LLVM版本的错误:

<no location info>: error:
    Warning: Couldn't figure out LLVM version!
             Make sure you have installed LLVM 3.7
ghc: could not execute: opt-3.7

当我检查我的opt版本时,它是3.8.0,比较大:

$ opt --version
LLVM (http://llvm.org/):
  LLVM version 3.8.0
  DEBUG build with assertions.
  Built Jun 20 2018 (14:59:34).
  Default target: x86_64-unknown-linux-gnu
  Host CPU: broadwell

发生了什么? GHC 是否只能期望版本 3.7.0,而不能使用其他版本?!

编辑:

安装 LLVM 3.7.0 并将 optllc 复制为带有 3.7 后缀的文件。

$ cp opt opt-3.7
$ cp llc llc-3.7

使用以下命令进行编译为LLVM时没有出现错误:

$ ghc -keep-llvm-files main.hs

并创建了一个名为main.ll的文件。


1
这里 GHC 8.4.3 需要 LLVM 5.0。我猜每个 GHC 版本都需要自己的 LLVM,但我不确定。 - chi
2
LLVM IR以其没有正式规范(但有一个合理的英文参考)而闻名不稳定。当修补位代码的解析器时,我不得不查看LLVM的源代码以获得问题的清晰度。同样,在版本之间似乎毫无意义的人类可读的LLVM IR语法调整方面也是如此。 - Thomas M. DuBuisson
1个回答

4

是的,GHC需要精确版本的LLVM。LLVM内部变化非常快,因此GHC(像许多其他针对或使用LLVM的工具一样)在这些工具的版本控制方面采取非常保守的方法。


安装了 llvm-3.7.0 后,我编辑了我的问题,现在可以编译而没有错误了......但如果真的创建了 llvm IR 文件,我找不到它... - OrenIshShalom
@OrenIshShalom 请参考详细手册 - Daniel Wagner
太好了,它可以工作!我保证这是最后一个问题:我编辑了问题,尝试运行生成的*.bc文件(使用*.ll中的llvm-as),但它缺少原始Haskell版本中存在的主函数...你有任何想法它去哪里了吗? - OrenIshShalom
1
@OrenIshShalom 不知道,我以前从未玩过LLVM,信不信由你。 你可能想用细节打开一个新问题。 顺便说一句,你现在做的两次(编辑问题以更改你要问什么)通常在SO上被 frowned 掉:编辑以澄清您的问题是可以的,但如果您根据所学内容提出新问题,则应将这些问题放在一个新的问题中。 - Daniel Wagner
完全删除第二个编辑,并保留第一个指示确切命令行的编辑,该命令行是有效的。 - OrenIshShalom

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