【发布时间】:2018-08-29 11:12:59
【问题描述】:
根据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
当我检查我的 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 并复制 opt 和 llc 以具有 3.7 后缀:
$ cp opt opt-3.7
$ cp llc llc-3.7
编译到 llvm 没有错误,使用这一行:
$ ghc -keep-llvm-files main.hs
并创建了一个名为 main.ll 的文件。
【问题讨论】:
-
这里 GHC 8.4.3 需要 LLVM 5.0。我猜每个 GHC 版本都想要自己的 LLVM,但我不确定。
-
是的,众所周知,LLVM IR 不稳定,没有正式的规范(但有合理的英文参考)。在为位码修补解析器时,我不得不大量查看 LLVM 的源代码以弄清问题。与人类可读的 LLVM IR 语法在版本之间看似毫无意义的旋转类似。