Как запустить битовый код LLVM, сгенерированный из исходного кода Haskell

Я пытаюсь запустить битовый код LLVM, сгенерированный из исходного кода Haskell, вместо того, чтобы компилировать код в собственный двоичный файл на macOS.

У меня есть следующий файл:

$ cat hello_world.hs
main =
  putStrLn "Hello world!"

И я использую следующие шаги для создания файла .bc:

$ brew install stack
$ brew install llvm@6

$ stack ghc -- -keep-llvm-files hello_world.hs
$ clang -c -emit-llvm hello_world.ll -o hello_world.bc

Когда я сейчас пытаюсь запустить его, я получаю следующую ошибку:

$ lli hello_world.bc
'main' function not found in module.

Когда я устанавливаю -fllvm для компиляции в собственный двоичный файл через LLVM, все работает, так что это не проблема с моей настройкой LLVM. Как это можно исправить?


person adius    schedule 27.05.2019    source источник
comment
Я думаю, что сгенерированный таким образом код LLVM предполагает, что система времени выполнения GHC (RTS) была правильно инициализирована, предоставляя структуры данных GC, потоки и множество примитивных операций. Кроме того, функция GHC LLVM использует пользовательское соглашение о вызовах cc 10, которое отличается от стандартного C. Чтобы на самом деле запустить этот код LLVM, вы должны предоставить RTS, возможно, связать его (я точно не знаю, как именно) и сделать подходящий вызов вашего кода Haskell.   -  person chi    schedule 27.05.2019