| //===- call.go - IR generation for calls ----------------------------------===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This file implements IR generation for calls. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| package irgen |
| |
| import ( |
| "llvm.org/llgo/third_party/gotools/go/types" |
| "llvm.org/llvm/bindings/go/llvm" |
| ) |
| |
| // createCall emits the code for a function call, |
| // taking into account receivers, and panic/defer. |
| func (fr *frame) createCall(fn *govalue, chain llvm.Value, argValues []*govalue) []*govalue { |
| fntyp := fn.Type().Underlying().(*types.Signature) |
| typinfo := fr.types.getSignatureInfo(fntyp) |
| |
| args := make([]llvm.Value, len(argValues)) |
| for i, arg := range argValues { |
| args[i] = arg.value |
| } |
| var results []llvm.Value |
| if fr.unwindBlock.IsNil() { |
| results = typinfo.call(fr.types.ctx, fr.allocaBuilder, fr.builder, fn.value, chain, args) |
| } else { |
| contbb := llvm.AddBasicBlock(fr.function, "") |
| results = typinfo.invoke(fr.types.ctx, fr.allocaBuilder, fr.builder, fn.value, chain, args, contbb, fr.unwindBlock) |
| } |
| |
| resultValues := make([]*govalue, len(results)) |
| for i, res := range results { |
| resultValues[i] = newValue(res, fntyp.Results().At(i).Type()) |
| } |
| return resultValues |
| } |