将 Haskell 个程序编译为 LLVM IR
Compile Haskell programs to LLVM IR
根据 ,不再(官方)支持将 Haskell 程序编译为 C。所以我想探索将 Haskell 程序编译为 LLVM IR 的选项。我选择了上述 post:
相同的程序
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 需要一个确切版本的 LLVM。 LLVM 内部变化非常快,因此 GHC(与许多其他以 LLVM 为目标或使用 LLVM 的工具一样)对这些工具的版本控制采取非常保守的方法。
根据
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 需要一个确切版本的 LLVM。 LLVM 内部变化非常快,因此 GHC(与许多其他以 LLVM 为目标或使用 LLVM 的工具一样)对这些工具的版本控制采取非常保守的方法。