绑定FFI和DSL

时间:2012-01-26 13:02:09

标签: haskell llvm

在Haskell LLVM bindings中,我试图定义一个带有可变数量参数的函数(实际上我的意思是在编译时不知道的常数)。我找到了this question,我正在尝试按照答案。

我不想完全退回使用FFI来生成LLVM,我想尽可能多地使用DSL并使用FFI来做我不能通过DSL做的事情。

我设法通过functionType定义一个类型,我仍然无法将函数添加到通过调用defineModule创建的模块中。我还认为下一步是通过FFI.appendBasicBlock将基本块添加到函数中,我认为这很简单,但是如何通过FFI.getParamCodeGenFunction中获取参数{{1}} 1}} monad。

1 个答案:

答案 0 :(得分:2)

如果参数列表的大小在运行时尚未知道,则无论如何都需要将该函数转换为列表上运行的函数。请注意,(IORef [Word32])类型意味着IO操作将在程序执行期间读/写(可变)Word32列表。 Haskell程序只需说如何来改变/读/写列表 - 因此IO()monad。

您引用的LLVM git项目中有一个examples / List.hs文件。它构造了一个LLVM程序集例程“arrayLoop”,

arrayLoop ::
   (Phi a, IsType b,
    Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) =>
   Value i -> Value (Ptr b) -> a ->
   (Value (Ptr b) -> a -> CodeGenFunction r a) ->
   CodeGenFunction r a
arrayLoop len ptr start loopBody = do

增加指向int的列表的指针p,并在每次调用'body'块时减少剩余的长度i。该块反复调用'loopBody'并将结果存储在'vars'中,最终在mList函数内返回(未触及零)到's':

mList ::
   CodeGenModule (Function
      (StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32))
mList =
   createFunction ExternalLinkage $ \ ref size ptr -> do
     next <- staticFunction nelem
     let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32)
     s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do
       flip store ptri =<< call next ref
       return y
     ret (s :: Value Int32)

关于nelem / NextListElement的所有额外内容在他们的示例中用于'loopBody',它将列表向左移动一次。该回购还提到了一个邮件列表:haskell-llvm@projects.haskellorg。

GHC7可以使用LLVM编译,但我想这对Haskell程序解释一种语言没有帮助,除非GHC也进行JIT编译 - 任何人都知道是否是这种情况?