func (ri *directRetInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, vals []llvm.Value) { if len(ri.retTypes) == 0 { builder.CreateRetVoid() return } var val llvm.Value switch ri.numResults { case 1: val = vals[0] default: val = llvm.Undef(ri.resultsType) for i, v := range vals { val = builder.CreateInsertValue(val, v, i, "") } } args := make([]llvm.Value, len(ri.retTypes)) directEncode(ctx, allocaBuilder, builder, ri.retTypes, args, val) var retval llvm.Value switch len(ri.retTypes) { case 1: retval = args[0] default: retval = llvm.Undef(ctx.StructType(ri.retTypes, false)) for i, a := range args { retval = builder.CreateInsertValue(retval, a, i, "") } } builder.CreateRet(retval) }
func (ri *indirectRetInfo) encode(ctx llvm.Context, allocaBuilder llvm.Builder, builder llvm.Builder, vals []llvm.Value) { fn := builder.GetInsertBlock().Parent() sretSlot := fn.Param(0) if ri.numResults == 1 { builder.CreateStore(vals[0], sretSlot) } else { for i, v := range vals { builder.CreateStore(v, builder.CreateStructGEP(sretSlot, i, "")) } } builder.CreateRetVoid() }