diff --git a/src/cmd/compile/internal/gc/gsubr.go b/src/cmd/compile/internal/gc/gsubr.go index f3ef14c99b..aa498a0097 100644 --- a/src/cmd/compile/internal/gc/gsubr.go +++ b/src/cmd/compile/internal/gc/gsubr.go @@ -265,20 +265,21 @@ func makeABIWrapper(f *ir.Func, wrapperABI obj.ABI) { // to allocate any stack space). Doing this will require some // extra work in typecheck/walk/ssa, might want to add a new node // OTAILCALL or something to this effect. - var call ir.Node + var tail ir.Node if tfn.Type().NumResults() == 0 && tfn.Type().NumParams() == 0 && tfn.Type().NumRecvs() == 0 { - call = nodSym(ir.ORETJMP, nil, f.Nname.Sym()) + tail = nodSym(ir.ORETJMP, nil, f.Nname.Sym()) } else { - call = ir.Nod(ir.OCALL, f.Nname, nil) + call := ir.Nod(ir.OCALL, f.Nname, nil) call.PtrList().Set(paramNnames(tfn.Type())) call.SetIsDDD(tfn.Type().IsVariadic()) + tail = call if tfn.Type().NumResults() > 0 { n := ir.Nod(ir.ORETURN, nil, nil) n.PtrList().Set1(call) - call = n + tail = n } } - fn.PtrBody().Append(call) + fn.PtrBody().Append(tail) funcbody() if base.Debug.DclStack != 0 { diff --git a/src/cmd/compile/internal/gc/ssa.go b/src/cmd/compile/internal/gc/ssa.go index 1fc1feae67..cc5f9eeea6 100644 --- a/src/cmd/compile/internal/gc/ssa.go +++ b/src/cmd/compile/internal/gc/ssa.go @@ -7332,18 +7332,20 @@ func callTargetLSym(callee *types.Sym, callerLSym *obj.LSym) *obj.LSym { if ir.AsNode(callee.Def) == nil { return lsym } - ndclfunc := ir.AsNode(callee.Def).Name().Defn - if ndclfunc == nil { + defn := ir.AsNode(callee.Def).Name().Defn + if defn == nil { return lsym } + ndclfunc := defn.(*ir.Func) + // check for case 1 above if callerLSym.ABIWrapper() { - if nlsym := ndclfunc.Func().LSym; nlsym != nil { + if nlsym := ndclfunc.LSym; nlsym != nil { lsym = nlsym } } else { // check for case 2 above - nam := ndclfunc.Func().Nname + nam := ndclfunc.Nname defABI, hasDefABI := symabiDefs[nam.Sym().LinksymName()] if hasDefABI && defABI == obj.ABI0 { lsym = nam.Sym().LinksymABI0()