如何运行从Haskell源代码生成的LLVM位代码

如何运行从Haskell源代码生成的LLVM位代码,haskell,llvm,bitcode,Haskell,Llvm,Bitcode,我正在尝试运行从Haskell源代码生成的LLVM位代码,而不是在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_w

我正在尝试运行从Haskell源代码生成的LLVM位代码,而不是在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设置似乎没有问题。
如何解决这个问题?

我认为以这种方式生成的LLVM代码假定GHC运行时系统(RTS)已正确初始化,提供了GC数据结构、线程和许多基本操作。此外,GHC LLVM函数使用自定义调用约定
cc 10
,这与标准的C约定不同。要实际运行LLVM代码,您必须提供RTS,可能需要将其链接到(我不知道具体如何),并对Haskell代码进行适当的调用。