根据this SO post,已(正式)不再支持将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
当我检查我的选择版本时,它是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并复制opt
和llc
以具有3.7后缀之后:
$ cp opt opt-3.7
$ cp llc llc-3.7
使用以下行,编译到llvm不会出错:
$ ghc -keep-llvm-files main.hs
并创建一个名为main.ll的文件。
答案 0 :(得分:4)
是的,GHC需要LLVM的确切版本。 LLVM的内部结构变化非常快,因此GHC(就像许多其他针对或使用LLVM的工具一样)采用了非常保守的方法来对这些工具进行版本控制。