【问题标题】:Compile Haskell programs to LLVM IR将 Haskell 程序编译为 LLVM IR
【发布时间】: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 并复制 optllc 以具有 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 语法在版本之间看似毫无意义的旋转类似。

标签: haskell llvm-ir


【解决方案1】:

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

【讨论】:

  • 我在安装 llvm-3.7.0 后编辑了我的问题,现在编译没有错误......但如果确实创建了一个,我找不到生成的 llvm IR 文件......跨度>
  • @OrenIshShalom 见the fine manual
  • 很好用!我保证的最后一个问题:我再次编辑了问题以尝试运行生成的 *.bc 文件(使用来自 *.ll 的 llvm-as),但它错过了原始 Haskell 版本中的主要功能......任何想法它去哪儿了?
  • @OrenIshShalom Dunno,我以前从未使用过 LLVM,信不信由你。可能想用细节提出一个新问题。顺便说一句,您现在在这里所做的两次(编辑您的问题以更改您的要求)通常在 SO 上不受欢迎:澄清您的问题的编辑很好,但如果您因此提出新问题在你学到的东西中,这些应该放在一个新的问题中。
  • 完全删除了第二个 EDIT,并保留第一个 EDIT 指示确实有效的命令行。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-27
  • 1970-01-01
  • 2014-09-03
  • 2018-06-20
  • 2014-07-15
  • 2020-07-26
相关资源
最近更新 更多