Компилировать программы на Haskell в LLVM IR

Согласно этой 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 и копирования opt а также llc иметь 3,7 суффикса:

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

компиляция в llvm идет без ошибок, используя эту строку:

$ ghc -keep-llvm-files main.hs

и файл с именем main.ll создан.

1 ответ

Решение

Да, GHC ожидает точную версию LLVM. Внутренние компоненты LLVM меняются очень быстро, и поэтому GHC (как и многие другие инструменты, предназначенные или использующие LLVM) использует очень консервативный подход к управлению версиями этих инструментов.

Другие вопросы по тегам