blob: 4ed3ab745bb1d931de8c692b389125af178d7229 [file] [log] [blame]
Peter Collingbournead9841e2014-11-27 00:06:42 +00001//===- closures.go - IR generation for closures ---------------------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements IR generation for closures.
11//
12//===----------------------------------------------------------------------===//
13
14package irgen
15
16import (
17 "llvm.org/llgo/third_party/go.tools/go/types"
18)
19
20// makeClosure creates a closure from a function pointer and
21// a set of bindings. The bindings are addresses of captured
22// variables.
23func (fr *frame) makeClosure(fn *govalue, bindings []*govalue) *govalue {
24 govalues := append([]*govalue{fn}, bindings...)
25 fields := make([]*types.Var, len(govalues))
26 for i, v := range govalues {
27 field := types.NewField(0, nil, "_", v.Type(), false)
28 fields[i] = field
29 }
30 block := fr.createTypeMalloc(types.NewStruct(fields, nil))
31 for i, v := range govalues {
32 addressPtr := fr.builder.CreateStructGEP(block, i, "")
33 fr.builder.CreateStore(v.value, addressPtr)
34 }
35 closure := fr.builder.CreateBitCast(block, fn.value.Type(), "")
36 return newValue(closure, fn.Type())
37}