[LLVMdev] Implementing closures and continuations

David Farler accumulator at icloud.com
Sat Jun 29 19:51:38 PDT 2013


Hi all,

In getting to know the LLVM infrastructure, I'm having a hard time finding implementation details for closures and continuations. 

For closures, I've read comments such as "using a struct" as an environment to hold references to free variables, linked lists to dictionaries for various scope levels, and even things like "it's just like virtual methods". I have a couple of questions regarding codegen, especially in the context of a Lispy/Haskell-like language with automatic reference counting of immutable objects allocated on the heap. 

What needs to be added to Functions during code generation? Is it a really just a struct only holding offsets to free variables? Or do symbols need to be looked up a kind of scope chain at runtime?

Does adding a JIT complicate codegen of closures in terms of symbol lookup in the bundled environment?

Any recommendations for treating functions with no free variables vs closures?

Does implementing continuations greatly affect implementations of closures? I assume the stack would need to be heap-allocated explicitly, which might affect how pointers would be saved in a bundled environment.

Perhaps, as a simple example, what might this look like in terms of IR?

(define addN
    (fn [n]
        (fn [m]
            (+ n m))))

Regards,
David



More information about the llvm-dev mailing list