绑定FFI和DSL
在Haskell LLVM绑定中 ,我试图用可变数量的参数定义一个函数(实际上我是指在编译时不知道的常量)。 我发现这个问题 ,我正在试着回答。
我不想完全回退使用FFI来生成LLVM,我想尽可能多地使用DSL,并使用FFI来做我不能通过DSL做的事情。
我设法通过functionType定义一个types,我仍然无法添加一个函数调用defineModule
创build一个模块。 我也认为下一步是通过FFI.appendBasicBlock
来添加基本块,我认为这很容易,但是我怎样通过CodeGenFunction
monad中的do块内的CodeGenFunction
获取参数。
如果参数列表的大小在运行时是不知道的,则需要将该函数转换为列表上的某个操作。 请注意,(IORef [Word32])types意味着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 ra) -> CodeGenFunction ra arrayLoop len ptr start loopBody = do
它增加一个指向int列表的指针p,并在每个“body”块的调用中递减余下的长度i。 该块反复调用“loopBody”并将结果存储在vars中,该variables最终在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编译 – 任何人都知道这是怎么回事?