背景:我写了一个玩具Lisp解释器,我正在尝试添加LLVM JIT功能。目前,已经施加了以下限制:
鉴于:
compile :: [Value] -- List of Formal Parameters
-> [Value] -- Body of function
-> CodeGenModule(Function a)`
问题:如何生成参数个数等于形式参数列表长度的函数?
答案 0 :(得分:6)
我不知道是否有可能只使用来自LLVM.Core
的EDSL(这些类型确实非常多毛),但是如果你看LLVM.FFI.Core
,你会发现较低的manipulating LLVM function types和creating LLVM functions的级别功能。这导致了以下行动计划:
TypeRef
为您的函数创建functionType
。addFunction
将此功能添加到您的模块。appendBasicBlock
/ insertBasicBlock
使用基本块填充它。使用getParam
引用基本块内的函数参数。应该可以利用漂亮的monadic EDSL语法来构造基本块。另外,查看LLVM.Core.Util
,它包含一些用于处理FFI层的辅助函数。