在编译时未知参数的数量时,在LLVM(haskell绑定)中添加函数

Joh*_*ler 7 compiler-construction haskell language-design llvm

背景:我写了一个玩具Lisp解释器,我试图添加LLVM JIT功能.目前,已施加以下限制:

  • 函数中只允许整数值
  • 变量可能只引用形式参数

鉴于:

compile :: [Value] -- List of Formal Parameters
        -> [Value] -- Body of function
        -> CodeGenModule(Function a)`
Run Code Online (Sandbox Code Playgroud)

问题:如何生成一个函数,其中参数的数量等于形式参数列表的长度?

Mik*_*kov 6

我不知道是否可以仅使用EDSL来实现这一点LLVM.Core(类型确实非常多毛)但是如果你看一下LLVM.FFI.Core,你会发现用于操作LLVM函数类型创建LLVM函数的低级功能.这导致了以下行动计划:

  • TypeRef你的功能创建一个functionType.
  • 使用将此功能添加到模块中addFunction.
  • 使用appendBasicBlock/ 使用基本块填充它insertBasicBlock.使用getParam引用您的基本块内部函数的参数.

应该可以利用漂亮的monadic EDSL语法来构造基本块.另外,看一下LLVM.Core.Util,它包含一些用于处理FFI层的辅助函数.